diff --git a/.github/workflows/production-build.yml b/.github/workflows/production-build.yml index bca8134b..19949496 100644 --- a/.github/workflows/production-build.yml +++ b/.github/workflows/production-build.yml @@ -10,9 +10,6 @@ env: IMAGE_NAME: coollabsio/coolify-docs VITE_ANALYTICS_DOMAIN: coolify.io/docs VITE_SITE_URL: https://coolify.io/docs/ - VITE_KORREKTLY_API_TOKEN: ${{ secrets.VITE_KORREKTLY_API_TOKEN }} - VITE_KORREKTLY_BASE_URL: ${{ secrets.VITE_KORREKTLY_BASE_URL }} - VITE_KORREKTLY_DATASET_ID: ${{ secrets.VITE_KORREKTLY_DATASET_ID }} jobs: build-push: @@ -53,9 +50,6 @@ jobs: build-args: | VITE_ANALYTICS_DOMAIN=${{ env.VITE_ANALYTICS_DOMAIN }} VITE_SITE_URL=${{ env.VITE_SITE_URL }} - VITE_KORREKTLY_API_TOKEN=${{ env.VITE_KORREKTLY_API_TOKEN }} - VITE_KORREKTLY_BASE_URL=${{ env.VITE_KORREKTLY_BASE_URL }} - VITE_KORREKTLY_DATASET_ID=${{ env.VITE_KORREKTLY_DATASET_ID }} push: true tags: | ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest-${{ matrix.arch }} diff --git a/.github/workflows/staging-build.yml b/.github/workflows/staging-build.yml index 1d39c87d..2c72a89f 100644 --- a/.github/workflows/staging-build.yml +++ b/.github/workflows/staging-build.yml @@ -10,9 +10,6 @@ env: IMAGE_NAME: coollabsio/coolify-docs VITE_ANALYTICS_DOMAIN: next.coolify.io/docs VITE_SITE_URL: https://next.coolify.io/docs/ - VITE_KORREKTLY_API_TOKEN: ${{ secrets.VITE_KORREKTLY_API_TOKEN }} - VITE_KORREKTLY_BASE_URL: ${{ secrets.VITE_KORREKTLY_BASE_URL }} - VITE_KORREKTLY_DATASET_ID: ${{ secrets.VITE_KORREKTLY_DATASET_ID }} jobs: build-push: @@ -53,9 +50,6 @@ jobs: build-args: | VITE_ANALYTICS_DOMAIN=${{ env.VITE_ANALYTICS_DOMAIN }} VITE_SITE_URL=${{ env.VITE_SITE_URL }} - VITE_KORREKTLY_API_TOKEN=${{ env.VITE_KORREKTLY_API_TOKEN }} - VITE_KORREKTLY_BASE_URL=${{ env.VITE_KORREKTLY_BASE_URL }} - VITE_KORREKTLY_DATASET_ID=${{ env.VITE_KORREKTLY_DATASET_ID }} push: true tags: | ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:next-${{ matrix.arch }} diff --git a/.github/workflows/update-korrektly.yml b/.github/workflows/update-korrektly.yml deleted file mode 100644 index 05ee19db..00000000 --- a/.github/workflows/update-korrektly.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Update Korrektly - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref }} - cancel-in-progress: true - -on: - push: - branches: - - v4.x - -jobs: - run: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Update Korrektly Chunks - env: - KORREKTLY_BASE_URL: ${{ secrets.KORREKTLY_BASE_URL }} - KORREKTLY_API_TOKEN: ${{ secrets.KORREKTLY_API_TOKEN }} - KORREKTLY_DATASET_ID: ${{ secrets.KORREKTLY_DATASET_ID }} - NODE_OPTIONS: --max-old-space-size=8192 - run: bunx @korrektly/vitepress --path . -r https://coolify.io -a docs/api-reference/api/operations diff --git a/.gitignore b/.gitignore index 179747c9..b8990a88 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ .vite_opt_cache .vscode dist +.output +.source +.tanstack cache temp examples-temp @@ -21,4 +24,4 @@ TODOs.md package-lock.json -ui-sample \ No newline at end of file +ui-sample diff --git a/CLAUDE.md b/CLAUDE.md index 0020d1f9..4404baf0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,248 +4,133 @@ This file provides guidance to Claude Code when working with this repository. ## Project Overview -This is the official documentation repository for Coolify, an open-source self-hosting platform. The documentation is built using VitePress and deployed at https://coolify.io/docs. +This is the official documentation repository for Coolify, an open-source self-hosting platform. The documentation is built with Fumadocs MDX, TanStack Start, React, Vite, and Bun, and is deployed at https://coolify.io/docs. -The source code of Coolify itself can be found at https://github.com/coollabsio/coolify for reference and testing purposes. +The Coolify application source can be found at https://github.com/coollabsio/coolify for reference and testing. ## Branch Strategy -- **main**: Production branch (deployed to https://coolify.io/docs/) -- **next**: Development branch (deployed to https://next.coolify.io/docs/) -- **IMPORTANT**: All pull requests MUST target the `next` branch, NEVER `main` -- Weekly release cycle merges `next` → `main` +- **main**: Production branch, deployed to https://coolify.io/docs/ +- **next**: Development branch, deployed to https://next.coolify.io/docs/ +- Pull requests must target `next`, not `main`. +- Weekly release cycle merges `next` into `main`. ## Technology Stack -- **VitePress 1.6.3** - Static site generator -- **Vue 3.5.13** - Component framework -- **Tailwind CSS 3.2.4** - Utility-first CSS -- **TypeScript** - Type safety -- **Plausible** - Privacy-focused analytics +- **Fumadocs MDX/UI/Core** - Documentation content, layout, search, and MDX pipeline +- **TanStack Start / React 19** - Application runtime and prerendering +- **Vite** - Development server and production build +- **Tailwind CSS 4** - Styling +- **TypeScript** - Type checking +- **Bun** - Package manager and script runner +- **Plausible** - Analytics -## Common Development Commands - -### Package Management - -- **Preferred**: `bun` (as per README) -- **Configured**: `pnpm@10.6.3` (as per package.json) -- If using a different package manager, do NOT commit its lock files - -### Local Development +## Common Commands ```bash # Install dependencies bun install -# Run development server (http://localhost:5173/docs/) +# Generate services and Fumadocs content +bun run generate:services +bun run generate:content + +# Run development server bun run dev -# Build for production +# Build static production output bun run build +# Type-check the generated Fumadocs source and app +bun run types:check + # Preview production build bun run preview - -# Convert OpenAPI YAML to JSON (run after updating API spec) -bun run transform-openapi ``` -### Alternative: Task Runner - -```bash -# Install Task: https://taskfile.dev/docs/installation -task --list # List all available tasks -task dev # Run dev server on port 2222 (all network interfaces) -task docker-build # Build Docker container -task docker-deploy # Run Docker container -``` +`bun run dev`, `bun run build`, and `bun run types:check` generate service data and Fumadocs content before starting their primary work. ## Directory Structure -``` -docs/ -├── .vitepress/ -│ ├── config.mts # Main VitePress config -│ ├── plugins/ # Custom Vite plugins -│ └── theme/ # Custom theme & components -│ └── components/ # Vue components (including Services/List.vue) -├── public/ # Static assets (images, openapi.yml) -│ └── images/ # Organized by section -├── get-started/ # Getting started guides -├── applications/ # Application deployment docs -├── services/ # One-click services docs -├── databases/ # Database docs -├── knowledge-base/ # How-tos and concepts -├── api-reference/ # Auto-generated API docs -└── troubleshoot/ # Troubleshooting guides - -nginx/ -└── redirects.conf # URL redirect rules +```text +docs/ # Author-edited source markdown and images +content/docs/ # Generated Fumadocs MDX content +src/ # React/TanStack Start application +src/components/ # Shared MDX and UI components +src/generated/services.json # Generated service directory data +config/site.shared.ts # Shared site metadata and docs base path +scripts/ # Content, services, and postbuild scripts +public/ # Public assets copied into the /docs base path +nginx/ # Nginx config and redirects ``` -## Architecture - -### VitePress Configuration - -- Main config: [docs/.vitepress/config.mts](docs/.vitepress/config.mts) -- Custom theme: [docs/.vitepress/theme/index.ts](docs/.vitepress/theme/index.ts) -- Theme extends VitePress default theme with custom components and layouts - -### Custom VitePress Plugins - -1. **vitepress-openapi**: Auto-generates API documentation from OpenAPI spec - - Dynamically fetches from GitHub: `https://raw.githubusercontent.com/coollabsio/coolify/v4.x/openapi.json` - - Falls back to local file: [docs/.vitepress/theme/openapi.json](docs/.vitepress/theme/openapi.json) - -2. **vitepress-plugin-coolbot**: Custom plugin that converts markdown to plain text for AI/RAG systems - - Generates `llms-text.json` file map during build - - Configured in [docs/.vitepress/plugins/vitepress-plugin-coolbot.ts](docs/.vitepress/plugins/vitepress-plugin-coolbot.ts) - -3. **vitepress-plugin-llms**: Generates llms.txt for LLM consumption - -4. **vitepress-plugin-tabs**: Enables tabbed content blocks - -5. **vitepress-plugin-group-icons**: Adds icons to code group labels - -### Custom Vue Components - -Located in [docs/.vitepress/theme/components/](docs/.vitepress/theme/components/): - -- **ZoomableImage**: MUST be used for all documentation images - ```vue - - ``` -- **Callout**: Important notes and warnings (types: `tip`, `warning`, `danger`, `info`, `success`) -- **TabBlock**: Tabbed content sections -- **Card/CardGroup**: Landing page card layouts -- **KorrektlySearch**: Integrated search component +`docs/` remains the source of truth for documentation authoring. `scripts/generate-fumadocs-content.mjs` converts that content into `content/docs/` for Fumadocs. ## Content Guidelines ### Images -- **Format**: All images MUST be `.webp` format -- **Location**: Store in `docs/public/images/[section]/` -- **Paths**: Always use absolute paths: `/docs/images/...` -- **Usage**: Always use the `ZoomableImage` component +- Store images in `docs/public/images/[section]/`. +- Use `/docs/images/...` paths in rendered output. +- Prefer the `ZoomableImage` MDX component for documentation screenshots. +- Keep meaningful alt text for screenshots and diagrams. -### Writing Style +### Markdown and MDX -- Use clear, simple language (consider non-native English speakers) -- Break instructions into small, numbered steps -- Include screenshots for complex processes using `` -- Structure with clear headings and bullet points - -### Markdown Features - -- Standard markdown + VitePress extensions -- Frontmatter for page metadata (title and description required) -- Custom containers: `:::success`, `:::warning`, `:::danger`, `:::info`, `:::tip` -- Tabs via `vitepress-plugin-tabs` -- Code groups with icons via `vitepress-plugin-group-icons` - -### Links - -- **Internal**: Use absolute paths `/services/wordpress` -- **External**: Full URLs with UTM parameter `?utm_source=coolify.io` -- Always include descriptive anchor text (not bare URLs) +- Frontmatter should include `title` and usually `description`. +- Existing VitePress containers are converted into Fumadocs callouts during content generation. +- Internal links should point to stable docs paths, for example `/applications` or `/services/postgresql`; generated output rewrites these under `/docs`. +- Avoid raw HTML unless it is already supported by the conversion script and MDX runtime. ## Service Documentation -### Source of Truth +Service files live in `docs/services/`. The services directory data is generated by `scripts/generate-service-list.mjs` into `src/generated/services.json`. -The authoritative source for service names is: -``` -https://raw.githubusercontent.com/coollabsio/coolify/refs/heads/v4.x/templates/service-templates-latest.json -``` - -### File Naming Rules - -Service documentation files in `docs/services/` must follow these conventions: - -1. **Use kebab-case lowercase** for all filenames -2. **Match the base service name** from `service-templates-latest.json` -3. **Do not use camelCase** even if the JSON template uses it (e.g., `denoKV` → `denokv.md`) -4. **Include version numbers** when specified (e.g., `mautic5.md` not `mautic.md`) -5. **Use compound names** when specified (e.g., `ente-photos.md` not `ente.md`) - -### Files to Update When Managing Services - -When adding, renaming, or disabling services, update these locations: +When adding, renaming, or disabling services, update: | File | Purpose | |------|---------| -| `docs/services/{name}.md` | The documentation file | -| `docs/.vitepress/theme/components/Services/List.vue` | Service listing (slug must match filename) | -| `nginx/redirects.conf` | URL redirects (when renaming/removing) | +| `docs/services/{name}.md` | Service documentation | | `docs/public/images/services/` | Service logo | +| `nginx/redirects.conf` | Redirects for renamed or removed paths | -### Disabling Services - -For deprecated or unavailable services: -1. Add `disabled: true` to the entry in `List.vue` -2. Add a warning callout in the markdown: `::: warning SERVICE NOT AVAILABLE` -3. Keep the file for SEO (users may find via search) +Service filenames should use kebab-case lowercase and match the service slug. ## Environment Variables -Configuration via `.env` file (see [.env.example](.env.example)): - ```bash -VITE_SITE_URL=https://coolify.io/docs/ # Base URL for sitemap and meta -VITE_ANALYTICS_DOMAIN=coolify.io/docs # Plausible analytics domain -VITE_KORREKTLY_BASE_URL=https://korrektly.com -VITE_KORREKTLY_API_TOKEN=kly_pub_... -VITE_KORREKTLY_DATASET_ID=uuid +VITE_SITE_URL=https://coolify.io/docs/ +VITE_ANALYTICS_DOMAIN=coolify.io/docs +VITE_PLAUSIBLE_SCRIPT_URL=https://analytics.coollabs.io/js/script.tagged-events.js ``` -## Build & Deployment +## Build and Deployment -### Docker Build +The Dockerfile builds the Fumadocs/TanStack app with Bun and copies `.output/public` into the Nginx image. Nginx serves the static site from `/usr/share/nginx/html`, preserving `/docs/...` URLs. -Multi-stage Dockerfile: -1. **Builder stage**: Uses `oven/bun:1.1.44-alpine` to build VitePress site -2. **Final stage**: Uses `nginxinc/nginx-unprivileged:1.27.3-alpine-slim` to serve static files +Postbuild output includes: -Custom nginx config in [nginx/nginx.conf](nginx/nginx.conf) and [nginx/redirects.conf](nginx/redirects.conf) +- `.output/public/docs-manifest.json` +- `.output/public/sitemap.xml` +- `.output/public/robots.txt` +- `.output/public/llms.txt` +- `.output/public/llms-full.txt` +- `.output/public/docs/images/` +- `.output/public/docs/brand/` -### CI/CD Workflows - -Located in `.github/workflows/`: -- **staging-build.yml**: Builds and deploys `next` branch to staging -- **production-build.yml**: Builds and deploys `main` branch to production -- **update-korrektly.yml**: Updates search index -- **enforce-pr-standards.yml**: PR validation - -## Styling - -### Color Scheme - -- **Primary Brand**: Purple (`#7937f3`, `#7442d1`, `#B392F0`) -- **Tips**: Brand purple -- **Warnings**: Yellow -- **Danger/Errors**: Red (`#ff4444`) -- **Success**: Green (`#36d399`) -- **Info**: Blue (`#42b8e7`) - -### Theme - -- Dark/light mode support (user-switchable, dark by default) -- Custom styles in [theme/style.css](docs/.vitepress/theme/style.css) and [theme/custom.css](docs/.vitepress/theme/custom.css) -- Mobile-first responsive design +Custom Nginx config lives in [nginx/nginx.conf](nginx/nginx.conf) and redirect rules live in [nginx/redirects.conf](nginx/redirects.conf). ## Troubleshooting | Issue | Solution | |-------|----------| -| Images not displaying | Check path is absolute (`/docs/images/...`) | -| Links broken after rename | Update all 3 locations (file, List.vue, redirects.conf) | -| Build fails | Check frontmatter YAML syntax | -| Service not showing | Verify slug in List.vue matches filename | +| Build fails in MDX | Run `bun run generate:content` and inspect the generated file named in the error | +| Service not listed | Run `bun run generate:services` and verify the file exists in `docs/services/` | +| Image missing | Check source asset in `docs/public/images/` and rendered `/docs/images/...` path | +| Broken renamed page | Update `nginx/redirects.conf` and any source markdown links | ## Important Notes -- The documentation may occasionally be outdated; refer to the Coolify source code for accuracy -- OpenAPI spec is fetched from GitHub's v4.x branch at build time -- Search is powered by local provider + Korrektly integration -- VitePress plugins generate additional outputs: llms.txt, llms-text.json for AI consumption +- The documentation can lag behind Coolify releases; check the Coolify source for behavior-sensitive claims. +- Generated folders are part of the build workflow. Regenerate them after changing source docs or service files. +- Keep redirects stable because existing docs URLs are indexed and linked externally. diff --git a/Dockerfile b/Dockerfile index 1815086d..9d3edc40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,14 +3,8 @@ FROM oven/bun:1.3.6-alpine AS builder ARG VITE_ANALYTICS_DOMAIN=coolify.io/docs ARG VITE_SITE_URL=https://coolify.io/docs/ -ARG VITE_KORREKTLY_API_TOKEN -ARG VITE_KORREKTLY_BASE_URL -ARG VITE_KORREKTLY_DATASET_ID ENV VITE_ANALYTICS_DOMAIN=${VITE_ANALYTICS_DOMAIN} ENV VITE_SITE_URL=${VITE_SITE_URL} -ENV VITE_KORREKTLY_API_TOKEN=${VITE_KORREKTLY_API_TOKEN} -ENV VITE_KORREKTLY_BASE_URL=${VITE_KORREKTLY_BASE_URL} -ENV VITE_KORREKTLY_DATASET_ID=${VITE_KORREKTLY_DATASET_ID} RUN apk add --no-cache nodejs npm # Set working directory and copy necessary files @@ -29,11 +23,16 @@ RUN --mount=type=cache,target=/root/.bun \ bun install # Copy only necessary files for build +COPY config/ ./config/ +COPY public/ ./public/ +COPY src/ ./src/ COPY docs/ ./docs/ COPY nginx/ ./nginx/ COPY scripts/ ./scripts/ COPY env.d.ts . +COPY source.config.ts . COPY tsconfig*.json ./ +COPY vite.config.ts . # Copy git history for lastUpdated timestamps COPY .git/ ./.git/ @@ -41,8 +40,7 @@ COPY .git/ ./.git/ # Build with cache RUN --mount=type=cache,target=/root/.bun \ --mount=type=cache,target=/root/.cache/bun \ - --mount=type=cache,target=/app/docs/.vitepress/.cache \ - --mount=type=cache,target=/app/docs/.vitepress/cache \ + --mount=type=cache,target=/app/.source \ bun run build # Stage 2: NGINX Unprivileged Setup (1.29.3-alpine-slim, ARM64) @@ -50,7 +48,7 @@ FROM nginxinc/nginx-unprivileged:1.29.3-alpine-slim AS final # Set working directory for NGINX and copy built files from the build stage WORKDIR /usr/share/nginx/html -COPY --from=builder /app/docs/.vitepress/dist /usr/share/nginx/html/docs +COPY --from=builder /app/.output/public /usr/share/nginx/html # Copy custom NGINX configuration COPY nginx/nginx.conf /etc/nginx/nginx.conf diff --git a/bun.lock b/bun.lock index eda9f376..ff8b4c97 100644 --- a/bun.lock +++ b/bun.lock @@ -5,153 +5,146 @@ "": { "name": "coolify-docs", "dependencies": { - "@korrektly/sdk": "^0.1.4", - "@vueuse/core": "14.1.0", - "globe.gl": "2.45.0", - "vitepress-openapi": "0.1.13", + "@orama/orama": "^3.1.18", + "@resvg/resvg-js": "^2.6.2", + "@tanstack/react-router": "1.168.10", + "@tanstack/react-start": "1.167.16", + "@tanstack/start-static-server-functions": "1.166.25", + "fumadocs-core": "16.8.5", + "fumadocs-mdx": "14.2.11", + "fumadocs-openapi": "^10.8.1", + "fumadocs-ui": "16.8.5", + "gray-matter": "^4.0.3", + "lucide-react": "^1.7.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "shiki": "^4.0.2", + "tslib": "^2.8.1", + "vite": "^8.0.7", }, "devDependencies": { - "@iconify/vue": "^5.0.0", "@tailwindcss/vite": "^4.2.1", + "@types/mdx": "^2.0.13", "@types/node": "25.0.9", - "markdown-it-container": "4.0.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "nitro": "^3.0.260311-beta", "tailwindcss": "^4.2.1", - "vitepress": "1.6.4", - "vitepress-plugin-group-icons": "^1.7.1", - "vitepress-plugin-llms": "^1.11.0", - "vitepress-plugin-tabs": "^0.7.3", - "vue": "^3.5.29", + "typescript": "^6.0.2", }, }, }, "packages": { - "@algolia/abtesting": ["@algolia/abtesting@1.12.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-0SpSdnME0RCS6UHSs9XD3ox4bMcCg1JTmjAJ3AU6rcTlX54CZOAEPc2as8uSghX6wfKGT0HWes4TeUpjJMg6FQ=="], + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.7", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" } }, "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q=="], + "@babel/compat-data": ["@babel/compat-data@7.29.3", "", {}, "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="], - "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="], + "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], - "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="], + "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], - "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], - "@algolia/client-abtesting": ["@algolia/client-abtesting@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-i2C8sBcl3EKXuCd5nlGohW+pZ9pY3P3JKJ2OYqsbCPg6wURiR32hNDiDvDq7/dqJ7KWWwC2snxJhokZzGlckgQ=="], + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - "@algolia/client-analytics": ["@algolia/client-analytics@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-uFmD7m3LOym1SAURHeiqupHT9jui+9HK0lAiIvm077gXEscOM5KKXM4rg/ICzQ3UDHLZEA0Lb5TglWsXnieE6w=="], + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], - "@algolia/client-common": ["@algolia/client-common@5.46.3", "", {}, "sha512-SN+yK840nXa+2+mF72hrDfGd8+B7eBjF8TK/8KoRMdjlAkO/P3o3vtpjKRKI/Sk4L8kYYkB/avW8l+cwR+O1Ew=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], - "@algolia/client-insights": ["@algolia/client-insights@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-5ic1liG0VucNPi6gKCWh5bEUGWQfyEmVeXiNKS+rOSppg7B7nKH0PEEJOFXBbHmgK5aPfNNZINiKcyUoH4XsFA=="], - - "@algolia/client-personalization": ["@algolia/client-personalization@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-f4HNitgTip8tntKgluYBTc1LWSOkbNCdxZvRA3rRBZnEAYSvLe7jpE+AxRep6RY+prSWwMtyeCFhA/F1Um+TuQ=="], - - "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-/AaVqah2aYyJj7Cazu5QRkgcV3HF3lkBJo5TRkgqQ26xR4iHNRbLF2YsWJfJpJEFghlTF2HOCh7IgzaUCnM+8A=="], - - "@algolia/client-search": ["@algolia/client-search@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-hfpCIukPuwkrlwsYfJEWdU5R5bduBHEq2uuPcqmgPgNq5MSjmiNIzRuzxGZZgiBKcre6gZT00DR7G1AFn//wiQ=="], - - "@algolia/ingestion": ["@algolia/ingestion@1.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-ChVzNkCzAVxKozTnTgPWCG69WQLjzW7X6OqD91zUh8U38ZhPEX/t3qGhXs+M9ZNaHcJ7xToMB3jywNwONhpLGA=="], - - "@algolia/monitoring": ["@algolia/monitoring@1.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-MZa+Z5iPmVMxVAQ0aq4HpGsja5utSLEMcOuY01X8D46vvMrSPkP8DnlDFtu1PgJ0RwyIGqqx7v+ClFo6iRJ6bA=="], - - "@algolia/recommend": ["@algolia/recommend@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-cr3atJRJBKgAKZl/Oxo4sig6Se0+ukbyIOOluPV5H+ZAXVcxuMoXQgwQ1M5UHPnCnEsZ4uBXhBmilRgUQpUegw=="], - - "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3" } }, "sha512-/Ku9GImJf2SKoRM2S3e03MjCVaWJCP5olih4k54DRhNDdmxBkd3nsWuUXvDElY3Ucw/arBYGs5SYz79SoS5APw=="], - - "@algolia/requester-fetch": ["@algolia/requester-fetch@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3" } }, "sha512-Uw+SPy/zpfwbH1AxQaeOWvWVzPEcO0XbtLbbSz0HPcEIiBGWyfa9LUCxD5UferbDjrSQNVimmzl3FaWi4u8Ykw=="], - - "@algolia/requester-node-http": ["@algolia/requester-node-http@5.46.3", "", { "dependencies": { "@algolia/client-common": "5.46.3" } }, "sha512-4No9iTjr1GZ0JWsFbQJj9aZBnmKyY1sTxOoEud9+SGe3U6iAulF0A0lI4cWi/F/Gcfg8V3jkaddcqSQKDnE45w=="], - - "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], + "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], - "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - "@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], - "@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="], + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], - "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom", "search-insights"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], - "@floating-ui/vue": ["@floating-ui/vue@1.1.9", "", { "dependencies": { "@floating-ui/dom": "^1.7.4", "@floating-ui/utils": "^0.2.10", "vue-demi": ">=0.13.0" } }, "sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ=="], + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], - "@iconify-json/logos": ["@iconify-json/logos@1.2.10", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-qxaXKJ6fu8jzTMPQdHtNxlfx6tBQ0jXRbHZIYy5Ilh8Lx9US9FsAdzZWUR8MXV8PnWTKGDFO4ZZee9VwerCyMA=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], - "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.66", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-D1OnnXwiQXFkVMw5M+Bt8mPsXeMkQyGmMdrmN7lsQlKMUkfLOp6JWhnUJ92po51WXT046aF/zzqSmkKqg08p4Q=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], - "@iconify-json/vscode-icons": ["@iconify-json/vscode-icons@1.2.39", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-ycXYaWkho1nJE+HsArpphb+Ug/bVVAZzPHqvGhSJULE3rutdz9cqxg//AmrU/oEBPTi7ximyoEKpJ2ICVhR1aw=="], + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], - "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + "@fumadocs/tailwind": ["@fumadocs/tailwind@0.0.5", "", { "peerDependencies": { "@tailwindcss/oxide": "^4.0.0", "tailwindcss": "^4.0.0" }, "optionalPeers": ["@tailwindcss/oxide", "tailwindcss"] }, "sha512-ENKPWUDRmriccsrUDE4bDBq3FNr/ms3BP2rWlsAEMV1yP23pcCaan+ceGfeBUsAQjw7sj9Q3R4Kl3g/TCStPzQ=="], - "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], + "@fumari/json-schema-ts": ["@fumari/json-schema-ts@0.0.2", "", { "dependencies": { "esrap": "^2.2.3" }, "peerDependencies": { "json-schema-typed": "^8.0.2" }, "optionalPeers": ["json-schema-typed"] }, "sha512-A2x8nj45r8Kc3Gqa+HpWRF9uzIMc9dySB6L2R2kiyjLHXWBsZUX99Atj5+Yup/iRQXQ9s8AX+uAPwPze7Xn05A=="], - "@iconify/vue": ["@iconify/vue@5.0.0", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "vue": ">=3" } }, "sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg=="], - - "@internationalized/date": ["@internationalized/date@3.10.1", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA=="], - - "@internationalized/number": ["@internationalized/number@3.6.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g=="], - - "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], - - "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + "@fumari/stf": ["@fumari/stf@1.0.5", "", { "peerDependencies": { "@types/react": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@types/react"] }, "sha512-O9UQIbV15ePV5vUgceCcaMDuBRYfrSuogDEY5E//CmrbIiWJ1Ji5VgGHHH0L0HQuRr5riUJuAEr9lYIvJl9OyQ=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -163,75 +156,167 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@korrektly/sdk": ["@korrektly/sdk@0.1.4", "", {}, "sha512-g02AOmZtLO0/LnJkkyODlhsoXBxtLsLzxjpIi/vvUTizklDUG+2qqEVxSkC9mjT3NjMy+kk5+90Xz3uoyhEDEQ=="], + "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="], + "@oozcitak/dom": ["@oozcitak/dom@2.0.2", "", { "dependencies": { "@oozcitak/infra": "^2.0.2", "@oozcitak/url": "^3.0.0", "@oozcitak/util": "^10.0.0" } }, "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="], + "@oozcitak/infra": ["@oozcitak/infra@2.0.2", "", { "dependencies": { "@oozcitak/util": "^10.0.0" } }, "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="], + "@oozcitak/url": ["@oozcitak/url@3.0.0", "", { "dependencies": { "@oozcitak/infra": "^2.0.2", "@oozcitak/util": "^10.0.0" } }, "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="], + "@oozcitak/util": ["@oozcitak/util@10.0.0", "", {}, "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="], + "@orama/orama": ["@orama/orama@3.1.18", "", {}, "sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="], + "@oxc-project/types": ["@oxc-project/types@0.127.0", "", {}, "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="], + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="], + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="], + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="], + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="], + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="], + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="], + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="], + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="], + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="], + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="], + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="], + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="], + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="], + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g=="], + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="], + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="], + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="], + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], - "@shikijs/core": ["@shikijs/core@2.5.0", "", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="], + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="], + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="], + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], - "@shikijs/langs": ["@shikijs/langs@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="], + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="], - "@shikijs/themes": ["@shikijs/themes@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="], + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="], - "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="], + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="], - "@shikijs/types": ["@shikijs/types@2.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="], + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@resvg/resvg-js": ["@resvg/resvg-js@2.6.2", "", { "optionalDependencies": { "@resvg/resvg-js-android-arm-eabi": "2.6.2", "@resvg/resvg-js-android-arm64": "2.6.2", "@resvg/resvg-js-darwin-arm64": "2.6.2", "@resvg/resvg-js-darwin-x64": "2.6.2", "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", "@resvg/resvg-js-linux-arm64-musl": "2.6.2", "@resvg/resvg-js-linux-x64-gnu": "2.6.2", "@resvg/resvg-js-linux-x64-musl": "2.6.2", "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", "@resvg/resvg-js-win32-x64-msvc": "2.6.2" } }, "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q=="], + + "@resvg/resvg-js-android-arm-eabi": ["@resvg/resvg-js-android-arm-eabi@2.6.2", "", { "os": "android", "cpu": "arm" }, "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA=="], + + "@resvg/resvg-js-android-arm64": ["@resvg/resvg-js-android-arm64@2.6.2", "", { "os": "android", "cpu": "arm64" }, "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ=="], + + "@resvg/resvg-js-darwin-arm64": ["@resvg/resvg-js-darwin-arm64@2.6.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A=="], + + "@resvg/resvg-js-darwin-x64": ["@resvg/resvg-js-darwin-x64@2.6.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw=="], + + "@resvg/resvg-js-linux-arm-gnueabihf": ["@resvg/resvg-js-linux-arm-gnueabihf@2.6.2", "", { "os": "linux", "cpu": "arm" }, "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw=="], + + "@resvg/resvg-js-linux-arm64-gnu": ["@resvg/resvg-js-linux-arm64-gnu@2.6.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg=="], + + "@resvg/resvg-js-linux-arm64-musl": ["@resvg/resvg-js-linux-arm64-musl@2.6.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg=="], + + "@resvg/resvg-js-linux-x64-gnu": ["@resvg/resvg-js-linux-x64-gnu@2.6.2", "", { "os": "linux", "cpu": "x64" }, "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw=="], + + "@resvg/resvg-js-linux-x64-musl": ["@resvg/resvg-js-linux-x64-musl@2.6.2", "", { "os": "linux", "cpu": "x64" }, "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ=="], + + "@resvg/resvg-js-win32-arm64-msvc": ["@resvg/resvg-js-win32-arm64-msvc@2.6.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ=="], + + "@resvg/resvg-js-win32-ia32-msvc": ["@resvg/resvg-js-win32-ia32-msvc@2.6.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w=="], + + "@resvg/resvg-js-win32-x64-msvc": ["@resvg/resvg-js-win32-x64-msvc@2.6.2", "", { "os": "win32", "cpu": "x64" }, "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.17", "", { "os": "android", "cpu": "arm64" }, "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm" }, "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg=="], + + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA=="], + + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "s390x" }, "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.17", "", { "os": "linux", "cpu": "x64" }, "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.17", "", { "os": "none", "cpu": "arm64" }, "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA=="], + + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.17", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.17", "", { "os": "win32", "cpu": "x64" }, "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], + + "@shikijs/core": ["@shikijs/core@4.0.2", "", { "dependencies": { "@shikijs/primitive": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="], + + "@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="], + + "@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="], + + "@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="], + + "@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="], "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - "@swc/helpers": ["@swc/helpers@0.5.18", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="], @@ -263,95 +348,103 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], - "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.18", "", {}, "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg=="], + "@tanstack/history": ["@tanstack/history@1.161.6", "", {}, "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg=="], - "@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.18", "", { "dependencies": { "@tanstack/virtual-core": "3.13.18" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-6pT8HdHtTU5Z+t906cGdCroUNA5wHjFXsNss9gwk7QAr1VNZtz9IQCs2Nhx0gABK48c+OocHl2As+TMg8+Hy4A=="], + "@tanstack/react-router": ["@tanstack/react-router@1.168.10", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.168.9", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-/RmDlOwDkCug609KdPB3U+U1zmrtadJpvsmRg2zEn8TRCKRNri7dYZIjQZbNg8PgUiRL4T6njrZBV1ChzblNaA=="], - "@turf/boolean-point-in-polygon": ["@turf/boolean-point-in-polygon@7.3.2", "", { "dependencies": { "@turf/helpers": "7.3.2", "@turf/invariant": "7.3.2", "@types/geojson": "^7946.0.10", "point-in-polygon-hao": "^1.1.0", "tslib": "^2.8.1" } }, "sha512-PAfPDQ0TW1+VLgZ7tReTSyZ/X41AW7/nMRQxVpY+h/aG7JomZJ779lojnODT4dWCn3IMTA3xD2dDDfVYBAQMYg=="], + "@tanstack/react-start": ["@tanstack/react-start@1.167.16", "", { "dependencies": { "@tanstack/react-router": "1.168.10", "@tanstack/react-start-client": "1.166.25", "@tanstack/react-start-server": "1.166.25", "@tanstack/router-utils": "^1.161.6", "@tanstack/start-client-core": "1.167.9", "@tanstack/start-plugin-core": "1.167.17", "@tanstack/start-server-core": "1.167.9", "pathe": "^2.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "vite": ">=7.0.0" }, "bin": { "intent": "bin/intent.js" } }, "sha512-vHIhn+FTWfAVhRus1BZEaBZPhnYL+StDuMlShslIBPEGGTCRt11BxNUfV/iDpr7zbxw36Snj7zGfI7DwfjjlDQ=="], - "@turf/helpers": ["@turf/helpers@7.3.2", "", { "dependencies": { "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-5HFN42rgWjSobdTMxbuq+ZdXPcqp1IbMgFYULTLCplEQM3dXhsyRFe7DCss4Eiw12iW3q6Z5UeTNVfITsE5lgA=="], + "@tanstack/react-start-client": ["@tanstack/react-start-client@1.166.25", "", { "dependencies": { "@tanstack/react-router": "1.168.10", "@tanstack/router-core": "1.168.9", "@tanstack/start-client-core": "1.167.9" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-FvD279zzneUtsfhaTv2c29qhE1Z3wHy3dt3cCjn9LzWZehOgn5Ij78s0YpmQaQ8lSF3YL7CySE3pDk9XHE6YeA=="], - "@turf/invariant": ["@turf/invariant@7.3.2", "", { "dependencies": { "@turf/helpers": "7.3.2", "@types/geojson": "^7946.0.10", "tslib": "^2.8.1" } }, "sha512-brGmL1EFhZH/YNXhq6S+8sPWBEnmvEyxMWJO8bUNOFZyWHYiRTwxQHZM+An1blkbQ77PiEzsdNAspZqE1j7YKA=="], + "@tanstack/react-start-server": ["@tanstack/react-start-server@1.166.25", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/react-router": "1.168.10", "@tanstack/router-core": "1.168.9", "@tanstack/start-client-core": "1.167.9", "@tanstack/start-server-core": "1.167.9" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-bPLADxlplvcnAcnZvBjJl2MzgUnB85d7Mu5aEkYoOFxhz0WiG6mZp7BDadIJuCd33NYMirsd3XrjfCHNzrMTyg=="], - "@tweenjs/tween.js": ["@tweenjs/tween.js@25.0.0", "", {}, "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A=="], + "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.168.9", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^2.0.0", "seroval": "^1.4.2", "seroval-plugins": "^1.4.2" }, "bin": { "intent": "bin/intent.js" } }, "sha512-18oeEwEDyXOIuO1VBP9ACaK7tYHZUjynGDCoUh/5c/BNhia9vCJCp9O0LfhZXOorDc/PmLSgvmweFhVmIxF10g=="], + + "@tanstack/router-generator": ["@tanstack/router-generator@1.166.24", "", { "dependencies": { "@tanstack/router-core": "1.168.9", "@tanstack/router-utils": "1.161.6", "@tanstack/virtual-file-routes": "1.161.7", "prettier": "^3.5.0", "recast": "^0.23.11", "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" } }, "sha512-vdaGKwuH+r+DPe6R1mjk+TDDmDH6NTG7QqwxHqGEvOH4aGf9sPjhmRKNJZqQr8cPIbfp6u5lXyZ1TeDcSNMVEA=="], + + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.167.12", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.168.9", "@tanstack/router-generator": "1.166.24", "@tanstack/router-utils": "1.161.6", "@tanstack/virtual-file-routes": "1.161.7", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.168.10", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0", "vite-plugin-solid": "^2.11.10", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"], "bin": { "intent": "bin/intent.js" } }, "sha512-StEHcctCuFI5taSjO+lhR/yQ+EK63BdyYa+ne6FoNQPB3MMrOUrz2ZVnbqILRLkh2b+p2EfBKt65sgAKdKygPQ=="], + + "@tanstack/router-utils": ["@tanstack/router-utils@1.161.8", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-xyiLWEKjfBAVhauDSSjXxyf7s8elU6SM+V050sbkofvGmIIvkwPFtDsX7Gvwh14kBd6iCwAT+RiPvXTxAptY0Q=="], + + "@tanstack/start-client-core": ["@tanstack/start-client-core@1.167.9", "", { "dependencies": { "@tanstack/router-core": "1.168.9", "@tanstack/start-fn-stubs": "1.161.6", "@tanstack/start-storage-context": "1.166.23", "seroval": "^1.4.2" }, "bin": { "intent": "bin/intent.js" } }, "sha512-2ETQO/bxiZGsoTdPxZb7xR8YqCy5l4kv/QPkwIXuvx/A4BjufngXfgISjXUicXsFRIBZeiFnBzp9A38UMsS2iA=="], + + "@tanstack/start-fn-stubs": ["@tanstack/start-fn-stubs@1.161.6", "", {}, "sha512-Y6QSlGiLga8cHfvxGGaonXIlt2bIUTVdH6AMjmpMp7+ANNCp+N96GQbjjhLye3JkaxDfP68x5iZA8NK4imgRig=="], + + "@tanstack/start-plugin-core": ["@tanstack/start-plugin-core@1.167.17", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", "@rolldown/pluginutils": "1.0.0-beta.40", "@tanstack/router-core": "1.168.9", "@tanstack/router-generator": "1.166.24", "@tanstack/router-plugin": "1.167.12", "@tanstack/router-utils": "1.161.6", "@tanstack/start-client-core": "1.167.9", "@tanstack/start-server-core": "1.167.9", "cheerio": "^1.0.0", "exsolve": "^1.0.7", "pathe": "^2.0.3", "picomatch": "^4.0.3", "source-map": "^0.7.6", "srvx": "^0.11.9", "tinyglobby": "^0.2.15", "ufo": "^1.5.4", "vitefu": "^1.1.1", "xmlbuilder2": "^4.0.3", "zod": "^3.24.2" }, "peerDependencies": { "vite": ">=7.0.0" } }, "sha512-OkorpOobGOEDVr72QUmkzKjbawKC05CSz+1B3OObB/AxBIIw+lLLhTXbV45QkX2LZA7dcRvPJYZGOH1pkFqA1g=="], + + "@tanstack/start-server-core": ["@tanstack/start-server-core@1.167.9", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/router-core": "1.168.9", "@tanstack/start-client-core": "1.167.9", "@tanstack/start-storage-context": "1.166.23", "h3-v2": "npm:h3@2.0.1-rc.16", "seroval": "^1.4.2" }, "bin": { "intent": "bin/intent.js" } }, "sha512-vKkslQIihoDDVumF73VXT7PVFmN7Nea0nKhZx7gMbc0m09yPQYYR1dn86/dz14k6/7cDkJ+qKXa09rlVlN/i9Q=="], + + "@tanstack/start-static-server-functions": ["@tanstack/start-static-server-functions@1.166.25", "", { "dependencies": { "@tanstack/start-client-core": "1.167.9", "seroval": "^1.4.2" }, "peerDependencies": { "@tanstack/react-start": "^1.167.16", "@tanstack/solid-start": "^1.167.15" }, "optionalPeers": ["@tanstack/react-start", "@tanstack/solid-start"] }, "sha512-zuQKJ+FqFAwF7QSqpxktmuv6SWY5uM5VLNdjQAZy3ByqzCd/5CXc1P56CsdBMvNxSqQblqnxcL30PAU4ZiWh7A=="], + + "@tanstack/start-storage-context": ["@tanstack/start-storage-context@1.166.23", "", { "dependencies": { "@tanstack/router-core": "1.168.9" } }, "sha512-3vEdiYRMx+r+Q7Xqxj3YmADPIpMm7fkKxDa8ITwodGXiw+SBJCGkpBXGUWjOXyXkIyqGHKM5UrReTcVUTkmaug=="], + + "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], + + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.161.7", "", { "bin": { "intent": "bin/intent.js" } }, "sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], - "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], - - "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], - "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="], + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], - "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], - "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], - - "@vue/compiler-core": ["@vue/compiler-core@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw=="], - - "@vue/compiler-dom": ["@vue/compiler-dom@3.5.29", "", { "dependencies": { "@vue/compiler-core": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg=="], - - "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.29", "", { "dependencies": { "@babel/parser": "^7.29.0", "@vue/compiler-core": "3.5.29", "@vue/compiler-dom": "3.5.29", "@vue/compiler-ssr": "3.5.29", "@vue/shared": "3.5.29", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA=="], - - "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.29", "", { "dependencies": { "@vue/compiler-dom": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw=="], - - "@vue/devtools-api": ["@vue/devtools-api@7.7.9", "", { "dependencies": { "@vue/devtools-kit": "^7.7.9" } }, "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g=="], - - "@vue/devtools-kit": ["@vue/devtools-kit@7.7.9", "", { "dependencies": { "@vue/devtools-shared": "^7.7.9", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA=="], - - "@vue/devtools-shared": ["@vue/devtools-shared@7.7.9", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA=="], - - "@vue/reactivity": ["@vue/reactivity@3.5.29", "", { "dependencies": { "@vue/shared": "3.5.29" } }, "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA=="], - - "@vue/runtime-core": ["@vue/runtime-core@3.5.29", "", { "dependencies": { "@vue/reactivity": "3.5.29", "@vue/shared": "3.5.29" } }, "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg=="], - - "@vue/runtime-dom": ["@vue/runtime-dom@3.5.29", "", { "dependencies": { "@vue/reactivity": "3.5.29", "@vue/runtime-core": "3.5.29", "@vue/shared": "3.5.29", "csstype": "^3.2.3" } }, "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg=="], - - "@vue/server-renderer": ["@vue/server-renderer@3.5.29", "", { "dependencies": { "@vue/compiler-ssr": "3.5.29", "@vue/shared": "3.5.29" }, "peerDependencies": { "vue": "3.5.29" } }, "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g=="], - - "@vue/shared": ["@vue/shared@3.5.26", "", {}, "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A=="], - - "@vueuse/core": ["@vueuse/core@14.1.0", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "14.1.0", "@vueuse/shared": "14.1.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw=="], - - "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="], - - "@vueuse/metadata": ["@vueuse/metadata@14.1.0", "", {}, "sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA=="], - - "@vueuse/shared": ["@vueuse/shared@14.1.0", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw=="], - - "accessor-fn": ["accessor-fn@1.5.3", "", {}, "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - "algoliasearch": ["algoliasearch@5.46.3", "", { "dependencies": { "@algolia/abtesting": "1.12.3", "@algolia/client-abtesting": "5.46.3", "@algolia/client-analytics": "5.46.3", "@algolia/client-common": "5.46.3", "@algolia/client-insights": "5.46.3", "@algolia/client-personalization": "5.46.3", "@algolia/client-query-suggestions": "5.46.3", "@algolia/client-search": "5.46.3", "@algolia/ingestion": "1.46.3", "@algolia/monitoring": "1.46.3", "@algolia/recommend": "5.46.3", "@algolia/requester-browser-xhr": "5.46.3", "@algolia/requester-fetch": "5.46.3", "@algolia/requester-node-http": "5.46.3" } }, "sha512-n/NdPglzmkcNYZfIT3Fo8pnDR/lKiK1kZ1Yaa315UoLyHymADhWw15+bzN5gBxrCA8KyeNu0JJD6mLtTov43lQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.27", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001792", "", {}, "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -361,79 +454,77 @@ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "cheerio": ["cheerio@1.2.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], - "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], - "copy-anything": ["copy-anything@4.0.5", "", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="], + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie-es": ["cookie-es@2.0.1", "", {}, "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA=="], + + "crossws": ["crossws@0.4.5", "", { "peerDependencies": { "srvx": ">=0.11.5" }, "optionalPeers": ["srvx"] }, "sha512-wUR89x/Rw7/8t+vn0CmGDYM9TD6VtARGb0LD5jq2wjtMy1vCP4M+sm6N6TigWeTYvnA8MoW29NqqXD0ep0rfBA=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], - - "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], - - "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="], - - "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], - - "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="], - - "d3-geo-voronoi": ["d3-geo-voronoi@2.1.0", "", { "dependencies": { "d3-array": "3", "d3-delaunay": "6", "d3-geo": "3", "d3-tricontour": "1" } }, "sha512-kqE4yYuOjPbKdBXG0xztCacPwkVSK2REF1opSNrnqqtXJmNcM++UbwQ8SxvwP6IQTj9RvIjjK4qeiVsEfj0Z2Q=="], - - "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], - - "d3-octree": ["d3-octree@1.1.0", "", {}, "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A=="], - - "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], - - "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="], - - "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], - - "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], - - "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], - - "d3-tricontour": ["d3-tricontour@1.1.0", "", { "dependencies": { "d3-delaunay": "6", "d3-scale": "4" } }, "sha512-G7gHKj89n2owmkGb6WX6ixcnQ0Kf/0wpa9VIh9DGdbHu8wdrlaHU4ir3/bFNERl8N8nn4G7e7qbtBG8N9caihQ=="], - - "data-bind-mapper": ["data-bind-mapper@1.0.3", "", { "dependencies": { "accessor-fn": "1" } }, "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw=="], + "db0": ["db0@0.3.4", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="], "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], - "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], - - "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], - "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "earcut": ["earcut@3.0.2", "", {}, "sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ=="], + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], - "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.351", "", {}, "sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA=="], + + "encoding-sniffer": ["encoding-sniffer@0.2.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" } }, "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw=="], "enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="], "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + "env-runner": ["env-runner@0.1.7", "", { "dependencies": { "crossws": "^0.4.4", "exsolve": "^1.0.8", "httpxy": "^0.5.0", "srvx": "^0.11.13" }, "peerDependencies": { "@netlify/runtime": "^4", "miniflare": "^4.20260317.3" }, "optionalPeers": ["@netlify/runtime", "miniflare"], "bin": { "env-runner": "dist/cli.mjs" } }, "sha512-i7h96jxETJYhXy5grgHNJ9xNzCzWIn9Ck/VkkYgOlE4gOqknsLX3CmlVb5LmwNex8sOoLFVZLz+TIw/+b5rktA=="], + + "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], + + "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], + + "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -441,109 +532,193 @@ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "esrap": ["esrap@2.2.6", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-WN0clHt0a4mzC780UBVVBpsj4vSSjOFNRd2WjYtduB9HeKxm1sjHMNUwLEHVjI3FdCQD/Hurgz9ftbKEzP79Ow=="], + + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], + + "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], + + "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], + + "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], - "fault": ["fault@2.0.1", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "float-tooltip": ["float-tooltip@1.7.5", "", { "dependencies": { "d3-selection": "2 - 3", "kapsule": "^1.16", "preact": "10" } }, "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg=="], + "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], - "focus-trap": ["focus-trap@7.8.0", "", { "dependencies": { "tabbable": "^6.4.0" } }, "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "frame-ticker": ["frame-ticker@1.0.3", "", { "dependencies": { "simplesignal": "^2.1.6" } }, "sha512-E0X2u2JIvbEMrqEg5+4BpTqaD22OwojJI63K7MdKHdncjtAhGRbCR8nJCr2vwEt9NWBPCPcu70X9smPviEBy8Q=="], + "framer-motion": ["framer-motion@12.38.0", "", { "dependencies": { "motion-dom": "^12.38.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + "fumadocs-core": ["fumadocs-core@16.8.5", "", { "dependencies": { "@orama/orama": "^3.1.18", "estree-util-value-to-estree": "^3.5.0", "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", "js-yaml": "^4.1.1", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.0.2", "tinyglobby": "^0.2.16", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "@mdx-js/mdx": "*", "@mixedbread/sdk": "0.x.x", "@orama/core": "1.x.x", "@oramacloud/client": "2.x.x", "@tanstack/react-router": "1.x.x", "@types/estree-jsx": "*", "@types/hast": "*", "@types/mdast": "*", "@types/react": "*", "algoliasearch": "5.x.x", "flexsearch": "*", "lucide-react": "*", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0", "react-router": "7.x.x", "waku": "^0.26.0 || ^0.27.0 || ^1.0.0", "zod": "4.x.x" }, "optionalPeers": ["@mdx-js/mdx", "@mixedbread/sdk", "@orama/core", "@oramacloud/client", "@tanstack/react-router", "@types/estree-jsx", "@types/hast", "@types/mdast", "@types/react", "algoliasearch", "flexsearch", "lucide-react", "next", "react", "react-dom", "react-router", "waku", "zod"] }, "sha512-4MRqh/KWtR5Q5+LJd2SFv3nLDHtuZw3q8rwApd9nAWkunHVU30U17fUVq6nY+IDoLs7bSLnvDGvoE+Ynelrn3A=="], - "globe.gl": ["globe.gl@2.45.0", "", { "dependencies": { "@tweenjs/tween.js": "18 - 25", "accessor-fn": "1", "kapsule": "^1.16", "three": ">=0.154 <1", "three-globe": "^2.45", "three-render-objects": "^1.40" } }, "sha512-fjkLHVBrnbESkUgklTd4UbcGLciu4nIl49IIi1hclLjI6MU3ASu6JYmf/K5qwPf7I+tNOauQRr4i5Y28JTtHQg=="], + "fumadocs-mdx": ["fumadocs-mdx@14.2.11", "", { "dependencies": { "@mdx-js/mdx": "^3.1.1", "@standard-schema/spec": "^1.1.0", "chokidar": "^5.0.0", "esbuild": "^0.27.3", "estree-util-value-to-estree": "^3.5.0", "js-yaml": "^4.1.1", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", "picocolors": "^1.1.1", "picomatch": "^4.0.3", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3", "zod": "^4.3.6" }, "peerDependencies": { "@fumadocs/mdx-remote": "^1.4.0", "@types/mdast": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "^15.0.0 || ^16.0.0", "mdast-util-directive": "*", "next": "^15.3.0 || ^16.0.0", "react": "*", "vite": "6.x.x || 7.x.x || 8.x.x" }, "optionalPeers": ["@fumadocs/mdx-remote", "@types/mdast", "@types/mdx", "@types/react", "mdast-util-directive", "next", "react", "vite"], "bin": { "fumadocs-mdx": "dist/bin.js" } }, "sha512-j0gHKs45c62ARteE8/yBM2Nu2I8AE2Cs37ktPEdc/8EX7TL66XP74un5OpHp6itLyWTu8Jur0imOiiIDq8+rDg=="], + + "fumadocs-openapi": ["fumadocs-openapi@10.8.1", "", { "dependencies": { "@fumari/json-schema-ts": "^0.0.2", "@fumari/stf": "1.0.5", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", "ajv": "^8.20.0", "chokidar": "^5.0.0", "class-variance-authority": "^0.7.1", "github-slugger": "^2.0.0", "hast-util-to-jsx-runtime": "^2.3.6", "js-yaml": "^4.1.1", "lucide-react": "^1.11.0", "remark": "^15.0.1", "remark-rehype": "^11.1.2", "shiki": "^4.0.2", "tailwind-merge": "^3.5.0", "xml-js": "^1.6.11" }, "peerDependencies": { "@scalar/api-client-react": "2.0.1", "@types/react": "*", "fumadocs-core": "^16.7.15", "fumadocs-ui": "^16.7.15", "json-schema-typed": "*", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@scalar/api-client-react", "@types/react", "json-schema-typed"] }, "sha512-pImxrxlqTqalD6tfDs2qEtngyM9W1zs0n+xpZ8rKw02pe0unVY8nHlFDGqlW54db8fxlNUC7y0tTa7IbB6gcKQ=="], + + "fumadocs-ui": ["fumadocs-ui@16.8.5", "", { "dependencies": { "@fumadocs/tailwind": "0.0.5", "@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-direction": "^1.1.1", "@radix-ui/react-navigation-menu": "^1.2.14", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tabs": "^1.1.13", "class-variance-authority": "^0.7.1", "lucide-react": "^1.11.0", "motion": "^12.38.0", "next-themes": "^0.4.6", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", "shiki": "^4.0.2", "tailwind-merge": "^3.5.0", "unist-util-visit": "^5.1.0" }, "peerDependencies": { "@takumi-rs/image-response": "*", "@types/mdx": "*", "@types/react": "*", "fumadocs-core": "16.8.5", "next": "16.x.x", "react": "^19.2.0", "react-dom": "^19.2.0" }, "optionalPeers": ["@takumi-rs/image-response", "@types/mdx", "@types/react", "next"] }, "sha512-caJjSfUhNkwoqumOBKfHxE1UjVHxkTsoaUhA96IvCM3G82bU2OKhf1pYtf/GbZ0XVdIlmY8Z47Cqwsze0HlXjg=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], + + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="], - "h3-js": ["h3-js@4.4.0", "", {}, "sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog=="], + "h3": ["h3@2.0.1-rc.22", "", { "dependencies": { "rou3": "^0.8.1", "srvx": "^0.11.15" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"], "bin": { "h3": "bin/h3.mjs" } }, "sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA=="], + + "h3-v2": ["h3@2.0.1-rc.16", "", { "dependencies": { "rou3": "^0.8.0", "srvx": "^0.11.9" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"], "bin": { "h3": "bin/h3.mjs" } }, "sha512-h+pjvyujdo9way8qj6FUbhaQcHlR8FEq65EhTX9ViT5pK8aLj68uFl4hBkF+hsTJAH+H1END2Yv6hTIsabGfag=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "hookable": ["hookable@6.1.1", "", {}, "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], - "index-array-by": ["index-array-by@1.4.2", "", {}, "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw=="], + "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], - "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + "httpxy": ["httpxy@0.5.1", "", {}, "sha512-JPhqYiixe1A1I+MXDewWDZqeudBGU8Q9jCHYN8ML+779RQzLjTi78HBvWz4jMxUD6h2/vUL12g4q/mFM0OUw1A=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - "is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="], + "isbot": ["isbot@5.1.40", "", {}, "sha512-yNeeynhhtIVRBk12tBV4eHNxwB42HzR4Q3Ea7vCOiJhImGaAIdIMrbJtacQlBizGLjUPw+akkFI5Dn9T70XoVQ=="], "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], - "js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "kapsule": ["kapsule@1.16.3", "", { "dependencies": { "lodash-es": "4" } }, "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg=="], + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], - "lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="], + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="], + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="], + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="], + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="], + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="], + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="], + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="], + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="], + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], - - "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="], - - "lodash-es": ["lodash-es@4.17.22", "", {}, "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q=="], + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "lucide-vue-next": ["lucide-vue-next@0.503.0", "", { "peerDependencies": { "vue": ">=3.0.1" } }, "sha512-3MrtHIBdh4dPCUZDLxQnvmQ17UzUnBYgezUSIo87Laais8hOz6qIPllp0iG/uS/UIzk7bJxyZRzoZTW/gLSr4A=="], + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@1.14.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="], + "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], - "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="], + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], - "markdown-it-container": ["markdown-it-container@4.0.0", "", {}, "sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw=="], - - "markdown-it-link-attributes": ["markdown-it-link-attributes@4.0.1", "", {}, "sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ=="], - - "markdown-title": ["markdown-title@1.0.2", "", {}, "sha512-MqIQVVkz+uGEHi3TsHx/czcxxCbRIL7sv5K5DnYw/tI+apY54IbPefV/cmgxp6LoJSEx/TqcHdLs/298afG5QQ=="], + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], - "mdast-util-frontmatter": ["mdast-util-frontmatter@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "escape-string-regexp": "^5.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0" } }, "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA=="], + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], @@ -553,18 +728,40 @@ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], - "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], - "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], - "micromark-extension-frontmatter": ["micromark-extension-frontmatter@2.0.0", "", { "dependencies": { "fault": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg=="], + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], @@ -585,6 +782,8 @@ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], @@ -599,49 +798,79 @@ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], - "millify": ["millify@6.1.0", "", { "dependencies": { "yargs": "^17.0.1" }, "bin": { "millify": "bin/millify" } }, "sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA=="], + "motion": ["motion@12.38.0", "", { "dependencies": { "framer-motion": "^12.38.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-uYfXzeHlgThchzwz5Te47dlv5JOUC7OB4rjJ/7XTUgtBZD8CchMN8qEJ4ZVsUmTyYA44zjV0fBwsiktRuFnn+w=="], - "minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + "motion-dom": ["motion-dom@12.38.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA=="], - "minisearch": ["minisearch@7.2.0", "", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="], - - "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], - - "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + "motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "nf3": ["nf3@0.3.16", "", {}, "sha512-Gs0xRPpUm2nDkqbi40NJ9g7qDIcjcJzgExiydnq6LAyqhI2jfno8wG3NKTL+IiJsx799UHOb1CnSd4Wg4SG4Pw=="], + + "nitro": ["nitro@3.0.260311-beta", "", { "dependencies": { "consola": "^3.4.2", "crossws": "^0.4.4", "db0": "^0.3.4", "env-runner": "^0.1.6", "h3": "^2.0.1-rc.16", "hookable": "^6.0.1", "nf3": "^0.3.11", "ocache": "^0.1.2", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", "rolldown": "^1.0.0-rc.8", "srvx": "^0.11.9", "unenv": "^2.0.0-rc.24", "unstorage": "^2.0.0-alpha.6" }, "peerDependencies": { "dotenv": "*", "giget": "*", "jiti": "^2.6.1", "rollup": "^4.59.0", "vite": "^7 || ^8 || >=8.0.0-0", "xml2js": "^0.6.2", "zephyr-agent": "^0.1.15" }, "optionalPeers": ["dotenv", "giget", "jiti", "rollup", "vite", "xml2js", "zephyr-agent"], "bin": { "nitro": "dist/cli/index.mjs" } }, "sha512-0o0fJ9LUh4WKUqJNX012jyieUOtMCnadkNDWr0mHzdraoHpJP/1CGNefjRyZyMXSpoJfwoWdNEZu2iGf35TUvQ=="], + + "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "ocache": ["ocache@0.1.4", "", { "dependencies": { "ohash": "^2.0.11" } }, "sha512-e7geNdWjxSnvsSgvLuPvgKgu7ubM10ZmTPOgpr7mz2BXYtvjMKTiLhjFi/gWU8chkuP6hNkZBsa9LzOusyaqkQ=="], + + "ofetch": ["ofetch@2.0.0-alpha.3", "", {}, "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="], + "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], - "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parse5-parser-stream": ["parse5-parser-stream@7.1.2", "", { "dependencies": { "parse5": "^7.0.0" } }, "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow=="], "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - "point-in-polygon-hao": ["point-in-polygon-hao@1.2.4", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ=="], + "postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], - "polished": ["polished@4.3.1", "", { "dependencies": { "@babel/runtime": "^7.17.8" } }, "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="], - - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - - "preact": ["preact@10.28.2", "", {}, "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA=="], - - "pretty-bytes": ["pretty-bytes@7.1.0", "", {}, "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw=="], + "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], - "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], + "react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="], + + "react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], + + "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], + + "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], + + "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], + + "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], @@ -649,73 +878,79 @@ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - "reka-ui": ["reka-ui@2.7.0", "", { "dependencies": { "@floating-ui/dom": "^1.6.13", "@floating-ui/vue": "^1.1.6", "@internationalized/date": "^3.5.0", "@internationalized/number": "^3.5.0", "@tanstack/vue-virtual": "^3.12.0", "@vueuse/core": "^12.5.0", "@vueuse/shared": "^12.5.0", "aria-hidden": "^1.2.4", "defu": "^6.1.4", "ohash": "^2.0.11" }, "peerDependencies": { "vue": ">= 3.2.0" } }, "sha512-m+XmxQN2xtFzBP3OAdIafKq7C8OETo2fqfxcIIxYmNN2Ch3r5oAf6yEYCIJg5tL/yJU2mHqF70dCCekUkrAnXA=="], + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], "remark": ["remark@15.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A=="], - "remark-frontmatter": ["remark-frontmatter@5.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-frontmatter": "^2.0.0", "micromark-extension-frontmatter": "^2.0.0", "unified": "^11.0.0" } }, "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ=="], + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + "rolldown": ["rolldown@1.0.0-rc.17", "", { "dependencies": { "@oxc-project/types": "=0.127.0", "@rolldown/pluginutils": "1.0.0-rc.17" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", "@rolldown/binding-darwin-x64": "1.0.0-rc.17", "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA=="], - "rollup": ["rollup@4.55.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.1", "@rollup/rollup-android-arm64": "4.55.1", "@rollup/rollup-darwin-arm64": "4.55.1", "@rollup/rollup-darwin-x64": "4.55.1", "@rollup/rollup-freebsd-arm64": "4.55.1", "@rollup/rollup-freebsd-x64": "4.55.1", "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", "@rollup/rollup-linux-arm-musleabihf": "4.55.1", "@rollup/rollup-linux-arm64-gnu": "4.55.1", "@rollup/rollup-linux-arm64-musl": "4.55.1", "@rollup/rollup-linux-loong64-gnu": "4.55.1", "@rollup/rollup-linux-loong64-musl": "4.55.1", "@rollup/rollup-linux-ppc64-gnu": "4.55.1", "@rollup/rollup-linux-ppc64-musl": "4.55.1", "@rollup/rollup-linux-riscv64-gnu": "4.55.1", "@rollup/rollup-linux-riscv64-musl": "4.55.1", "@rollup/rollup-linux-s390x-gnu": "4.55.1", "@rollup/rollup-linux-x64-gnu": "4.55.1", "@rollup/rollup-linux-x64-musl": "4.55.1", "@rollup/rollup-openbsd-x64": "4.55.1", "@rollup/rollup-openharmony-arm64": "4.55.1", "@rollup/rollup-win32-arm64-msvc": "4.55.1", "@rollup/rollup-win32-ia32-msvc": "4.55.1", "@rollup/rollup-win32-x64-gnu": "4.55.1", "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A=="], + "rou3": ["rou3@0.8.1", "", {}, "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA=="], - "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], - "shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "simplesignal": ["simplesignal@2.1.7", "", {}, "sha512-PEo2qWpUke7IMhlqiBxrulIFvhJRLkl1ih52Rwa+bPjzhJepcd4GIjn2RiQmFSx3dQvsEAgF0/lXMwMN7vODaA=="], + "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], + + "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], + + "shiki": ["shiki@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/engine-javascript": "4.0.2", "@shikijs/engine-oniguruma": "4.0.2", "@shikijs/langs": "4.0.2", "@shikijs/themes": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="], - "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "srvx": ["srvx@0.11.15", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg=="], "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="], - "superjson": ["superjson@2.2.6", "", { "dependencies": { "copy-anything": "^4" } }, "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA=="], + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], - "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="], + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="], "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], - "three": ["three@0.182.0", "", {}, "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ=="], + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - "three-conic-polygon-geometry": ["three-conic-polygon-geometry@2.1.2", "", { "dependencies": { "@turf/boolean-point-in-polygon": "^7.2", "d3-array": "1 - 3", "d3-geo": "1 - 3", "d3-geo-voronoi": "2", "d3-scale": "1 - 4", "delaunator": "5", "earcut": "3" }, "peerDependencies": { "three": ">=0.72.0" } }, "sha512-NaP3RWLJIyPGI+zyaZwd0Yj6rkoxm4FJHqAX1Enb4L64oNYLCn4bz1ESgOEYavgcUwCNYINu1AgEoUBJr1wZcA=="], + "tinyexec": ["tinyexec@1.1.2", "", {}, "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA=="], - "three-geojson-geometry": ["three-geojson-geometry@2.1.1", "", { "dependencies": { "d3-geo": "1 - 3", "d3-interpolate": "1 - 3", "earcut": "3" }, "peerDependencies": { "three": ">=0.72.0" } }, "sha512-dC7bF3ri1goDcihYhzACHOBQqu7YNNazYLa2bSydVIiJUb3jDFojKSy+gNj2pMkqZNSVjssSmdY9zlmnhEpr1w=="], + "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - "three-globe": ["three-globe@2.45.0", "", { "dependencies": { "@tweenjs/tween.js": "18 - 25", "accessor-fn": "1", "d3-array": "3", "d3-color": "3", "d3-geo": "3", "d3-interpolate": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "data-bind-mapper": "1", "frame-ticker": "1", "h3-js": "4", "index-array-by": "1", "kapsule": "^1.16", "three-conic-polygon-geometry": "2", "three-geojson-geometry": "2", "three-slippy-map-globe": "1", "tinycolor2": "1" }, "peerDependencies": { "three": ">=0.154" } }, "sha512-Ur6BVkezvmHnvsEg8fbq6gIscSZtknSQMWwDRbiJ95o6OSDjDbGTc4oO6nP7mOM9aAA3YrF7YZyOwSkP4T56QA=="], - - "three-render-objects": ["three-render-objects@1.40.4", "", { "dependencies": { "@tweenjs/tween.js": "18 - 25", "accessor-fn": "1", "float-tooltip": "^1.7", "kapsule": "^1.16", "polished": "4" }, "peerDependencies": { "three": ">=0.168" } }, "sha512-Ukpu1pei3L5r809izvjsZxwuRcYLiyn6Uvy3lZ9bpMTdvj3i6PeX6w++/hs2ZS3KnEzGjb6YvTvh4UQuwHTDJg=="], - - "three-slippy-map-globe": ["three-slippy-map-globe@1.0.4", "", { "dependencies": { "d3-geo": "1 - 3", "d3-octree": "^1.1", "d3-scale": "1 - 4" }, "peerDependencies": { "three": ">=0.154" } }, "sha512-am8A4PP38AfTdrhXBDucwPRHLTbBl93yhpjIs56K1TLs9VuUWzg68oim4Dibs9QC1riXbj5SoBp/okA1VN9eYg=="], - - "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], - - "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], - - "tokenx": ["tokenx@1.2.1", "", {}, "sha512-lVhFIhR2qh3uUyUA8Ype+HGzcokUJbHmRSN1TJKOe4Y26HkawQuLiGkUCkR5LD9dx+Rtp+njrwzPL8AHHYQSYA=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], @@ -723,56 +958,92 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], + + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + "undici": ["undici@7.25.0", "", {}, "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - "unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="], + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], - "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + + "unstorage": ["unstorage@2.0.0-alpha.7", "", { "peerDependencies": { "@azure/app-configuration": "^1.11.0", "@azure/cosmos": "^4.9.1", "@azure/data-tables": "^13.3.2", "@azure/identity": "^4.13.0", "@azure/keyvault-secrets": "^4.10.0", "@azure/storage-blob": "^12.31.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.13.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.36.2", "@vercel/blob": ">=0.27.3", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "chokidar": "^4 || ^5", "db0": ">=0.3.4", "idb-keyval": "^6.2.2", "ioredis": "^5.9.3", "lru-cache": "^11.2.6", "mongodb": "^6 || ^7", "ofetch": "*", "uploadthing": "^7.7.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "chokidar", "db0", "idb-keyval", "ioredis", "lru-cache", "mongodb", "ofetch", "uploadthing"] }, "sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], - "vite": ["vite@5.4.21", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw=="], + "vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="], - "vitepress": ["vitepress@1.6.4", "", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3", "postcss"], "bin": { "vitepress": "bin/vitepress.js" } }, "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg=="], + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], - "vitepress-openapi": ["vitepress-openapi@0.1.13", "", { "dependencies": { "@vueuse/core": "^13.1.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-vue-next": "^0.503.0", "markdown-it-link-attributes": "^4.0.1", "reka-ui": "^2.2.0" }, "peerDependencies": { "vitepress": ">=1.0.0", "vue": "^3.0.0" } }, "sha512-cu0d07Gn6NCtWCNWtNI91bM41OeLBX5wdKRSCxaC1wZv9RSBNZ35KKT9GW5+Eb0qDx0wBtGeXZ9fIGf5QT3xGA=="], + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], - "vitepress-plugin-group-icons": ["vitepress-plugin-group-icons@1.7.1", "", { "dependencies": { "@iconify-json/logos": "^1.2.10", "@iconify-json/vscode-icons": "^1.2.39", "@iconify/utils": "^3.1.0" }, "peerDependencies": { "vite": ">=3" }, "optionalPeers": ["vite"] }, "sha512-3ZPcIqwHNBg1btrOOSecOqv8yJxHdu3W2ugxE5LusclDF005LAm60URMEmBQrkgl4JvM32AqJirqghK6lGIk8g=="], + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], - "vitepress-plugin-llms": ["vitepress-plugin-llms@1.11.0", "", { "dependencies": { "gray-matter": "^4.0.3", "markdown-it": "^14.1.0", "markdown-title": "^1.0.2", "mdast-util-from-markdown": "^2.0.2", "millify": "^6.1.0", "minimatch": "^10.1.1", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "pretty-bytes": "^7.1.0", "remark": "^15.0.1", "remark-frontmatter": "^5.0.0", "tokenx": "^1.2.1", "unist-util-remove": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-n6fjWzBNKy40p8cij+d2cHiC2asNW1eQKdmc06gX9VAv7vWppIoVLH/f7Ht1bK0vSpGzzW2QimvNfbfv1oCdJw=="], + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], - "vitepress-plugin-tabs": ["vitepress-plugin-tabs@0.7.3", "", { "peerDependencies": { "vitepress": "^1.0.0", "vue": "^3.5.0" } }, "sha512-CkUz49UrTLcVOszuiHIA7ZBvfsg9RluRkFjRG1KvCg/NwuOTLZwcBRv7vBB3vMlDp0bWXIFOIwdI7bE93cV3Hw=="], + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], - "vue": ["vue@3.5.29", "", { "dependencies": { "@vue/compiler-dom": "3.5.29", "@vue/compiler-sfc": "3.5.29", "@vue/runtime-dom": "3.5.29", "@vue/server-renderer": "3.5.29", "@vue/shared": "3.5.29" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA=="], + "xml-js": ["xml-js@1.6.11", "", { "dependencies": { "sax": "^1.2.4" }, "bin": { "xml-js": "./bin/cli.js" } }, "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g=="], - "vue-demi": ["vue-demi@0.14.10", "", { "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "optionalPeers": ["@vue/composition-api"], "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" } }, "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg=="], + "xmlbuilder2": ["xmlbuilder2@4.0.3", "", { "dependencies": { "@oozcitak/dom": "^2.0.2", "@oozcitak/infra": "^2.0.2", "@oozcitak/util": "^10.0.0", "js-yaml": "^4.1.1" } }, "sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@babel/core/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/template/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-select/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@tailwindcss/node/lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], @@ -785,186 +1056,66 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@vue/compiler-core/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/router-generator/@tanstack/router-utils": ["@tanstack/router-utils@1.161.6", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw=="], - "@vue/compiler-core/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], + "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@vue/compiler-dom/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/router-plugin/@tanstack/router-utils": ["@tanstack/router-utils@1.161.6", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw=="], - "@vue/compiler-sfc/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/router-plugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - "@vue/compiler-ssr/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/router-plugin/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@vue/reactivity/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/start-plugin-core/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.40", "", {}, "sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w=="], - "@vue/runtime-core/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/start-plugin-core/@tanstack/router-utils": ["@tanstack/router-utils@1.161.6", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw=="], - "@vue/runtime-dom/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tanstack/start-plugin-core/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@vue/server-renderer/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "@vueuse/integrations/@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="], + "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], - "@vueuse/integrations/@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="], + "htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], - "@vueuse/integrations/vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="], + "mdast-util-to-hast/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], - "js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "mdast-util-to-markdown/unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], - "reka-ui/@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "reka-ui/@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="], + "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "vitepress/@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="], + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "vitepress/vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="], + "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.17", "", {}, "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg=="], - "vitepress-openapi/@vueuse/core": ["@vueuse/core@13.9.0", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "13.9.0", "@vueuse/shared": "13.9.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA=="], + "@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], - "vue/@vue/shared": ["@vue/shared@3.5.29", "", {}, "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg=="], + "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="], - "@vueuse/integrations/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="], + "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="], - "@vueuse/integrations/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.26", "", { "dependencies": { "@vue/compiler-core": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A=="], + "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="], - "@vueuse/integrations/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", "@vue/compiler-dom": "3.5.26", "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA=="], + "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="], - "@vueuse/integrations/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/runtime-core": "3.5.26", "@vue/shared": "3.5.26", "csstype": "^3.2.3" } }, "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ=="], + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="], - "@vueuse/integrations/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.26", "", { "dependencies": { "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "vue": "3.5.26" } }, "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA=="], + "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="], - "reka-ui/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="], + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="], - "reka-ui/@vueuse/core/vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="], + "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="], - "reka-ui/@vueuse/shared/vue": ["vue@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", "@vue/runtime-dom": "3.5.26", "@vue/server-renderer": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA=="], + "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="], - "vitepress-openapi/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@13.9.0", "", {}, "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg=="], + "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], - "vitepress-openapi/@vueuse/core/@vueuse/shared": ["@vueuse/shared@13.9.0", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g=="], + "@tanstack/router-plugin/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "vitepress/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="], + "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "vitepress/@vueuse/core/@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="], - - "vitepress/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.26", "", { "dependencies": { "@vue/compiler-core": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A=="], - - "vitepress/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", "@vue/compiler-dom": "3.5.26", "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA=="], - - "vitepress/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/runtime-core": "3.5.26", "@vue/shared": "3.5.26", "csstype": "^3.2.3" } }, "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ=="], - - "vitepress/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.26", "", { "dependencies": { "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "vue": "3.5.26" } }, "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA=="], - - "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "@vueuse/integrations/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "@vueuse/integrations/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "@vueuse/integrations/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "@vueuse/integrations/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="], - - "@vueuse/integrations/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q=="], - - "@vueuse/integrations/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.26", "", { "dependencies": { "@vue/compiler-core": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", "@vue/compiler-dom": "3.5.26", "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA=="], - - "reka-ui/@vueuse/core/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/runtime-core": "3.5.26", "@vue/shared": "3.5.26", "csstype": "^3.2.3" } }, "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ=="], - - "reka-ui/@vueuse/core/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.26", "", { "dependencies": { "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "vue": "3.5.26" } }, "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.26", "", { "dependencies": { "@vue/compiler-core": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", "@vue/compiler-dom": "3.5.26", "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA=="], - - "reka-ui/@vueuse/shared/vue/@vue/runtime-dom": ["@vue/runtime-dom@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/runtime-core": "3.5.26", "@vue/shared": "3.5.26", "csstype": "^3.2.3" } }, "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ=="], - - "reka-ui/@vueuse/shared/vue/@vue/server-renderer": ["@vue/server-renderer@3.5.26", "", { "dependencies": { "@vue/compiler-ssr": "3.5.26", "@vue/shared": "3.5.26" }, "peerDependencies": { "vue": "3.5.26" } }, "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA=="], - - "vitepress/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "vitepress/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "vitepress/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "vitepress/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "vitepress/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="], - - "vitepress/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q=="], - - "vitepress/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "@vueuse/integrations/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "@vueuse/integrations/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "reka-ui/@vueuse/core/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="], - - "reka-ui/@vueuse/core/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q=="], - - "reka-ui/@vueuse/core/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.26", "", { "dependencies": { "@babel/parser": "^7.28.5", "@vue/shared": "3.5.26", "entities": "^7.0.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "reka-ui/@vueuse/shared/vue/@vue/runtime-dom/@vue/reactivity": ["@vue/reactivity@3.5.26", "", { "dependencies": { "@vue/shared": "3.5.26" } }, "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ=="], - - "reka-ui/@vueuse/shared/vue/@vue/runtime-dom/@vue/runtime-core": ["@vue/runtime-core@3.5.26", "", { "dependencies": { "@vue/reactivity": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q=="], - - "reka-ui/@vueuse/shared/vue/@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.26", "", { "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/shared": "3.5.26" } }, "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw=="], - - "vitepress/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "vitepress/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "vitepress/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "vitepress/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "@vueuse/integrations/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-sfc/@vue/compiler-core/entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], - - "vitepress/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "reka-ui/@vueuse/core/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], - - "reka-ui/@vueuse/shared/vue/@vue/compiler-dom/@vue/compiler-core/@babel/parser/@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], + "@tanstack/router-plugin/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], } } diff --git a/config/site.shared.ts b/config/site.shared.ts new file mode 100644 index 00000000..73ce8f8d --- /dev/null +++ b/config/site.shared.ts @@ -0,0 +1,19 @@ +export const siteDefinition = { + name: 'Coolify', + title: 'Coolify Docs', + description: 'Self hosting with superpowers: an open-source and self-hostable Heroku, Netlify, and Vercel alternative.', + docsBasePath: '/docs', + locale: 'en', + themeColor: '#000000', + keywords: ['Coolify', 'self hosting', 'documentation', 'deployment', 'Docker', 'PaaS'], + og: { + width: 1200, + height: 630, + background: '#000000', + card: '#101418', + accent: '#9333ea', + accentSoft: '#c084fc', + text: '#f8fafc', + muted: '#d8def0', + }, +} as const; diff --git a/content/docs/api-reference/authorization.mdx b/content/docs/api-reference/authorization.mdx new file mode 100644 index 00000000..df827469 --- /dev/null +++ b/content/docs/api-reference/authorization.mdx @@ -0,0 +1,69 @@ +--- +title: Authorization +layout: doc +description: "Learn how to authorize API requests in Coolify with Bearer tokens, scoped permissions, and secure access control." +--- + +# Authorization +API request requires a `Bearer` token in `Authorization` header, which could be generated from the UI. + +## Access + +The API can be accessed through `http://:8000/api`. + +With the exception of `/health` and `/feedback`, all routes are additionally prefixed with `/v1` resulting in the base route `http://:8000/api/v1`. + +## Generate + +1. Go to `Keys & Tokens` / `API tokens`. +2. Define a name for your token and click `Create New Token`. + + + + + You will see the token once, so make sure to copy it and store it in a safe place. + + + + +## Scope + +The token will only be able to access resources that are owned by the team that the token is scoped to. + +```php +# Sample token +3|WaobqX9tJQshKPuQFHsyApxuOOggg4wOfvGc9xa233c376d7 +``` + +## Permissions + + + + +Some API data won't get returned if the API token doesn't have correct permissions + + + + +Currently there are three types of permissions: + +- read-only `(default)` +- read:sensitive +- view:sensitive +- `*` (all permissions) + +### `read-only` + +With this permission, you can only read data from the API, but you can't create, update, or delete any resources. Also you can't see sensitive data. + +### `read:sensitive` + +With this permission, you can only read data from the API and see sensitive information that is normally redacted. You cannot create, update, or delete any resources. + +### `view:sensitive` + +Without this permission, passwords, api keys, and other sensitive data will be redacted from the API response. + +### `*` + +Full access to all resources and sensitive data. diff --git a/content/docs/api-reference/meta.json b/content/docs/api-reference/meta.json new file mode 100644 index 00000000..6bced2b4 --- /dev/null +++ b/content/docs/api-reference/meta.json @@ -0,0 +1,7 @@ +{ + "title": "API Reference", + "pages": [ + "authorization", + "api" + ] +} \ No newline at end of file diff --git a/content/docs/applications/build-packs/docker-compose.mdx b/content/docs/applications/build-packs/docker-compose.mdx new file mode 100644 index 00000000..93d2bc91 --- /dev/null +++ b/content/docs/applications/build-packs/docker-compose.mdx @@ -0,0 +1,244 @@ +--- +title: Docker Compose Build Packs +description: Deploy multi-container applications with Docker Compose using custom domains, magic environment variables, storage volumes, and service networking. +--- + + +
+ +Docker Compose lets you deploy multiple Docker containers and configure them easily. + +With the Docker Compose build pack, you can use your own Docker Compose file (i.e. `docker-compose.y[a]ml`) as the single source of truth, giving you full control over how your application is built and deployed on Coolify. + +## How to use Docker Compose? + +### 1. Create a New Resource in Coolify + +On the Coolify dashboard, open your project and click the **Create New Resource** button. + + + +### 2. Choose Your Deployment Option + + + +**A.** If your Git repository is public, choose the **Public Repository** option. + +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) + +### 3. Select Your Git Repository + +If you are using a public repository, paste the URL of your GitHub repository when prompted. The steps are very similar for all other options. + + + +### 4. Choose the Build Pack + +Coolify defaults to using Nixpacks. Click the Nixpacks option and select **Docker Compose** as your build pack from the dropdown menu. + + + +### 5. Configure the Build Pack + + + +- **Branch:** Coolify will automatically detect the branch in your repository. +- **Base Directory:** Enter the directory that Coolify should use as the root. Use `/` if your files are at the root or specify a subfolder (like `/backend` for a monorepo). +- **Docker Compose Location:** Enter the path to your Docker Compose file, this path is combined with the Base Directory. Make sure the file extension matches exactly, if it doesn’t then Coolify won’t be able to load it. + +Click on **Continue** button once you have set all the above settings to correct details. + +## Making services available to the outside world + +Read more about [Exposing Services to the Internet](/knowledge-base/docker/compose#exposing-services-to-the-internet) in the Knowledge Base. + +## Advanced Configuration + +### Using Environment and Shared Variables + +Within Coolify you can configure these easily following the details found in the [Knowledge Base for Docker Compose](/knowledge-base/docker/compose#defining-environment-and-shared-variables). + +### Storage + +You can set up storage in your compose file, with some extra options for Coolify. + +#### Create an Empty Directory + +Define directories with host binding and inform Coolify to create them: + +```yaml +services: + filebrowser: + image: filebrowser/filebrowser:latest + volumes: + - type: bind + source: ./srv + target: /srv + is_directory: true # Instructs Coolify to create the directory. +``` + +#### Create a File with Content + +Specify a file with predefined content and even include a dynamic value from an environment variable: + +```yaml +services: + filebrowser: + image: filebrowser/filebrowser:latest + environment: + - POSTGRES_PASSWORD=password + volumes: + - type: bind + source: ./srv/99-roles.sql + target: /docker-entrypoint-initdb.d/init-scripts/99-roles.sql + content: | + -- NOTE: Change these passwords for production! + \set pgpass `echo "$POSTGRES_PASSWORD"` + + ALTER USER authenticator WITH PASSWORD :'pgpass'; + ALTER USER pgbouncer WITH PASSWORD :'pgpass'; +``` + +### Exclude from Healthchecks + +If a service should not be part of the overall healthchecks (for example, a one-time migration service), set the `exclude_from_hc` option to `true`: + +```yaml +services: + some-service: + exclude_from_hc: true + ... +``` + +### Networking + +When you deploy a Docker Compose stack, Coolify automatically creates an isolated bridge network (named after your resource UUID, e.g. `ewc08w0`) for all services in your stack. All services can communicate with each other using their service names as hostnames (e.g. `http://backend:8080`). + +Coolify also connects its reverse proxy (Traefik) to this network so it can route external traffic to your services. + +#### Do Not Define Custom Networks + + + + +If your `docker-compose.yml` defines custom networks, **remove them**. Defining custom networks causes intermittent outages where your app becomes unreachable over HTTPS. + + + + +For example, do **not** do this: + +```yaml +services: + frontend: + networks: + - my-network + backend: + networks: + - my-network + +networks: + my-network: + driver: bridge +``` + +When you define a custom network, your containers end up on **two networks** simultaneously — the Coolify-managed one and your custom one. Traefik is only on the Coolify-managed network, but non-deterministically picks which network IP to route to. If it picks the custom network IP, it cannot reach your container and requests will **hang indefinitely** or return **504 Gateway Timeout**. + +This behavior is intermittent — it may work after one deploy and break after the next, depending on which IP Traefik selects. See [#4483](https://github.com/coollabsio/coolify/issues/4483), [#6215](https://github.com/coollabsio/coolify/issues/6215), [#6153](https://github.com/coollabsio/coolify/issues/6153). + +**Instead**, simply remove the `networks:` sections entirely: + +```yaml +services: + frontend: + ... + backend: + ... +``` + +Coolify's auto-created network already provides inter-service communication. + +#### Connect to Predefined Networks + +By default, each compose stack is deployed to a separate network named after your resource UUID. This setup allows each service in the stack to communicate with one another. + +If you want to connect services across different stacks (for example, linking an application to a separate database), enable the **Connect to Predefined Network** option on your Service Stack page. + + + +Note that you must use the full name (like `postgres-`) when referencing a service in another stack. + +### Raw Docker Compose Deployment + +For advanced users, Coolify offers a "Raw Compose Deployment" mode. This option lets you deploy your Docker Compose file directly without many of Coolify's additional configurations. + + + + + + +This mode is intended for advanced users familiar with Docker Compose. + + + + +### Labels + +Coolify automatically adds these labels to your application (if not already set): + +```yaml +labels: + - coolify.managed=true + - coolify.applicationId=5 + - coolify.type=application +``` + +To enable Coolify's Proxy (Traefik), also include these labels: + +```yaml +labels: + - traefik.enable=true + - "traefik.http.routers..rule=Host(`shadowarcanist.com`) && PathPrefix(`/`)" + - traefik.http.routers..entryPoints=http +``` + +### Build Arguments + +When building images with Docker Compose, Coolify can inject build arguments into your build process. You can configure these settings in the **Advanced** menu of your application. + +#### Inject Build Args to Dockerfile + +Controls whether Coolify automatically injects build arguments during the build. Disable this in the Advanced menu if you want full control over build arguments in your Dockerfile. + +- **Enabled (default):** Coolify automatically injects build arguments +- **Disabled:** You manage `ARG` statements yourself in the Dockerfile + +#### Include Source Commit in Build + +Controls whether the `SOURCE_COMMIT` variable (Git commit hash) is included in builds. Disabled by default to preserve Docker's build cache between commits. You can enable this in the Advanced menu if your build process requires the commit hash. + +- **Disabled (default):** `SOURCE_COMMIT` is not included, improving cache utilization +- **Enabled:** `SOURCE_COMMIT` is included as a build argument + + + + +If build cache is not being preserved between deployments, ensure "Include Source Commit in Build" is disabled. The `SOURCE_COMMIT` value changes with every commit and will invalidate the cache. + + + + +## Known Issues and Solutions + + +
+1. Visiting the Application Domain Shows "No Available Server" + +If you see a "No Available Server" error when visiting your website, it is likely due to the health check for your container. + +Run `docker ps` on your server terminal to check if your container is unhealthy or still starting. + +To resolve this, fix the issue causing the container to be unhealthy or remove the health checks. + +
+ diff --git a/content/docs/applications/build-packs/dockerfile.mdx b/content/docs/applications/build-packs/dockerfile.mdx new file mode 100644 index 00000000..dd6d4fe1 --- /dev/null +++ b/content/docs/applications/build-packs/dockerfile.mdx @@ -0,0 +1,136 @@ +--- +title: Dockerfile Build Pack +description: Build Docker images from your custom Dockerfile with Coolify supporting Git repositories, environment variables, and pre/post-deployment commands. +--- + + + +
+ +Dockerfile includes step-by-step instructions to build a Docker image that Coolify uses to deploy your application or website. + +The Dockerfile build pack allows you to use your own Dockerfile to deploy your application, you have complete control over how your application is built and deployed on Coolify. + +## How to use Dockerfile? + +### 1. Create a New Resource in Coolify + +On the Coolify dashboard, open your project and click the **Create New Resource** button. + + + +### 2. Choose Your Deployment Option + + + +**A.** If your Git repository is public, choose the **Public Repository** option. + +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) + +### 3. Select Your Git Repository + +If you are using a public repository, paste the URL of your GitHub repository when prompted. The steps are very similar for all other options. + + + +### 4. Choose the Build Pack + +Coolify defaults to using Nixpacks. Click the Nixpacks option and select **Dockerfile** as your build pack from the dropdown menu. + + + +### 5. Configure the Build Pack + + + +- **Branch:** Coolify will automatically detect the branch in your repository. +- **Base Directory:** Enter the directory that Coolify should use as the root. Use `/` if your files are at the root or specify a subfolder (like `/backend` for a monorepo). + +Click on **Continue** button once you have set all the above settings to correct details. + +### 6. Configure Network Settings + +After clicking **Continue**, update settings like your domain and environment variables (if needed). + +The important option is the port where your application runs. +Coolify sets the default port to 3000, so if your application listens on a different port, update the port number on the network section. + + + +## Advanced Configuration + +### Environment Variables + +You can manage your environment variables from the Coolify UI. + +Click on the **Environment Variables** tab to add or update them. + + + +### Pre/Post Deployment Commands + + +- **Pre-deployment:** Optionally, specify a script or command to execute in the existing container before deployment begins. This command is run with `sh -c`, so you do not need to add it manually. +- **Post-deployment:** Optionally, specify a script or command to execute in the newly built container after deployment completes. This command is also executed with `sh -c`. + +### Build Arguments + +Coolify automatically injects build arguments into your Dockerfile during the build process. These include environment variables you've configured and predefined system values like `SOURCE_COMMIT`. + +You can configure these settings in the **Advanced** menu of your application. + +#### Inject Build Args to Dockerfile + +By default, Coolify injects Docker build arguments (`ARG` statements) into your Dockerfile. If you prefer to manage build arguments manually in your Dockerfile, you can disable this behavior in the Advanced menu. + +- **Enabled (default):** Coolify automatically injects build arguments +- **Disabled:** You manage `ARG` statements yourself in the Dockerfile + +#### Include Source Commit in Build + +The `SOURCE_COMMIT` variable contains the Git commit hash of your source code. By default, this is excluded from the build to preserve Docker's build cache. You can enable this in the Advanced menu if needed. + +- **Disabled (default):** `SOURCE_COMMIT` is not included, improving cache utilization +- **Enabled:** `SOURCE_COMMIT` is included as a build argument + + + + +Enabling "Include Source Commit in Build" will cause Docker's build cache to be invalidated on every commit, since the commit hash changes each time. Only enable this if your build process requires the commit hash. + + + + +### Node.js Multi-Core Scaling + +A plain Node.js process only uses one CPU core. To make a Node.js (or Bun) app use every core on the host from a single Dockerfile build, see the [Node.js Multi-Core Scaling](/knowledge-base/nodejs-multi-core-scaling) guide. + +## Known Issues and Solutions + + +
+1. Visiting the Application Domain Shows "No Available Server" + +If you see a "No Available Server" error when visiting your website, it is likely due to the health check for your container. + +Run `docker ps` on your server terminal to check if your container is unhealthy or still starting. + +To resolve this, fix the issue causing the container to be unhealthy or remove the health checks. + +
+ + + +
+2. App only works inside the Container + +If your app works when you check it with a `curl localhost` inside the container but you receive a 404 or "No Available Server" error when accessing your domain, verify the port settings. + +Make sure that the port in the network settings matches the port where your application is listening. Also, check the startup log to ensure the application is not only listening on localhost. + + + +If needed, change it to listen on all interfaces (for example, `0.0.0.0`). + +
+ diff --git a/content/docs/applications/build-packs/index.mdx b/content/docs/applications/build-packs/index.mdx new file mode 100644 index 00000000..26bd2663 --- /dev/null +++ b/content/docs/applications/build-packs/index.mdx @@ -0,0 +1,54 @@ +--- +title: Build Packs +description: Choose from Nixpacks, Static, Dockerfile, or Docker Compose build packs to create optimized Docker images for your application deployments. +--- + + + +
+ +Coolify deploys every application as a Docker container. This means your application runs in its own isolated container. + +To run a container, you need a Docker image built from your source code. + +Build packs helps to create this Docker image and manage the build and deployment process. + + +## Why Use Build Packs? + +- **Simplifies the Build Process:** Some Build packs automatically create the Docker image needed for deployment, so you don’t have to spend time on learning how to write Dockerfiles on your own. + +- **Flexibility for Different Projects:** Since every application is different, you can choose a build pack that suits your specific needs, whether you prefer an automated solution or a custom configuration. + + +## How Build Packs Work + +Each build pack offers a different approach to building your Docker image: + +- **Automated Dockerfile Creation:** Build packs like Nixpacks & Static Build Pack automatically generate a Dockerfile based on your codebase and builds the docker image. + - This allows you to deploy your application quickly without having to write the Dockerfile yourself. + +- **Custom Dockerfile or Docker Compose:** Build packs like Dockerfile & Docker Compose let you use a Dockerfile or Docker Compose file that you have already have on your codebase. + - This gives you full control over how your Docker image is built and how multiple services work together. + + +## Choose the Right Build Pack + +Coolify have four build packs to meet different requirements: +- **Nixpacks:** Good for quick and automated Docker image creation with minimal configuration. + +- **Static Build Pack:** Perfect for static sites and simple applications that don’t need server-side processing. + +- **Dockerfile:** Use your own Dockerfile, if you want full control over the docker image build process. + +- **Docker Compose:** Perfect to Deploy complex, multi-service applications using your custom Docker Compose file. + + +## How to use a Build Pack + +Each build pack has its own step-by-step guide to help you use them in Coolify. Click the links below to learn more about each build pack. + +- [Static Build Pack](/applications/build-packs/static) +- [Nixpack](/applications/build-packs/nixpacks) +- [Dockerfile](/applications/build-packs/dockerfile) +- [Docker Compose](/applications/build-packs/docker-compose) diff --git a/content/docs/applications/build-packs/meta.json b/content/docs/applications/build-packs/meta.json new file mode 100644 index 00000000..9edad021 --- /dev/null +++ b/content/docs/applications/build-packs/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Build Packs", + "pages": [ + "static", + "nixpacks", + "dockerfile", + "docker-compose" + ] +} \ No newline at end of file diff --git a/content/docs/applications/build-packs/nixpacks/index.mdx b/content/docs/applications/build-packs/nixpacks/index.mdx new file mode 100644 index 00000000..4667b65e --- /dev/null +++ b/content/docs/applications/build-packs/nixpacks/index.mdx @@ -0,0 +1,171 @@ +--- +title: Nixpacks Build Pack +description: Build applications with Nixpacks automatic buildpack detecting your codebase, generating Dockerfiles, and deploying static sites or dynamic apps. +--- + + + +
+ +Nixpacks is a open source build pack created by [Railway](https://railway.com?utm_source=coolify.io) and the source is available on [Github](https://github.com/railwayapp/nixpacks?utm_source=coolify.io). Coolify uses Nixpacks as one of the build pack. + +Nixpacks checks your git repository (also called as "**source directory**" in nixpacks) and generates a Dockerfile, then it will build a docker image based on the Dockerfile it generated. + +Nixpacks can deploy both fully static websites and non-static applications. Once your repository is set up, you can use Coolify to deploy your project with ease. + +## How to use Nixpacks? + +On Coolify you can only use Nixpacks on git-based deployments. + +### 1. Create a New Resource in Coolify + +On Coolify dashboard open your project and click the **Create New Resource** button. + + + +### 2. Choose Your Deployment Option + + + +**A.** If your Git repository is public, choose the **Public Repository** option. + +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) + +### 3. Select Your Git Repository + +If you are using a public repository, paste the URL of your GitHub repository when prompted. The steps are very similar for all other options. + + + +### 4. Choose the Build Pack + +Coolify will default to using Nixpacks. If it doesn’t, click to select Nixpacks as your build pack. + + + +### 5. Configure Build Pack + +We have different options like Base Directory, Publish Directory, and Ports that slightly change based on the application you deploy (static websites/applications). So, below we have two sections for the deployments possible with Nixpacks. + +- [How to deploy Fully Static Websites](#how-to-deploy-fully-static-website) +- [How to deploy Non-Static Website/Applications](#how-to-deploy-non-static-website-applications) + +## How to deploy Fully Static Website? + +First, follow the previous section in this documentation: [How to use Nixpacks](#how-to-use-nixpacks). After that, proceed with the steps below. + + + +1. **Branch:** Coolify will automatically detect the branch from your Repository. + +2. **Base Directory:** Enter the directory Nixpacks should use as the root (for example, `/` if your files are at the root, or a subfolder if applicable). + + - If you have a monorepo then you can enter the path of the directory you want to use as base directory (`/backend` for example) + +3. **Is it a static Site?:** Click on this option to enable static mode. + +4. **Port:** Once you enabled `Is it a static Site` the port will be automatically set to `80` and cannot be changed. (This is intentional) + +5. **Publish Directory:** Once you enabled `Is it a static Site` this publish directory option will visible on the UI. You have to enter the output directory where your static files are generated (commonly `/dist`). + +6. Click on **Continue** button once you have set all the above settings to correct details. + +7. Choose a web server for your static website + + + +- As of Coolify **v4.0.0-beta.404**, the only web server option available is [Nginx](https://nginx.org/en/?utm_source=coolify.io). So **Nginx** will be selected by default. + +8. Click the **Deploy** button. The deployment process is usually quick (often less than a minute, depending on your server). + +9. Customize Your Web Server Configuration `Optional` + + + +- Coolify provides a default web server configuration that works for most cases. + +- If you want to change it then click the **Generate** button to load the default settings and make any changes you need. + + + + +You have to click on the **Restart** button for the new configuration to take effect. + + + + +### How this works? + +Nixpacks will build the website using your codebase and create a Docker image with a web server to serve them. This means your final Docker image has a web server ready to serve your HTML, CSS, and JavaScript files. + +## How to deploy Non-Static Website/Applications? + +First, follow the previous section in this documentation: [How to use Nixpacks](#how-to-use-nixpacks). After that, proceed with the steps below. + + + +1. **Branch:** Coolify will automatically detect the branch from your Repository. + +2. **Base Directory:** Enter the directory Nixpacks should use as the root (for example, `/` if your files are at the root, or a subfolder if applicable). + + - If you have a monorepo then you can enter the path of the directory you want to use as base directory (`/backend` for example) + +3. **Port:** Enter the port where your application listens for incoming requests. + +4. **Is it a static Site?:** Leave this unchecked since you’re deploying a non-static application. + +5. Click on **Continue** button once you have configured all the above options. + +6. After clicking the **Continue** button, you can adjust settings like your domain and environment variables, then click the **Deploy** button to launch your application. + +### How this works? + +Nixpacks analyzes your codebase, builds a Docker image, and then starts a container using that image. + +## Advanced Configuration + +### Environment Variables + +You can customize Nixpacks' behavior using environment variables. There are many variables available for different application frameworks, and you can find detailed information in their documentation: [Nixpacks Environment Variables](https://nixpacks.com/docs/configuration/environment?utm_source=coolify.io). + +To add or modify environment variables in Coolify, simply click on the **Environment Variables** tab, where you can manage them easily. + + + +--- + +### Commands + +If needed, you can override the default install, build, and start commands. Simply scroll down to the build section on Coolify and input your custom commands. + + + + + + +You may need to include a `nixpacks.toml` file in your repository for these changes to take effect. + + + + +--- + +### Configuration file + +Nixpacks supports specifying build configurations in a nixpacks.toml or nixpacks.json file. If one of these files is present in the root of your repository, it will be automatically used. For more details, refer to the [Nixpacks documentation](https://nixpacks.com/docs/configuration/file?utm_source=coolify.io). + +--- + +### Node.js Multi-Core Scaling + +A plain Node.js process only uses one CPU core. To make a Node.js (or Bun) app use every core on the host from a single Nixpacks build, see the [Node.js Multi-Core Scaling](/knowledge-base/nodejs-multi-core-scaling) guide. + +## Known Issues + +### Outdated Packages/Dependencies + +Sometimes, Nixpacks may use older package versions than you need. This is especially common with Node.js, where you might need a specific minor or patch version. + +For Node.js version pinning, see the dedicated [Node.js Versioning](/applications/build-packs/nixpacks/node-versioning) guide. + +For other packages, you can update the `nixpkgs` archive version in your `nixpacks.toml` file. Learn more in the Nixpacks docs on [nixpkgs archive](https://nixpacks.com/docs/configuration/file#nixpkgs-archive?utm_source=coolify.io). diff --git a/content/docs/applications/build-packs/nixpacks/meta.json b/content/docs/applications/build-packs/nixpacks/meta.json new file mode 100644 index 00000000..bddc1190 --- /dev/null +++ b/content/docs/applications/build-packs/nixpacks/meta.json @@ -0,0 +1,5 @@ +{ + "pages": [ + "node-versioning" + ] +} \ No newline at end of file diff --git a/content/docs/applications/build-packs/nixpacks/node-versioning.mdx b/content/docs/applications/build-packs/nixpacks/node-versioning.mdx new file mode 100644 index 00000000..caad6a4f --- /dev/null +++ b/content/docs/applications/build-packs/nixpacks/node-versioning.mdx @@ -0,0 +1,167 @@ +--- +title: Node.js Versioning +description: How to pin specific Node.js minor and patch versions in Nixpacks using nixpkgs archive overrides. +--- + +# Node.js Versioning in Nixpacks + +Nixpacks only supports **major version** specification for Node.js. This page explains the limitation and provides a workaround for pinning specific minor or patch versions. + +## Understanding the Limitation + +According to the [Nixpacks Node provider documentation](https://nixpacks.com/docs/providers/node?utm_source=coolify.io): + +> "Only a major version can be specified. For example, `18.x` or `20`." + +When you specify a Node.js version via: + +- `NIXPACKS_NODE_VERSION` environment variable +- `engines.node` in `package.json` +- `.nvmrc` or `.node-version` files + +You can only control the **major version** (e.g., `20`, `22`). The specific minor and patch version (e.g., `22.13.1` vs `22.14.0`) is determined by the nixpkgs archive that Nixpacks uses internally. + +## The Problem + +You set `"node": ">=22"` in your `package.json` or `NIXPACKS_NODE_VERSION=22`, but your application needs Node 22.14.0 specifically. Nixpacks may instead provide 22.12.0 or another patch version from its default nixpkgs archive—causing runtime issues if your code depends on features from a newer patch. + +## Workaround + +To pin a specific minor/patch version, you can override the nixpkgs archive in your `nixpacks.toml` file. Create this file in your repository root: + +```toml +[phases.setup] +nixpkgsArchive = '51ad838b03a05b1de6f9f2a0fffecee64a9788ee' +``` + +The `nixpkgsArchive` value is a commit SHA from the [NixOS/nixpkgs repository](https://github.com/NixOS/nixpkgs?utm_source=coolify.io). Each commit contains specific package versions, so by pinning a commit, you control the exact versions available. + +## Finding the Right Archive Commit + +To find a nixpkgs commit containing your required Node.js version: + +1. Browse the [NixOS/nixpkgs repository](https://github.com/NixOS/nixpkgs?utm_source=coolify.io) +2. Search for files like `v20.nix`, `v22.nix`, or `v24.nix` (the Node.js version definition files) +3. Check the commit history for when your desired version was added +4. Copy the full commit SHA + +**Some verified commits for Node.js:** + +- `51ad838b03a05b1de6f9f2a0fffecee64a9788ee` → Node 22.13.1 +- `bf744fe90419885eefced41b3e5ae442d732712d` → Node 22.x versions +- `ffeebf0acf3ae8b29f8c7049cd911b9636efd7e7` → Node 22.14.0 (unstable branch) + +Learn more in the Nixpacks docs on [nixpkgs archive](https://nixpacks.com/docs/configuration/file#nixpkgs-archive?utm_source=coolify.io). + +## Node.js Version Reference (SHA256 Hashes) + +The following tables list Node.js versions and their SHA256 hashes from the nixpkgs history. These can help you verify you're getting the expected version when working with nixpkgs archives. + + + + +These hashes are provided for reference only. They have not been verified for accuracy nor stability. Test thoroughly before using in production. + + + + +### Node.js 20.x + +| Version | SHA256 | +| ------- | :------------------------------------------------------------------ | +| 20.0.0 | `sha256-dFDnV5Vo99HLOYGFz85HLaKDeyqjbFliCyLOS5d7XLU=` | +| 20.1.0 | `sha256-YA+eEYYJlYFLkSKxrFMY9q1WQnR4Te7ZjYqSBmSUNrU=` | +| 20.2.0 | `sha256-IlI98jFsNVaXFP8fabBTwuKGztRgiYQX3uRpRe/N+Yk=` | +| 20.3.0 | `sha256-G6jUlCPtOnVykGa7PqJkk+6ct9ZWjvlIWX/J70VPdDU=` | +| 20.3.1 | `sha256-EqgtswZpeVm0OJs1Gl+XhImGsTE/mQGw4LPYz08/mZE=` | +| 20.4.0 | `sha256-Cb0Lc8UmtjwCnV3f2IXRCWLnrYfJdblFg8H4zpDuU0g=` | +| 20.5.0 | `sha256-yzJ1aVje8cBOBpp5txtSymHtFZDBfyz6HuOvZB9y4Fg=` | +| 20.5.1 | `sha256-Q5xxqi84woYWV7+lOOmRkaVxJYBmy/1FSFhgScgTQZA=` | +| 20.6.0 | `sha256-nvtcunqPSxjTiw19N6mzDe1zOQyE44DPTeianTCn1vo=` | +| 20.6.1 | `sha256-Ouxeco2qOIAMNDsSkiHTSIBkolKaObtUZ7xVviJsais=` | +| 20.7.0 | `sha256-P8/c0FxGFRdIBZZZZnTfhbNc/OWX3QrjP1QW/E3xK+o=` | +| 20.8.0 | `sha256-QSvoR65t9hAQup2jzD5r5bZ6oALjVOkZ9Z7INgNxcEw=` | +| 20.8.1 | `sha256-95nGb2pjhruKwsdaN490DEVel/H+lkOT3TnJ+fbvvHA=` | +| 20.9.0 | `sha256-oj2WgQq/BFVCazSdR85TEPMwlbe8BXG5zFEPSBw6RRk=` | +| 20.10.0 | `sha256-MuslbuvYys1VdOZjHlS0K+fsjr4lrUeoymhUA7rRVTU=` | +| 20.11.0 | `sha256-MYB+vu6wScU/F2XkqVrtaUdqS2lt0QDLU5q2aNeVC0A=` | +| 20.11.1 | `sha256-d4E+2/P38W0tNdM1NEPe5OYdXuhNnjE4x1OKPAylIJ4=` | +| 20.12.0 | `sha256-duU0bOv9WBUo9pn3ZPTRpuh8uBi2lnCPI13ctiWg940=` | +| 20.12.1 | `sha256-aEDUkLpNHVFlXg++EgmVahXbQFUQ1+oWa62YqMnTek4=` | +| 20.12.2 | `sha256-18vMX7+zHpAB8/AVC77aWavl3XE3qqYnOVjNWc41ztc=` | +| 20.14.0 | `sha256-CGVQKPDYQ26IFj+RhgRNY10/Nqhe5Sjza9BbbF5Gwbs=` | +| 20.15.0 | `sha256-D0p6BRw12V65BejLKqQ8XUArExIDkI/mM+s8+gUO+Qc=` | +| 20.15.1 | `sha256-/dU6VynZNmkaKhFRBG+0iXchy4sPyir5V4I6m0D+DDQ=` | +| 20.16.0 | `cd6c8fc3ff2606aadbc7155db6f7e77247d2d0065ac18e2f7f049095584b8b46` | +| 20.17.0 | `9abf03ac23362c60387ebb633a516303637145cb3c177be3348b16880fd8b28c` | +| 20.18.0 | `7d9433e91fd88d82ba8de86e711ec41907638e227993d22e95126b02f6cd714a` | +| 20.18.1 | `91df43f8ab6c3f7be81522d73313dbdd5634bbca228ef0e6d9369fe0ab8cccd0` | +| 20.18.2 | `69bf81b70f3a95ae0763459f02860c282d7e3a47567c8afaf126cc778176a882` | +| 20.18.3 | `0674f16f3bc284c11724cd3f7c2a43f7c2c13d2eb7a872dd0db198f3d588c5f2` | +| 20.19.0 | `5ac2516fc905b6a0bc1a33e7302937eac664a820b887cc86bd48c035fba392d7` | +| 20.19.1 | `5587b23e907d0c7af2ea8a8deb33ec50010453b46dbb3df5987c5678eee5ed51` | +| 20.19.2 | `4a7ff611d5180f4e420204fa6f22f9f9deb2ac5e98619dd9a4de87edf5b03b6e` | +| 20.19.3 | `99be7b9d268d48b93be568a23240398ceacb0782dc7055b9972305c000b0e292` | +| 20.19.4 | `b87fd7106013d3906706913ffc63a4403715fbb272c4f83ff4338527353eec0f` | +| 20.19.5 | `230c899f4e2489c4b8d2232edd6cc02f384fb2397c2a246a22e415837ee5da51` | +| 20.19.6 | `2026f9ff52c286d7c7d99932b21be313d1736aea524c5aff1748d41ab0bd9a20` | + +### Node.js 22.x + +| Version | SHA256 | +| ------- | :------------------------------------------------------------------ | +| 22.0.0 | `sha256-IuKPv/MfaQc7gCTLQnReUQX4QEHzR1smC5fVoUEDnRo=` | +| 22.1.0 | `sha256-nX1fQNnb1iYMmbXklLX5vHVejw/6xw4SGtzl+0QvI8s=` | +| 22.2.0 | `sha256-iJkIqIKNFISRDX5lm2qlet6NUo/w45Dpp372WadihHQ=` | +| 22.3.0 | `0k0h4s9s2y0ms3g6xhynsqsrkl9hz001dmj6j0gpc5x5vk8mpf5z` | +| 22.4.0 | `sha256-KStDAITy8ykT3H2k6y+8iWklJ3Kp0b/ormxLSpjKOtM=` | +| 22.4.1 | `sha256-ZfyFf1qoJWqvyQCzRMARXJrq4loCVB/Vzg29Tf0cX7k=` | +| 22.5.1 | `924f381a32cf26b6bedbe95feedde348450f4fd321283d3bf3f7965aa45ce831` | +| 22.6.0 | `37259d618d5565ca55acc2585045c7e1c5b9965a3d4eb44c0a237fdae84b9d44` | +| 22.7.0 | `1e0b6f2f2ca4fb0b4644a11363169daf4b7c42f00e5a53d2c65a9fdc463e7d88` | +| 22.8.0 | `f130e82176d1ee0702d99afc1995d0061bf8ed357c38834a32a08c9ef74f1ac7` | +| 22.9.0 | `a55aeb368dee93432f610127cf94ce682aac07b93dcbbaadd856df122c9239df` | +| 22.10.0 | `3180710d3130ad9df01466abf010e408d41b374be54301d1480d10eca73558e0` | +| 22.11.0 | `bbf0297761d53aefda9d7855c57c7d2c272b83a7b5bad4fea9cb29006d8e1d35` | +| 22.12.0 | `fe1bc4be004dc12721ea2cb671b08a21de01c6976960ef8a1248798589679e16` | +| 22.13.1 | `cfce282119390f7e0c2220410924428e90dadcb2df1744c0c4a0e7baae387cc2` | +| 22.14.0 | `c609946bf793b55c7954c26582760808d54c16185d79cb2fb88065e52de21914` | +| 22.15.0 | `e7c4226d1d92f33ad854d6da4f7e519e77690b8e73f93496881f8c539174d9df` | +| 22.15.1 | `c19f0177d21c621746625e5f37590bd0d79a72043b77b53784cba5f145e7263e` | +| 22.16.0 | `720894f323e5c1ac24968eb2676660c90730d715cb7f090be71a668662a17c37` | +| 22.17.0 | `7a3ef2aedb905ea7926e5209157266e2376a5db619d9ac0cba3c967f6f5db4f9` | +| 22.17.1 | `327415fd76fcebb98133bf56e2d90e3ac048b038fac2676f03b6db91074575b9` | +| 22.18.0 | `120e0f74419097a9fafae1fd80b9de7791a587e6f1c48c22b193239ccd0f7084` | +| 22.19.0 | `0272acfce50ce9ad060288321b1092719a7f19966f81419835410c59c09daa46` | +| 22.20.0 | `ff7a6a6e8a1312af5875e40058351c4f890d28ab64c32f12b2cc199afa22002d` | +| 22.21.1 | `487d73fd4db00dc2420d659a8221b181a7937fbc5bc73f31c30b1680ad6ded6a` | + +### Node.js 24.x + +| Version | SHA256 | +| ----------- | :------------------------------------------------------------------ | +| 24.0.0-rc.2 | `729fca42bb7266031dd020f3935423ea8d4b4e2d119b34b608f1d079e5c1621a` | +| 24.0.0-rc.3 | `9bbca08fba05f075a20f734ea80b195a4a39218476b60b32db79e1d393fda20b` | +| 24.0.0 | `914f3f1b03f84a0994d7357f190ff13c038800c693b6c06da2290eb588c82761` | +| 24.0.1 | `70271026971808409a7ed6444360d5fe3ef4146c1ca53f2ca290c60d214be84e` | +| 24.0.2 | `1597075afc06e5c6145d0bfbd77e2072c2ec0ab71ac4950cf008b2641374cd71` | +| 24.1.0 | `c8171b2aeccb28c8c5347f273a25adae172fb2a65bc8c975bc22ec58949d0eaf` | +| 24.2.0 | `40143d43efbdeeb9537995f532126c494d63a31da332acb5022f76f00afc62ab` | +| 24.3.0 | `eb688ef8a63fda9ebc0b5f907609a46e26db6d9aceefc0832009a98371e992ed` | +| 24.4.0 | `42fa8079da25a926013cd89b9d3467d09110e4fbb0c439342ebe4dd6ecc26bbb` | +| 24.4.1 | `adb79ca0987486ed66136213da19ff17ef6724dcb340c320e010c9442101652f` | +| 24.5.0 | `f1ba96204724bd1c6de7758e08b3718ba0b45d87fb3bebd7e30097874ccc8130` | +| 24.6.0 | `8ad5c387b5d55d8f3b783b0f1b21bae03a3b3b10ac89a25d266cffa7b795e842` | +| 24.7.0 | `cf74a77753b629ffebd2e38fb153a21001b2b7a3c365c0ec7332b120b98c7251` | +| 24.8.0 | `1c03b362ebf4740d4758b9a3d3087e3de989f54823650ec80b47090ef414b2e0` | +| 24.9.0 | `f17bc4cb01f59098c34a288c1bb109a778867c14eeb0ebbd608d0617b1193bbf` | +| 24.10.0 | `f17e36cb2cc8c34a9215ba57b55ce791b102e293432ed47ad63cbaf15f78678f` | +| 24.11.0 | `cf9c906d46446471f955b1f2c6ace8a461501d82d27e1ae8595dcb3b0e2c312a` | +| 24.11.1 | `ea4da35f1c9ca376ec6837e1e30cee30d491847fe152a3f0378dc1156d954bbd` | +| 24.12.0 | `6d3e891a016b90f6c6a19ea5cbc9c90c57eef9198670ba93f04fa82af02574ae` | + +### Node.js 25.x + +| Version | SHA256 | +| ------- | :------------------------------------------------------------------ | +| 25.2.1 | `aa7c4ac1076dc299a8949b8d834263659b2408ec0e5bba484673a8ce0766c8b9` | diff --git a/content/docs/applications/build-packs/static.mdx b/content/docs/applications/build-packs/static.mdx new file mode 100644 index 00000000..64dc4b1b --- /dev/null +++ b/content/docs/applications/build-packs/static.mdx @@ -0,0 +1,97 @@ +--- +title: Static Build Packs +description: Deploy static websites with Nginx web server using pre-built files from Git repositories, supporting Astro, Webstudio, and other static generators. +--- + + + +
+ +Static Build Packs take the files from your project and create a Docker image with a web server to serve them. This means your final Docker image has a web server ready to display your HTML, CSS, and JavaScript files. + +Static Build Packs only work if your project is already built (for example, with a static site generator like [Astro](https://astro.build/?utm_source=coolify.io) or [Webstudio](https://webstudio.is/?utm_source=coolify.io)). Once you have the built files, you can upload them to a Git repository and use Coolify to deploy your site. + +## How to Use Static Build Pack + +### 1. Prepare Your Static Files + +First, build your site with your favorite static site generator. This process creates a folder with all the files your site needs (HTML, CSS, JavaScript, etc.). + +Next, upload these static files to a Git repository. You can use [GitHub](https://github.com/?utm_source=coolify.io), [GitLab](https://about.gitlab.com/?utm_source=coolify.io), or any other Git service. For this guide, we will use [GitHub](https://github.com/?utm_source=coolify.io) as an example. + +### 2. Create a New Resource in Coolify + +On Coolify dashboard open your project and click the **Create New Resource** button. + + + +### 3. Choose Your Deployment Option + + + +**A.** If your Git repository is public, choose the **Public Repository** option. + +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) + +### 4. Select Your Git Repository + +If you are using a public repository, paste the URL of your GitHub repository when prompted. The steps are very similar for all options. + + + +### 5. Choose the Build Pack + +Coolify will default to using Nixpacks. Click on the Nixpack option, and then select **Static** from the dropdown menu. + + + +This tells Coolify to build your image with a static web server. + +### 6. Set the Base Directory + +Enter the path where your static files are located: + + + +- If your files are in the root of your repository, just type `/`. +- If they are in a subfolder, type the path to that folder (for example, `/out`). + +After setting the base directory, click the **Continue** button. + +### 7. Choose a Web Server + +As of Coolify **v4.0.0-beta.402**, the only web server option available is [Nginx](https://nginx.org/en/?utm_source=coolify.io). So **Nginx** will be selected by default. + + + +### 8. Enter Your Domain + +Type the domain name where you want your site to be available. + + + +If you have multiple domains, separate them with commas. + +### 9. Deploy Your Site + +Click the **Deploy** button. The deployment process is usually quick (often less than a minute, depending on your server). + + + +Once the deployment is finished, visit your domain in a browser to see your live site. + +### 10. Customize Your Web Server Configuration `Optional` + +Coolify provides a default web server configuration that works for most cases. + +If you want to change it then click the **Generate** button to load the default settings and make any changes you need. + + + + + + +You have to click on the **Restart** button for the new configuration to take effect. + + + diff --git a/content/docs/applications/ci-cd/bitbucket/integration.mdx b/content/docs/applications/ci-cd/bitbucket/integration.mdx new file mode 100644 index 00000000..5bf97bcc --- /dev/null +++ b/content/docs/applications/ci-cd/bitbucket/integration.mdx @@ -0,0 +1,96 @@ +--- +title: "Integration" +description: "Deploy Bitbucket repositories with Coolify using deploy keys, SSH authentication, and automated webhooks for commits and pull requests." +--- + +# Bitbucket Integration +This guide will show you how to use Bitbucket based repositories with Coolify. + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://bitbucket.com/coolify-test2/coolify-examples` + + + + +You can only use the https URL. + + + + +1. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require a few more steps to setup. + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your Bitbucket repository in the `Repository Settings` / `Access Keys` menu. + + + + + - You can generate a new key pair with the following command: + + ```bash + ssh-keygen -t rsa -b 4096 -C "deploy_key" + ``` + + - Or you can also use Coolify to generate a new key for you in the `Keys & Tokens` menu. + + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@bitbucket.org:coolify-test2/coolify-examples.git` + + + + +You need to use the SSH URL, so the one that starts with `git@`. + + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your Bitbucket repository to trigger a new deployment when you push to your repository. + + + + +This can be set on either public or private repositories. + + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your Bitbucket repository. + +1. Set a secret key in the `Bitbucket Webhook Secret` input field. +2. Go to your repository in Bitbucket and open the `Repository Settings` / `Webhooks` menu as `Repository hooks`. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push` option. +5. That's it! Now when you push to your repository, Bitbucket will send a webhook request to Coolify and it will trigger a new deployment. + +## Merge request deployments with webhooks (Optional) + +You can add a custom webhook URL to your Bitbucket repository to trigger a new deployment when you create a new merge request. + + + + +This can be set on either public or private repositories. + + + + +The process is the same as the previous one. In the `Repository Settings` / `Webhooks` menu, you need to select the following events in the `Pull Request` option: + +- `Created` +- `Updated` +- `Merged` +- `Declined` \ No newline at end of file diff --git a/content/docs/applications/ci-cd/gitea/integration.mdx b/content/docs/applications/ci-cd/gitea/integration.mdx new file mode 100644 index 00000000..8be043e7 --- /dev/null +++ b/content/docs/applications/ci-cd/gitea/integration.mdx @@ -0,0 +1,97 @@ +--- +title: "Integration" +description: "Deploy Gitea repositories with Coolify using deploy keys, SSH authentication, and automated webhooks for commits and pull requests." +--- + +# Gitea Integration + +This guide will show you how to use Gitea based repositories with Coolify. + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://gitea.com/heyandras/coolify-examples` + + + + +You can only use the https URL. + + + + +1. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require a few more steps to setup. + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your Gitea repository in the `Repository Settings` / `Access Keys` menu. + + + + + - You can generate a new key pair with the following command: + + ```bash + ssh-keygen -t rsa -b 4096 -C "deploy_key" + ``` + + - Or you can also use Coolify to generate a new key for you in the `Keys & Tokens` menu. + + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@gitea.com:heyandras/coolify-examples.git` + + + + +You need to use the SSH URL, so the one that starts with `git@`. + + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your Gitea repository to trigger a new deployment when you push to your repository. + + + + +This can be set on either public or private repositories. + + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your Gitea repository. + +1. Set a secret key in the `Gitea Webhook Secret` input field. +2. Go to your repository in Gitea and open the `Repository Settings` / `Webhooks` menu as `Repository hooks`. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push` option. +5. That's it! Now when you push to your repository, Gitea will send a webhook request to Coolify and it will trigger a new deployment. + +## Merge request deployments with webhooks (Optional) + +You can add a custom webhook URL to your Gitea repository to trigger a new deployment when you create a new merge request. + + + + +This can be set on either public or private repositories. + + + + +The process is the same as the previous one. In the `Repository Settings` / `Webhooks` menu, you need to select the following events in the `Pull Request` option: + +- `Created` +- `Updated` +- `Merged` +- `Declined` \ No newline at end of file diff --git a/content/docs/applications/ci-cd/github/actions.mdx b/content/docs/applications/ci-cd/github/actions.mdx new file mode 100644 index 00000000..e11a8d72 --- /dev/null +++ b/content/docs/applications/ci-cd/github/actions.mdx @@ -0,0 +1,161 @@ +--- +title: GitHub Actions +description: Deploy applications using GitHub Actions to build Docker images and trigger redeployments in Coolify. +--- + +# GitHub Actions +GitHub Actions allow you to build your application as a Docker image and deploy it to Coolify automatically. + +GitHub Actions provide greater flexibility for deploying your app, as you can trigger the workflow on events like commits to specific branches or releases on GitHub. You can also integrate checks and tests into your CI/CD pipeline, ensuring that new versions are deployed to Coolify only after all validations pass. + +## Process Overview +Set up GitHub Actions to build and publish a Docker image of your app to a container registry (e.g., GHCR or Docker Hub), then make an API call to Coolify to redeploy your app using the latest image pushed to the registry. + +For reference, check out this [example repository](https://github.com/andrasbacsai/github-actions-with-coolify) and its [workflow file](https://github.com/andrasbacsai/github-actions-with-coolify/blob/main/.github/workflows/build.yaml). + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **Docker Image:** `shadowarcanist/tasklytics:latest` +- **Registry:** `ghcr.io` +- **Branch:** `main` + + + + +## 1. Choose the Right Deployment Type + + +With GitHub Actions, build your application as a Docker image on GitHub runners and push it to a container registry. Select a deployment type that supports prebuilt Docker images. + +For Git-based applications, use Docker Compose as your build pack. In your compose file, pull the prebuilt image instead of building it: + +```yaml +services: + web: + # OLD: + # build: + # context: . + # dockerfile: Dockerfile + + # NEW: + image: ghcr.io/shadowarcanist/tasklytics:latest + ports: + - "8080:8080" +``` + +For Docker-based applications, use the image name like `ghcr.io/shadowarcanist/tasklytics:latest` so Docker pulls the prebuilt image. + +## 2. Enable Coolify API + + +1. Go to the "Settings" page in Coolify. +2. Click on the "Configuration" tab. +3. Click on "Advanced". +4. Check the "API Access" option. + +## 3. Create Coolify API Token + + +1. Go to the "Keys & Tokens" page in Coolify. +2. Click on the "API Tokens" tab. +3. Check the "Deploy" option under Token permissions. +4. Give your API token a name. +5. Click "Create" button. +6. Copy and save the generated API token somewhere safe (you'll need it later). + +## 4. Get Coolify Webhook URL + + +1. Open your application's configuration page. +2. Go to the "Webhook" page. +3. Copy and save the "Deploy webhook" URL somewhere safe (you'll need it later). + +## 5. Set Up Repository Secrets + + +1. Go to your GitHub repository settings. +2. Click "Actions" in the sidebar (under "Secrets and variables"). +3. Click "New repository secret". + + + +4. Enter `COOLIFY_WEBHOOK` as the name. +5. Enter the Coolify deploy webhook URL as the secret (from [step 4](#_4-get-coolify-webhook-url)). +6. Click "Add secret" button. + + + +7. Click "New repository secret". + + + +8. Enter `COOLIFY_TOKEN` as the name. +9. Enter the Coolify API token as the secret (from step 3). +10. Click "Add secret" button. + +## 6. Set Up GitHub Workflow +1. Create a new workflow file in the `.github/workflows` directory of your repository (name it with a `.yml` or `.yaml` extension). +2. Use the following workflow content as a starting point: + +```yaml +name: Build and Deploy +on: + push: + branches: ["main"] # Trigger on pushes to main branch +env: + REGISTRY: ghcr.io + IMAGE_NAME: "andrasbacsai/github-actions-with-coolify" + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + - name: Login to registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push image + uses: docker/build-push-action@v4 + with: + context: . + file: Dockerfile + platforms: linux/amd64 + push: true + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + - name: Deploy to Coolify + run: | + curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}' +``` + +This workflow builds the Docker image, pushes it to `ghcr.io` with the tag `latest`, and triggers a redeployment in Coolify via API. + + + + +The above workflow is just an example to show how the process works. Adjust it to fit your own CI/CD needs. + +Make sure the **Deploy to Coolify** step comes after all checks and tests so it only runs when everything before it passes. + + + + +## 7. Authenticate with Container Registry +If pushing to a private registry, authenticate it on your server so it can pull the image. + +Run one of these commands on your server's terminal (based on the registry): + +- **Docker Hub**: `docker login` +- **GitHub Container Registry (GHCR)**: `docker login ghcr.io -u USERNAME --password-stdin` + +For other registries, refer to their documentation. + +That's it! \ No newline at end of file diff --git a/content/docs/applications/ci-cd/github/auto-deploy.mdx b/content/docs/applications/ci-cd/github/auto-deploy.mdx new file mode 100644 index 00000000..7a5fc7c9 --- /dev/null +++ b/content/docs/applications/ci-cd/github/auto-deploy.mdx @@ -0,0 +1,71 @@ +--- +title: GitHub Auto Deploy +description: Automatically deploy applications from GitHub repositories in Coolify using GitHub Apps, Actions, or webhooks. +--- + +# GitHub Auto Deploy +Coolify can automatically deploy new versions of your application whenever you push changes to your GitHub repository. + +There are three methods to set up automatic deployments on Coolify: +- [GitHub App](#github-app) +- [GitHub Actions](#github-actions) +- [Webhooks](#webhooks) + +## GitHub App +We have a dedicated guide for setting up a GitHub App, which you can follow here: [/github/setup-app](/applications/ci-cd/github/setup-app). + +Coolify automatically enables "Auto Deploy" after you set up your GitHub App. If it doesn't, enable it on your application by following these steps: + + + +1. Open your application configuration page. +2. Go to the "Advanced" page. +3. Enable "Auto Deploy" under the general section. + +## GitHub Actions +We have a dedicated guide for setting up GitHub Actions, which you can follow here: [/github/actions](/applications/ci-cd/github/actions). + +## Webhooks + +### 1. Enable Auto Deploy + + +1. Open your application configuration page. +2. Go to the "Advanced" page. +3. Enable "Auto Deploy" under the general section. + +### 2. Set Up GitHub Webhook Secret + + +1. Enter a GitHub webhook secret (this must be a random string; you can use tools like [Random String Generator](https://getrandomgenerator.com/string)). +2. Save the webhook URL somewhere safe, we'll need it later. + + + + +A webhook secret acts like a password. Coolify only accepts the webhook if the secret matches. + + + + +### 3. Set Up Webhook on GitHub + + +1. Go to your repository settings page. +2. Click on "Webhooks" from the sidebar. +3. Click the "Add webhook" button. + + + +4. Enter the previously copied webhook URL from Coolify in the "Payload URL" field. +5. Enter the webhook secret from Coolify in the "Secret" field. +6. Enable "Enable SSL verification". +7. Select "Just the `push` event". +8. Enable "Active". +9. Click the "Add webhook" button. + +After clicking "Add webhook", you'll see a page like the one shown below: + + + +That's it! Coolify will automatically redeploy your application whenever you push changes to your repository. diff --git a/content/docs/applications/ci-cd/github/deploy-key.mdx b/content/docs/applications/ci-cd/github/deploy-key.mdx new file mode 100644 index 00000000..733f1917 --- /dev/null +++ b/content/docs/applications/ci-cd/github/deploy-key.mdx @@ -0,0 +1,144 @@ +--- +title: GitHub Deploy Key +description: Deploy applications from private GitHub repositories using deploy keys in Coolify. +--- + +# GitHub Deploy Key +Deploy keys allow you to grant read-only access to a single private GitHub repository without using a personal access token or SSH key tied to your account. + +When using deploy keys, Coolify can clone and deploy from private repositories securely, ensuring that only the specified repository is accessible. + + +### Why Use Deploy Keys with Coolify? +1. **Secure Access**: Grant read-only access to a single repository without sharing to many repositories. +2. **Repository-Specific**: Deploy keys are scoped to one repository. +3. **No Account Exposure**: Prevents potential security risks if the key is compromised. +4. **Cannot Install Github App**: Deploy keys can be used when you cannot install a GitHub App to your organization. + + +### When Not to Use Deploy Keys +1. **Multiple Repositories**: If you need access to multiple private repositories, consider using a GitHub App. + +--- + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **Repository Owner:** `ShadowArcanist` +- **Repository Name:** `coolify-dev` +- **Deploy Key Name:** `Deploy Key Tutorial` +- **SSH URL:** `git@github.com:ShadowArcanist/coolify-dev.git` + + + + + +## 1. Create a Private Key on Coolify + + +1. In your Coolify dashboard, click on **Keys & Tokens** from the sidebar. +2. Click on **Private keys** tab. +3. Click the **+ Add** button to create a new private key. + + + +4. Click **Generate new RSA SSH Key** or **Generate new ED25519 SSH Key** to generate a key pair. + + + +5. Copy the public key. +6. Click **Continue** to save the keys. + + + + +You can also generate a key externally using the `ssh-keygen` command and paste the private key into Coolify: + +```bash +ssh-keygen -t rsa -b 4096 -C "coolify-deploy-key" +``` + +Then, copy the contents of the generated `.pub` file for the next step. + + + + + +## 2. Add Deploy Key on GitHub + + +1. Go to your GitHub repository settings. +2. Navigate to **Deploy keys** in the left sidebar. +3. Click **Add deploy key** button. + + + + +You can also access the deploy keys page directly at `https://github.com/YOUR_USERNAME/YOUR_REPO_NAME/settings/keys` + + + + + + +4. Enter a title for your deploy key (e.g., `Coolify Deploy Key`). +5. Paste the public key you copied from Coolify. +6. Make sure **Allow write access** is unchecked (deploy keys should be read-only). +7. Click **Add key** to save. + + + +## 3. Copy Repository SSH URL + + +1. Go to your GitHub repository. +2. Click the **Code** button. +3. Select the **Local** tab. +4. Click the **SSH** tab. +5. Copy the SSH URL (e.g., `git@github.com:ShadowArcanist/coolify-dev.git`). + + +## 4. Create a New Resource on Coolify + + +1. Select your project from the Coolify dashboard. +2. Click the **+ New** button to create a new resource. + + +## 5. Select Private Repository (with Deploy Key) as Resource Type + + +Select **Private Repository (with Deploy Key)** from the available resource types. + + +## 6. Choose Your Server + + + +Coolify automatically selects the `localhost` server if you don't have any remote servers connected. In such cases, skip to the next step. + + + + + + +Choose the server where you want to deploy the application. + + +## 7. Choose Your Deploy Key + + +Select the private key you created in Coolify from the list of available private keys. + + +## 8. Configure the Application and Deploy + + +1. Paste the SSH URL you copied from GitHub (e.g., `git@github.com:ShadowArcanist/coolify-dev.git`). +2. After entering the repository link, configure the buildpack, ports, and other settings. (Refer to our dedicated guide on [applications](/applications) for more details.) + +Once configured, deploy your application. + +That's it! diff --git a/content/docs/applications/ci-cd/github/meta.json b/content/docs/applications/ci-cd/github/meta.json new file mode 100644 index 00000000..3f98f10f --- /dev/null +++ b/content/docs/applications/ci-cd/github/meta.json @@ -0,0 +1,13 @@ +{ + "title": "Github", + "pages": [ + "overview", + "actions", + "auto-deploy", + "preview-deploy", + "public-repository", + "deploy-key", + "setup-app", + "switch-apps" + ] +} \ No newline at end of file diff --git a/content/docs/applications/ci-cd/github/overview.mdx b/content/docs/applications/ci-cd/github/overview.mdx new file mode 100644 index 00000000..3dc454a6 --- /dev/null +++ b/content/docs/applications/ci-cd/github/overview.mdx @@ -0,0 +1,23 @@ +--- +title: "Overview" +description: "Integrate GitHub with Coolify to deploy applications from repositories, enable automatic deployments, and manage pull requests seamlessly." +--- + +# GitHub Integration +Coolify simplifies deploying applications from your GitHub repositories or Docker images hosted on GitHub Container Registry. + +GitHub integration with Coolify supports deploying from both private and public repositories, automatic deployments on new commits, and pull request deployments. + + +## Ways to Use GitHub with Coolify + +You can integrate GitHub with Coolify in several ways, depending on your needs. Below are the available options, each linked to a detailed guide for easy setup: + +| Method | Description | +|--------|-------------| +| [Public Repository](/applications/ci-cd/github/public-repository) | Deploy applications directly using the URL of a public repository. | +| [Private Repository using GitHub App](/applications/ci-cd/github/setup-app) | Install the GitHub App on your personal account or organization to deploy both private and public repositories. | +| [Private Repository using Deploy Key](/applications/ci-cd/github/deploy-key) | Deploy applications from private repositories using a deploy key. | +| [Automatic Deployments](/applications/ci-cd/github/auto-deploy) | Automatically deploy new versions of your application when commits are pushed to a specific branch in your GitHub repository. | +| [Build and Deploy Using GitHub Actions](/applications/ci-cd/github/actions) | Build your application on GitHub using GitHub Actions as part of your CI/CD pipeline, push it to any Docker registry (such as GHCR or Docker Hub), and automatically deploy on Coolify. | +| [Preview Deployments](/applications/ci-cd/github/preview-deploy) | Automatically deploy new versions of your application based on pull requests. | \ No newline at end of file diff --git a/content/docs/applications/ci-cd/github/preview-deploy.mdx b/content/docs/applications/ci-cd/github/preview-deploy.mdx new file mode 100644 index 00000000..4f35e429 --- /dev/null +++ b/content/docs/applications/ci-cd/github/preview-deploy.mdx @@ -0,0 +1,159 @@ +--- +title: GitHub Preview Deploy +description: Automatically deploy preview versions of your application for each GitHub pull request using Coolify. +--- + +# GitHub Preview Deploy +Preview deployments allow Coolify to automatically deploy new versions of your application whenever someone opens a pull request (PR) on your GitHub repository. + +These preview deployments are automatically deleted once the associated pull request is merged or closed, ensuring a clean environment. + + +## Features +- **[Scoped Deployments](#scoped-deployments)**: Control who can trigger PR preview deployments. +- **[Scoped Secrets](#scoped-secrets)**: Keep production and preview environment variables separate. +- **[Automated Comments](#automated-comments)**: Post deployment status updates directly on pull requests. + +## Preview Deployments Options + + +- **Preview URL Template:** Each preview deployment gets its own unique URL based on this template. + - Use {{random}} to generate a random subdomain each time a PR is deployed. + - Use {{pr_id}} to use the pull request ID as the subdomain. + + + + + You need to set up a **wildcard** `A` record for the subdomain you want to use for preview deployments, pointing to your server's IP address. For example, to use `https://123.preview.shadowarcanist.com`, create an A record for `*.preview.shadowarcanist.com` pointing to your server's IP address. + + + + +- **Load Pull Requests:** Allows you to manually fetch all open pull requests on your repository. This is useful if you already had open PRs before setting up preview deployments. + + + + +Coolify does not automatically deploy preview deployments for pull requests that were opened before preview deployments were enabled. You need to manually deploy these by clicking the 'Deploy' button on the pull request list in the Preview Deployments page. + + + + +## Scoped Deployments +If anyone can trigger a new preview deployment by creating a pull request, they could run arbitrary code directly on your environment, potentially gaining access to your environment or secrets. + +Coolify allows you to configure who can trigger new preview deployments to prevent this: + + + +- **Preview Deployments**: Enables the Preview Deployments feature, and only repository members, collaborators, and contributors can trigger PR deployments. +- **Allow Public PR Deployments**: Anyone can trigger PR deployments. + +## Scoped Secrets +Coolify separates environment variables for production and preview deployments, keeping your secrets safe. + + + +- **Production Environment Variables:** These variables are used only in your main deployment. They remain fully isolated and are never exposed to preview deployments triggered from pull requests. +- **Preview Deployment Environment Variables:** A separate set of variables used only for PR-based preview deployments. These variables can safely contain non-sensitive or limited-scope values, ensuring contributors' pull requests cannot access production secrets. + +## Automated Comments +Coolify posts comments on pull requests with the deployment status and automatically updates them if the status changes. + + + + + + +Automated comments only work if you are using the GitHub App for preview deployments. + + + + +## Setup Methods +There are two methods to set up preview deployments on Coolify: +- [Using GitHub App](#setup-using-github-app) +- [Using Webhooks](#setup-using-webhooks) + +### Setup Using GitHub App +We have a dedicated guide for setting up the GitHub App, so please follow it first: [/applications/ci-cd/github/setup-app](/applications/ci-cd/github/setup-app). + +As part of the setup, ensure Preview Deployments is configured correctly. The steps differ depending on whether you use Automated or Manual setup, as shown below. + + + + +== Automated Setup + + +Before you click "Register now", enable the "Preview Deployments" option. That's it! + +== Manual Setup + + +While setting up permissions for the GitHub App, do the following: + +1. Under the "**Permissions**" section, click on "**Repository permissions**". +2. Set access to `Read and write` for `Pull Requests`. +3. Scroll down to the "**Subscribe to events**" section. +4. Enable the `Pull requests` option. + +That's it! + + + + + +--- + +If you have already set up the GitHub App without enabling the "Preview Deployments" feature, follow these steps: + + + +1. In your Coolify dashboard, click on **Sources** from the sidebar, then select your GitHub App. +2. Click the **Update** button in the "Permissions" section (this will redirect you to GitHub). + + + +3. Under the "**Permissions**" section, click on "**Repository permissions**". +4. Set access to `Read and write` for `Pull Requests`. +5. Scroll down to the "**Subscribe to events**" section. +6. Enable the `Pull requests` option. + +--- + +### Setup Using Webhooks + + +1. Enter a GitHub webhook secret (this must be a random string; you can use tools like [Random String Generator](https://getrandomgenerator.com/string)). +2. Save the webhook URL somewhere safe—we'll need it later. + + + + +A webhook secret acts like a password. Coolify only accepts the webhook if the secret matches. + + + + + + +3. Go to your repository settings page. +4. Click on **Webhooks** from the sidebar. +5. Click the **Add webhook** button. + + + +6. Enter the previously copied webhook URL from Coolify in the "Payload URL" field. +7. Enter the webhook secret from Coolify in the "Secret" field. +8. Enable "Enable SSL verification". +9. Select "Let me select individual events". +10. Select "Pull Requests". +11. Enable "Active". +12. Click the **Add webhook** button. + +After clicking "Add webhook", you'll see a page like the one shown below: + + + +That's it! Coolify will automatically deploy preview deployments when a new pull request is created. \ No newline at end of file diff --git a/content/docs/applications/ci-cd/github/public-repository.mdx b/content/docs/applications/ci-cd/github/public-repository.mdx new file mode 100644 index 00000000..4734f8d2 --- /dev/null +++ b/content/docs/applications/ci-cd/github/public-repository.mdx @@ -0,0 +1,61 @@ +--- +title: "Deploy Public Repository" +description: "Learn how to deploy applications from public GitHub repositories directly using the repository URL in Coolify." +--- + +# Deploy Public Repository +You can deploy applications from any public GitHub repository by simply providing the repository URL. + + +## 1. Create a New Resource on Coolify + + +1. Select your project from the Coolify dashboard. +2. Click the **+ New** button to create a new resource. + +## 2. Select Public Repository as Resource Type + + +Choose **Public Repository** from the available resource types. + + +## 3. Choose Your Server + + + +Coolify automatically selects the `localhost` server if you don't have any remote servers connected. In such cases, skip to the next step. + + + + + + +Select the server where you want to deploy the application. + + +## 4. Enter Your Repository Link + + +Paste the URL of your public GitHub repository. + + + + +The branch will be **automatically selected** based on the provided URL. + +* https://github.com/coollabsio/coolify-examples → **main** branch will be selected. +* https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify → **nodejs-fastify** branch will be selected + + + + + +## 5. Configure the Application and Deploy + + +After entering the repository link, click **Check Repository**. Then, configure the buildpack, ports, and other settings. (Refer to our dedicated guide on [builds](/applications/build-packs) for more details.) + + +Once configured, deploy your application. + +That's it! \ No newline at end of file diff --git a/content/docs/applications/ci-cd/github/setup-app.mdx b/content/docs/applications/ci-cd/github/setup-app.mdx new file mode 100644 index 00000000..69546aa4 --- /dev/null +++ b/content/docs/applications/ci-cd/github/setup-app.mdx @@ -0,0 +1,340 @@ +--- +title: "Setup GitHub App" +description: "Set up a GitHub App in Coolify to access and deploy from private GitHub repositories using automated or manual installation methods." +--- + +# GitHub App +Github app allows you to grant access to a single or multiple private repositories from your either personal github account or your organization on github. + + +### Why use github app with Coolify? +Scoped Access: The GitHub app lets you grant Coolify access to a specific repository, a selected group of repositories, or even all of your repositories. This gives you flexibility and better control over what Coolify can access. + +### When Not to Use github app with Coolify? +Lack of Permission: If you don't have the necessary permissions to install the GitHub app, or if you prefer not to install it, then it’s best not to use it with Coolify. + +## Installation Methods +There are two ways to install Github App on Coolify: +- [Automated Installation](/applications/ci-cd/github/setup-app#automated-installation) (Recommended) +- [Manual Installation](/applications/ci-cd/github/setup-app#manual-installation) +We highly recommend the Automated Installation method as it automates the process and reduces the chance of errors. + + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **GitHub App Name on Coolify:** `Github App Tutorial` +- **GitHub App Name on Github:** `coolify-github-app-tutorial` +- **Webhook Endpoint:** `https://coolboxy.shadowarcanist.internal` + + + + + +## Automated Installation +### 1. Create a Github App on Coolify + +1. In your Coolify dashboard, click on Sources from the sidebar. +2. Click the + Add button to create a new github app. + + +3. Enter a Name for your App +4. Enter your github organization name (if you are adding the github app to your github account then leave this field empty) and click continue + + + + +1. If you are using Selfhost or Enterprise version of Github then you can enter your github details on the Selhost/Enterprise github section. +2. The "System wide" option allows all teams you have on your coolify instance to use this specific github app, if you only want the current team to use the github app then leave this option unchecked. + + + + Coolify cloud users won't see the option "System wide" because this option will enable your github app to all Cloud users so this option is disabled on Coolify Cloud + + + + +### 2. Set Webhook Endpoint + + +1. Select the endpoint for github to send Webhook when a event (commit, pr) happens on github. If this endpoint is not reachable then automatic deployments won't work so if you decide to close port 8000 on your server you have to set the webhook endpoint as your Coolify dashboard domain + + +2. Preview deployments are enabled by default and you can disable them if you dont want them +3. Click on Register now button (this will take you to github) + + +### 3. Create Github App on Github + +1. Give your github app a name (this will be shown on your github app list and you can always change it later) +2. Click on Create app button (this will take you back to your coolify dashboard) + +### 4. Allow Github app access to repositories + +1. Click on "Install repositories on Github" button + + +2. Select the repositories that you want this app to have access to (you can give access to all repositories or specific repositories) +3. Click on "Install" button (this will take you back to your Coolify dashboard) + + + +### 5. Create a New Resource on Coolify + + +1. Select your project from the Coolify dashboard. +2. Click the **+ New** button to create a new resource. + + +### 6. Select Private Repository (with Github App) as Resource Type + +Select **Private Repository (with Github App)** from the available resource types. + + +### 6. Choose Your Server + + + +Coolify automatically selects the `localhost` server if you don't have any remote servers connected. In such cases, skip to the next step. + + + + + + +Choose the server where you want to deploy the application. + + +### 7. Choose Your Github App + + +Select the Github App you created in Coolify from the list of available Apps. + + +### 8. Configure the Application and Deploy + + +1. Choose Repository and click on "Load Repository" button. + + +2. After selecting the repository, configure the buildpack, ports, and other settings. (Refer to our dedicated guide on [builds](/applications/build-packs) for more details.) + +Once configured, deploy your application. + +That's it! + +--- + + + + +**The Automated installation guide ends here. If you’ve followed the steps above, you can start using Github Apps now. The guide below is for those who want to manually install and set up Github App.** + + + + +## Manual Installation +### 1. Create a Github App on Coolify + +1. In your Coolify dashboard, click on Sources from the sidebar. +2. Click the + Add button to create a new github app. + + +3. Enter a Name for your App +4. Enter your github organization name (if you are adding the github app to your github account then leave this field empty) and click continue + + + + +1. If you are using Selfhost or Enterprise version of Github then you can enter your github details on the Selhost/Enterprise github section. +2. The "System wide" option allows all teams you have on your coolify instance to use this specific github app, if you only want the current team to use the github app then leave this option unchecked. + + + + Coolify cloud users won't see the option "System wide" because this option will enable your github app to all Cloud users so this option is disabled on Coolify Cloud + + + + + +5. Click on Continue button + +6. Save the Source ID of github app somewhere safe (source id is the UUID you see on your url bar after `/github/`) + +We will need the following data to setup the github app: +- App ID +- Installation ID +- Client ID +- Client Secret +- Webhook Secret +- SSH Key + +We will get these data in the next few steps. + +### 2. Create a App on Github +Creating apps on github slightly varies for personal accounts and organizations so choose the correct one from the below section + + + + +== Personal Account + + +1. Go to your github account settings +2. On the sidebar scroll down till you see "developer settings" and click on it + + +3. Click the "New github app" button + + +== Organization + + +1. Go to your github Organization settings +2. On the sidebar scroll down till you see "**developer settings**" and click on it +3. Click on "Github Apps" +4. Click the "New github app" button + + + + + +### 3. Setup the Github App on Github + +1. Give your app a name +2. Enter homepage url for your app (this can be anything) + + +3. Scrol down till you see the "**Post Installation**" section +4. Enter Setup URL: `https://coolboxy.shadowarcanist.internal/webhooks/source/github/install?source=a8000cg0g0ogcc0ggkk8ow4k` + +5. Enable the option `Redirect on Update` +6. Enter Webhook URL: `https://coolboxy.shadowarcanist.internal/webhooks/source/github/events` + + + + + You have to replace `https://coolboxy.shadowarcanist.internal` with your Coolify dashboard url and replace `a8000cg0g0ogcc0ggkk8ow4k` with the Source ID [Step 1](#_1-create-a-github-app-on-coolify-1) + + + + +7. Enter Webhook Secret (this has to be a random string, you can use tools like [Random String Generator](https://getrandomgenerator.com/string)) +8. Enable the option `Enable SSL verification` + + +9. Scrol down till you see the "**Permissions**" section +10. Set Access to `Read-only` for `Contents` +11. Set Access to `Read and write` for `Pull Requests` (Only needed if you plan to use Preview deployments feature) +12. Set Access to `Read-only` for `Email addresses` + + + + +On the screenshot above for permissions section we have hidden lot of Permission and only shown the Permission needed to setup Github app for Coolify. + + + + + +13. Scrol down till you see the "**Subscribe to events**" section +14. Enable the option `Push` +15. Enable the option `Pull requests` (Only needed if you plan to use Preview deployments feature) +16. Select the option `Only on this account` (Prevents others from installing our Github app to their github accounts) +17. Click the button "**Create Github App**" + + +18. Save the `App ID` and `Client ID` somewhere safe (we have to enter this on Coolify later) + + +19. Click the `Generate a new client secret` button +20. Save the `client secret` somewhere safe (we have to enter this on Coolify later) + + +21. Scrol down till you see the "**Private keys**" section +22. Click the `Generate a private key` button (this will automatically download the private key as a `.pem` file) + + +23. Click "Install App" from the sidebar +24. Click the "**Install**" button + + +25. Select the repositories you want the app to have access to. +26. Click the "**Install**" button + + +27. Click the Settings icon (this will take you to your account or organization applications page) + + +28. Save the `Installation ID` somewhere safe (Installation ID is the number you see on your url bar after `/installations/`) + + +### 4. Add Private keys on Coolify + + +1. In your Coolify dashboard, click on **Keys & Tokens** from the sidebar. +2. Click on **Private keys** tab. +3. Click the **+ Add** button to add a new private key. + + +4. Give your Private key a name +5. Paste the content of the `.pem` file which github automatically downloaded to your machine when you setup the Github App on Github +6. Click on "**Continue**" button + + +7. In your Coolify dashboard, click on **Sources** from the sidebar and select your Github app from the list +8. Enter the details (App ID, Installation ID etc..) you saved on previous steps +9. On "Private key" select the key you just added to Coolify +10. Click on "**Sync Name**" button, if you see a success message then you have done everything correctly and you can start using the Github app! + + +### 5. Create a New Resource on Coolify + + +1. Select your project from the Coolify dashboard. +2. Click the **+ New** button to create a new resource. + + +### 6. Select Private Repository (with Github App) as Resource Type + +Select **Private Repository (with Github App)** from the available resource types. + + +### 6. Choose Your Server + + + +Coolify automatically selects the `localhost` server if you don't have any remote servers connected. In such cases, skip to the next step. + + + + + + +Choose the server where you want to deploy the application. + + +### 7. Choose Your Github App + + +Select the Github App you created in Coolify from the list of available Apps. + + +### 8. Configure the Application and Deploy + + +1. Choose Repository and click on "Load Repository" button. + + +2. After selecting the repository, configure the buildpack, ports, and other settings. (Refer to our dedicated guide on [builds](/applications/build-packs) for more details.) + +Once configured, deploy your application. + +That's it! + + + + + diff --git a/content/docs/applications/ci-cd/github/switch-apps.mdx b/content/docs/applications/ci-cd/github/switch-apps.mdx new file mode 100644 index 00000000..532fc31d --- /dev/null +++ b/content/docs/applications/ci-cd/github/switch-apps.mdx @@ -0,0 +1,56 @@ +--- +title: Switch GitHub Apps +description: Learn how to switch your application from one GitHub App to another in Coolify, such as when moving repositories to a new organization. +--- + +# Switch GitHub Apps +Switching GitHub Apps allows you to change the GitHub App associated with your deployed applications, for example, when moving repositories to a new organization or account. + + +### Why Switch GitHub Apps? +1. **Organization Changes**: You've moved repositories to a new GitHub organization that requires a different GitHub App. +2. **Access Management**: You want to use a GitHub App with different permissions or repository access. + + + + + +This feature is introduced in **Coolify v4.0.0-beta.408**. To follow this guide, you **must** be using Coolify v4.0.0-beta.408 or a higher version. + + + + +## 1. Move Repositories (Optional) +If your goal is to move a repository to a different account or organization, go ahead and transfer it on GitHub. + +If you just want to use a different GitHub App without changing repositories, you can skip this step. + +## 2. Add New GitHub App to Coolify +We have a dedicated guide for setting up a GitHub App, which you can follow here: [/applications/ci-cd/github/setup-app](/applications/ci-cd/github/setup-app). Follow that guide and come back here. + +## 3. Set Up Repository Access +After adding the new GitHub App, verify that it has access to the correct repositories by following these steps: + + +1. In your Coolify dashboard, click on **Sources** from the sidebar, then select your new GitHub App. +2. Click the **Update Repositories** button (this will redirect you to GitHub). + + +3. Under the Repository access section, check if you can see the repositories that you want to use. + +## 4. Switch Git Source on Coolify + +1. Open your application configuration page. +2. Go to the "Git Source" page. +3. Select your new GitHub App. + +## 5. Update Repository Name (If Applicable) + +If you have moved your repository to a new organization or account, update the repository name accordingly (e.g., from `shadowarcanist/switch-apps-guide` to `airoflare/switch-apps-guide`). + +You can skip this step if you didn't move your repository. + +## 6. Redeploy the Application +To apply the new GitHub App to your application, redeploy it by clicking the **Redeploy** button. + +That's it! \ No newline at end of file diff --git a/content/docs/applications/ci-cd/gitlab/integration.mdx b/content/docs/applications/ci-cd/gitlab/integration.mdx new file mode 100644 index 00000000..a5305612 --- /dev/null +++ b/content/docs/applications/ci-cd/gitlab/integration.mdx @@ -0,0 +1,116 @@ +--- +title: "Integration" +description: "Connect GitLab repositories to Coolify with deploy keys, Gitlab container registry with deploy token, automatic webhooks, and merge request deployments for CI/CD automation" +--- + +# GitLab Integration + +## Public Repositories + +You can use public repositories without any additional setup. + +1. Select the `Public repository` option in the Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://gitlab.com/andrasbacsai/coolify-examples` + + + + + You can only use the https URL. + + + + +3. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require a few more steps to setup. + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your GitLab repository in the `Settings` / `Repository` / `Deploy Keys` menu. + + + + + +- You can generate a new key pair with the following command: + +```bash +ssh-keygen -t rsa -b 4096 -C "deploy_key" +``` + +- Or you can also use Coolify to generate a new key for you in the `Keys & Tokens` menu. + + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@gitlab.com:andrasbacsai/coolify-examples.git` + + + + +You need to use the SSH URL, so the one that starts with `git@`. + + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Public Container Registry + +You can use public container registry without any additional setup. + +1. Select the `Docker Image` option in the Coolify when you create a new resource. +2. Add your public container registry URL and also the tag to the input field, for example: `registry.gitlab.com/username/repository:latest`. +3. Press the `Deploy` button. +4. That's it! Coolify will automatically pull the latest version of your container registry and deploy it. + +## Private Container Registry + +Private container registry require a few more steps to setup. + +1. Add a `Deploy Token` in your GitLab repository in the `Settings` / `Repository` / `Deploy Token` with scope `read_registry`. This step will generate credentials `username` and `token` +2. login docker with that credentials in your coolify server + +``` +echo "token-xxx" | docker login registry.privategitlab.com -u gitlab+deploy-token-xxx --password-stdin +``` + +3. Select the `Docker Image` option in the Coolify when you create a new resource. +4. Add your private container registry URL and also the tag to the input field, for example: `registry.privategitlab.com/username/repository:latest`. +5. Press the `Deploy` button. +6. That's it! Coolify will automatically pull the latest version of your container registry and deploy it. + +## Automatic commit deployments with webhooks (Optional) + +You can add a custom webhook URL to your GitLab repository to trigger a new deployment when you push to your repository. + + + + +This can be set on either public or private repositories. + + + + +In your resource, there is a `Webhooks` menu. In the `Manual Git Webhooks` section, you can find the URL what you need to set in your GitLab repository. + +1. Set a secret key in the `GitLab Webhook Secret` input field. +2. Go to your repository in GitLab and open the `Settings` / `Webhooks` menu. +3. Add the URL from Coolify to the `URL` input field and the secret token. +4. Select the `Push events` option. +5. That's it! Now when you push to your repository, GitLab will send a webhook request to Coolify and it will trigger a new deployment. + +## Merge request deployments with webhooks (Optional) + +You can add a custom webhook URL to your GitLab repository to trigger a new deployment when you create a new merge request. + + + + +This can be set on either public or private repositories. + + + + +The process is the same as the previous one, but you need to select the `Merge request events` option in the `Settings` / `Webhooks` menu. diff --git a/content/docs/applications/ci-cd/index.mdx b/content/docs/applications/ci-cd/index.mdx new file mode 100644 index 00000000..5b8b4bfc --- /dev/null +++ b/content/docs/applications/ci-cd/index.mdx @@ -0,0 +1,108 @@ +--- +title: "CI/CD with Git Providers" +description: "Learn how Coolify applications integrate with Git providers for continuous deployment. Understand the difference between Git-based applications and Docker Compose services." +--- + +# CI/CD with Git Providers + +Applications in Coolify are designed to be deployed directly from **Git repositories**, enabling continuous integration and continuous deployment (CI/CD) workflows. This means your applications automatically update when you push code changes to your repository. + +## How Git Integration Works + +When you deploy an application in Coolify, you connect it to a Git repository from **any Git provider**. Coolify works with all Git platforms, including: + +- **[GitHub](/applications/ci-cd/github/overview)** - Full GitHub App integration or deploy keys +- **[GitLab](/applications/ci-cd/gitlab/integration)** - GitLab integration with webhooks +- **[Bitbucket](/applications/ci-cd/bitbucket/integration)** - Bitbucket integration with webhooks +- **[Gitea](/applications/ci-cd/gitea/integration)** - Self-hosted Git platform +- **Any other Git provider** - Works with any Git-compatible platform with publicly accessible repositories or using deploy keys + +Once connected, Coolify: + +1. **Pulls your source code** from the repository +2. **Builds a Docker image** using your chosen [build pack](/applications/build-packs) +3. **Deploys the container** to your server +4. **Watches for changes** and automatically redeploys when you push new commits (if auto-deploy is enabled) + +## Key Benefits of Git-Based Deployments + +### Automatic Deployments + +Push code to your repository and Coolify automatically builds and deploys your application. No manual intervention needed. + +### Preview Deployments + +Test pull requests in isolated environments before merging to production. Each PR gets its own unique URL. + +### Version Control Integration + +- Track deployment history alongside your code commits +- Roll back to previous versions easily +- See exactly what code is running in production + +### CI/CD Workflows + +- Integrate with GitHub Actions, GitLab CI, and other CI tools +- Run tests before deployment +- Automate complex deployment pipelines + + + + +If you want to deploy your own application **without connecting to a Git provider**, you can deploy it as a [Service](/services/introduction) instead. Services allow you to: + +- Upload a Docker Compose file directly to Coolify +- Deploy from Docker images without source code +- Manage the application manually without Git integration + +This is useful for scenarios where you build your Docker images elsewhere or prefer manual control over deployments. + + + + +## Repository Access Methods + +Coolify supports multiple ways to access your Git repositories: + +### Public Repositories + +Simply provide the HTTPS URL of your public repository. No authentication needed. Works with any Git provider. + +### Private Repositories + +Choose from authentication methods based on your Git provider: + +1. **Git Provider App Integration (Recommended for supported providers)** + + - Available for GitHub + - Full integration with automatic webhooks + - Pull request deployments + - Commit status updates + - No SSH key management + +2. **Deploy Keys (Works with any Git provider)** + - SSH-based authentication + - Universal support - works with any Git platform + - More manual webhook setup required + - Better for air-gapped or restricted environments + - Ideal for custom or self-hosted Git servers + +## Supported Git Providers + +While we provide detailed integration guides for popular platforms, **Coolify works with any Git provider** that supports standard Git protocols: + +- **Public Repositories**: Any Git provider (no authentication required) +- **With App Integration**: GitHub +- **With Deploy Keys**: Any Git provider (GitHub, GitLab, Bitbucket, Gitea, Gogs, Forgejo, self-hosted solutions, and more) + +## Next Steps + +Ready to connect your Git provider? Choose your platform for detailed setup guides: + +- **[GitHub Integration](/applications/ci-cd/github/overview)** - Connect GitHub repositories +- **[GitLab Integration](/applications/ci-cd/gitlab/integration)** - Connect GitLab repositories +- **[Bitbucket Integration](/applications/ci-cd/bitbucket/integration)** - Connect Bitbucket repositories +- **[Gitea Integration](/applications/ci-cd/gitea/integration)** - Connect self-hosted Gitea +- **[Other Git Providers](/applications/ci-cd/other-providers)** - Connect Gogs, Forgejo, or any custom Git server + +Or learn about [Build Packs](/applications/build-packs) to understand how Coolify transforms your code into running containers. diff --git a/content/docs/applications/ci-cd/meta.json b/content/docs/applications/ci-cd/meta.json new file mode 100644 index 00000000..d69db05f --- /dev/null +++ b/content/docs/applications/ci-cd/meta.json @@ -0,0 +1,10 @@ +{ + "title": "CI/CD", + "pages": [ + "github", + "gitlab/integration", + "bitbucket/integration", + "gitea/integration", + "other-providers" + ] +} \ No newline at end of file diff --git a/content/docs/applications/ci-cd/other-providers.mdx b/content/docs/applications/ci-cd/other-providers.mdx new file mode 100644 index 00000000..e48cf993 --- /dev/null +++ b/content/docs/applications/ci-cd/other-providers.mdx @@ -0,0 +1,134 @@ +--- +title: "Other Git Providers" +description: "Connect any Git provider to Coolify using deploy keys and webhooks for automatic deployments. Works with Gogs, Forgejo, and custom Git servers." +--- + +# Other Git Providers + +This guide will show you how to use other Git provider with Coolify, such as Gogs, Forgejo, and any other Git-compatible platform. + +## Public Repositories + +You can use public repositories from any Git provider without any additional setup. + +1. Select the `Public repository` option in Coolify when you create a new resource. +2. Add your repository URL to the input field, for example: `https://git.example.com/username/repository` + + + + +You can only use the HTTPS URL. + + + + +3. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Private Repositories + +Private repositories require deploy keys for authentication. + +### With Deploy Keys + +1. Add a private key (aka `Deploy Keys`) to Coolify and to your Git repository in the repository settings (usually under `Settings` / `Deploy Keys` or `SSH Keys`). + + + + + +- You can generate a new key pair with the following command: + +```bash +ssh-keygen -t ed25519 -C "coolify_deploy_key" +``` + +- Or you can also use Coolify to generate a new key for you in the `Keys & Tokens` menu. + + + + +2. Create a new resource and select the `Private Repository (with deploy key)` +3. Add your repository URL to the input field, for example: `git@git.example.com:username/repository.git` + + + + +You need to use the SSH URL, so the one that starts with `git@`. + + + + +4. That's it! Coolify will automatically pull the latest version of your repository and deploy it. + +## Automatic commit deployments (Optional) + +For Git providers without direct integration, automatic deployments require triggering the deployment via the Deploy Webhook endpoint. + + + + +This requires your Git provider to support workflow automation or webhook actions (similar to GitHub Actions). + +If your provider doesn't support this, you'll need to trigger deployments manually through the Coolify dashboard. + + + + +### Prerequisites + +1. Create a [Coolify API Token](/api-reference/authorization) in your Coolify dashboard +2. Get the Deploy Webhook URL from your resource (Your resource → `Webhooks` menu → `Deploy Webhook`) + +### Setup with Workflow/CI System + +If your Git provider supports workflow automation (like GitHub Actions, GitLab CI, Forgejo Actions, etc.), you can trigger deployments automatically: + +1. Add your Coolify API token to your repository secrets (e.g., `COOLIFY_TOKEN`) +2. Add the Deploy Webhook URL to your repository secrets (e.g., `COOLIFY_WEBHOOK`) +3. Create a workflow file that triggers on push events: + +```yaml +# Example workflow (syntax varies by provider) +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Trigger Coolify Deployment + run: | + curl --request GET "${{ secrets.COOLIFY_WEBHOOK }}" \ + --header "Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}" +``` + +4. That's it! Now when you push to your repository, the workflow will trigger and send a request to Coolify to start a new deployment. + + + + +Some Git providers allow webhooks to send custom headers. If supported, you can configure a webhook to send a GET request with the `Authorization: Bearer YOUR_TOKEN` header directly to the Deploy Webhook URL, without needing a workflow file. + + + + +## Supported Git Providers + +This method works with any Git provider that supports standard Git protocols, including: + +- Gogs +- Forgejo +- Self-hosted GitLab CE/EE instances +- Custom Git servers (gitolite, etc.) +- Any Git-over-SSH compatible platform + +## Comparison with App Integration + +| Feature | Other Providers | GitHub, GitLab, Bitbucket, Gitea | +| --------------------- | -------------------------- | -------------------------------- | +| Repository access | ✅ Yes | ✅ Yes | +| Manual deployments | ✅ Yes | ✅ Yes | +| Auto-deploy | ⚠️ Requires workflow setup | ✅ Automatic | +| Pull request previews | ❌ No | ✅ Yes | diff --git a/content/docs/applications/django.mdx b/content/docs/applications/django.mdx new file mode 100644 index 00000000..ba1573a8 --- /dev/null +++ b/content/docs/applications/django.mdx @@ -0,0 +1,19 @@ +--- +title: Django +description: Deploy Django applications on Coolify with gunicorn, automatic builds, environment variables, and Python package management. +--- + +# Django + +Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. + +## Requirements + +1. Set the base directory where your `requirements.txt` and `manage.py` files are located. + +> In the example repository, it is `/coolify`. + +2. Add `gunicorn` to the `requirements.txt` file, [official docs](https://docs.gunicorn.org/en/stable/install.html). +3. Add `localhost` and your `domain` to `ALLOWED_HOSTS` in `settings.py` file, [ official docs](https://docs.djangoproject.com/en/4.2/ref/settings/#allowed-hosts). + +> `Localhost` is required for health checks to work properly. diff --git a/content/docs/applications/index.mdx b/content/docs/applications/index.mdx new file mode 100644 index 00000000..4798f6db --- /dev/null +++ b/content/docs/applications/index.mdx @@ -0,0 +1,235 @@ +--- +title: Applications +description: Deploy web applications on Coolify with Nixpacks, Docker, static sites, build packs, environment variables, and automated deployments. +--- + +# Applications + +Application could be any type of web application. It could be a static site, a NodeJS application, a PHP application, etc. + +For complex applications, you can use Docker Compose based deployments or the one-click services. + +## How Deployments Work + +Coolify deploys all applications as Docker containers. This means your app runs inside an isolated container on your server. + +**Key Concepts:** +- **Docker Image:** A packaged version of your application with all dependencies included +- **Container:** A running instance of your Docker image +- **Build Process:** Transforms your source code into a Docker image ready for deployment + +You have two options for deploying applications: + +1. **Build on Coolify:** Use [build packs](/applications/build-packs) to automatically create Docker images from your source code +2. **Use Pre-built Images:** Deploy existing images from registries like [Docker Hub](https://hub.docker.com/?utm_source=coolify.io) or [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry?utm_source=coolify.io) + + + + +Building Docker images can be resource-intensive. You can use a dedicated [build server](/knowledge-base/server/build-server) to handle builds separately from your production server. + + + + +## Examples + + + + The list is not complete. + + You can host almost any application that you want, not just the ones listed here. + + + + +- [Vite](/applications/vite) +- [Django](/applications/django) +- [Jekyll](/applications/jekyll) +- [Vue.js](/applications/vuejs) +- [Next.js](/applications/nextjs) +- [Nuxt](/applications/nuxt) +- [Laravel](/applications/laravel) +- [Symfony](/applications/symfony) +- [Ruby on Rails](/applications/rails) +- [SvelteKit](/applications/svelte-kit) + + +## General Configuration + +### Commands + +You can overwrite the default commands by setting a custom value on the UI. + +- Build +- Install +- Start + + + + + If you leave it empty, Nixpacks will detect which commands to run. For + example, in Nodejs, it will check the lock files and run `npm ci` or `yarn + install` or `pnpm install` accordingly. + + + + +### Base Directory + +It is useful for monorepos. You can set the base directory for all the commands that will be executed by Coolify. + +### Public Directory + +If you are building a static site, it is important to set the public directory, so the builder will know which directory to serve. + +### Port Exposes + +Port exposes are required for Docker Engine to know which ports to expose. The first port will be the default port for health checks. + +Examples: + +If you have a NodeJS application that listens on port 3000, you can set it like this: `3000`. +If you have a PHP-FPM application that listens on port 9000, you can set it like this: `9000`. +If you have a Nginx server that listens on port 80, you can set it like this: `80`. + +### Port Mappings + + + + + You will lose some functionality if you map a port to the host system, like + `Rolling Updates`. + + + + +If you would like to map a port to the host system (server), you can do it here like this: `8080:80`. + +This will map the port 8080 on the host system to the port 80 inside the container. + + + + + If you would like to get performance boost and you do not need any domain + (websocket server with VERY high traffic), you can map its port to the host, + so the request will not go through the proxy. + + + + +## Advanced + +### Static Site (Is it a static site?) + +> This feature is only available for Nixpacks buildpacks. + +If you need to serve a static site (SPA, HTML, etc), you can set this to `true`. It will be served by Nginx. `Disabled by default`. + +### Force HTTPS + +If you would like to force HTTPS, so no HTTP connections allowed, you can set this to `true`. `Enabled by default`. + +### Auto Deploy + +> This feature is only available for GitHub App based repositories. + +If you would like to deploy automatically when a new commit is pushed to the repository, you can set this to `true`. `Enabled by default`. + +### Preview Deployments + +Preview deployments are a great way to test your application before merging it into the main branch. Imagine it like a staging environment. + +#### URL Template + +You can setup your preview URL with a custom template. Default is `{{pr_id}}.{{domain}}`. + +This means that if you open a Pull Request with the ID `123`, and you resource domain is `example.com` the preview URL will be `123.example.com`. + + + + + If you have several domains for your resource, the first will be used as the{" "} + `{{ domain }}` part. + + + + +#### Automated Preview Deployments + +> This feature is only available for GitHub App based repositories. + +If you would like to deploy a preview version of your application (based on a Pull Requests), you can set this to `true`. `Disabled by default`. + +If set to `true`, all PR's that are opened against the resource's configured branch, will be deployed to a unique URL. + +#### Manually Triggered Preview Deployments + +You can manually deploy a Pull Request to a unique URL by clicking on the `Deploy` button on the Pull Request page. + +### Git Submodules + +If you are using git submodules, you can set this to `true`. `Enabled by default`. + +### Git LFS + +If you are using git lfs, you can set this to `true`. `Enabled by default`. + +### Environment Variables + +[Read here](/knowledge-base/environment-variables) + +### Persistent Storage + +[Read here](/knowledge-base/persistent-storage) + +### Health Checks + +By default, all containers are checked for liveness. + + + + + Traefik Proxy won't work if the container has health check defined, but it is + `unhealthy`. If you do not know how to set up health checks, turn it off. + + + + +### Rollbacks + +You can rollback to a previous version of your resource. At the moment, only local images are supported, so you can only rollback to a locally available docker image. + +### Resource Limits + +By default, the container won't have any resource limits. You can set the limits here. For more details, read the [Docker documentation](https://docs.docker.com/reference/compose-file/services). + +## Deployment Types + +There are several types of application deployments available. + +- Public Git Repository +- Private Git Repository ([GitHub App](https://docs.github.com/en/apps/using-github-apps/about-using-github-apps)) +- Private Git Repository ([Deploy Key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys)) +- Based on a Dockerfile +- Based on a Docker Compose +- Based on a Docker Image + +## Build Packs + +Build packs help transform your source code into Docker images. Coolify supports several build pack options to match different deployment needs: + +- **[Nixpacks](/applications/build-packs/nixpacks)** - Automatic detection and building (recommended for most applications) +- **[Static](/applications/build-packs/static)** - For static sites and SPAs +- **[Dockerfile](/applications/build-packs/dockerfile)** - Use your own custom Dockerfile +- **[Docker Compose](/applications/build-packs/docker-compose)** - For multi-service applications +- **Docker Image** - Deploy pre-built images from registries + +For detailed guides on each build pack, see the [Build Packs section](/applications/build-packs). + + + + +Coolify uses [Nixpacks](https://nixpacks.com) by default, which automatically detects your application type and builds it accordingly. For most applications, you won't need to configure anything. + + + diff --git a/content/docs/applications/jekyll.mdx b/content/docs/applications/jekyll.mdx new file mode 100644 index 00000000..9857bedd --- /dev/null +++ b/content/docs/applications/jekyll.mdx @@ -0,0 +1,40 @@ +--- +title: Jekyll +description: Deploy Jekyll static sites on Coolify using Nixpacks or Dockerfile with Ruby, Nginx, and automated build processes. +--- + +# Jekyll + +Jekyll is a simple, blog-aware, static site generator for personal, project, or organization sites. + +## Deploy with Nixpacks + +Nixpacks needs a few prerequisites in your source code to deploy your Jekyll application. More info [here](https://nixpacks.com/docs/providers/ruby). + +## Deploy with Dockerfile + +If you want simplicity, you can use a Dockerfile to deploy your Jekyll application. + +### Prerequisites + +1. Set `Ports Exposes` field to `80`. +2. Create a `Dockerfile` in the root of your project with the following content: + +```dockerfile +FROM ruby:3.1.1 AS builder +RUN apt-get update -qq && apt-get install -y build-essential nodejs +WORKDIR /srv/jekyll +COPY Gemfile Gemfile.lock ./ +RUN bundle install +COPY . . +RUN chown 1000:1000 -R /srv/jekyll +RUN bundle exec jekyll build -d /srv/jekyll/_site + +FROM nginx:alpine +COPY --from=builder /srv/jekyll/_site /usr/share/nginx/html +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] +``` + +3. Make sure you have a `Gemfile` and `Gemfile.lock` in the root of your project. +4. Set the buildpack to `Dockerfile`. diff --git a/content/docs/applications/laravel.mdx b/content/docs/applications/laravel.mdx new file mode 100644 index 00000000..53849d76 --- /dev/null +++ b/content/docs/applications/laravel.mdx @@ -0,0 +1,442 @@ +--- +title: Laravel +description: Deploy Laravel PHP applications on Coolify with Nixpacks, queue workers, scheduler, supervisor, database, and Redis integration. +--- + +# Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. + +Example repository [here](https://github.com/coollabsio/coolify-examples/tree/main/laravel). + +## Deploy with Nixpacks + +### Requirements + +- Set `Build Pack` to `nixpacks` +- Set the required [environment variables](#environment-variables) +- Add `nixpacks.toml` with the following [configuration](#all-in-one-container) +- Set `Ports Exposes` to `80` + +### Environment Variables + +If your application needs a database or Redis, you can simply create them beforehand in the Coolify dashboard. + +You will receive the connection strings which you can use in your application and set them as environment variables: + +```bash +DB_CONNECTION=mysql +DB_HOST= +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +REDIS_HOST= +REDIS_PASSWORD=null +REDIS_PORT=6379 +``` + + +### All-in-one container + +If you would like to start queue worker, scheduler, etc within one container (recommended), then you can place a `nixpacks.toml` inside your repository with the following value. + + +```toml +[phases.setup] +nixPkgs = ["...", "python311Packages.supervisor"] + +[phases.build] +cmds = [ + "mkdir -p /etc/supervisor/conf.d/", + "cp /assets/worker-*.conf /etc/supervisor/conf.d/", + "cp /assets/supervisord.conf /etc/supervisord.conf", + "chmod +x /assets/start.sh", + "..." +] + +[start] +cmd = '/assets/start.sh' + +[staticAssets] +"start.sh" = ''' +#!/bin/bash + +# Transform the nginx configuration +node /assets/scripts/prestart.mjs /assets/nginx.template.conf /etc/nginx.conf + +# Start supervisor +supervisord -c /etc/supervisord.conf -n +''' + +"supervisord.conf" = ''' +[unix_http_server] +file=/assets/supervisor.sock + +[supervisord] +logfile=/var/log/supervisord.log +logfile_maxbytes=50MB +logfile_backups=10 +loglevel=info +pidfile=/assets/supervisord.pid +nodaemon=false +silent=false +minfds=1024 +minprocs=200 + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///assets/supervisor.sock + +[include] +files = /etc/supervisor/conf.d/*.conf +''' + +"worker-nginx.conf" = ''' +[program:worker-nginx] +process_name=%(program_name)s_%(process_num)02d +command=nginx -c /etc/nginx.conf +autostart=true +autorestart=true +stdout_logfile=/var/log/worker-nginx.log +stderr_logfile=/var/log/worker-nginx.log +''' + +"worker-phpfpm.conf" = ''' +[program:worker-phpfpm] +process_name=%(program_name)s_%(process_num)02d +command=php-fpm -y /assets/php-fpm.conf -F +autostart=true +autorestart=true +stdout_logfile=/var/log/worker-phpfpm.log +stderr_logfile=/var/log/worker-phpfpm.log +''' + +"worker-laravel.conf" = ''' +[program:worker-laravel] +process_name=%(program_name)s_%(process_num)02d +command=bash -c 'exec php /app/artisan queue:work --sleep=3 --tries=3 --max-time=3600' +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +numprocs=12 # To reduce memory/CPU usage, change to 2. +startsecs=0 +stopwaitsecs=3600 +stdout_logfile=/var/log/worker-laravel.log +stderr_logfile=/var/log/worker-laravel.log +''' + +"php-fpm.conf" = ''' +[www] +listen = 127.0.0.1:9000 +user = www-data +group = www-data +listen.owner = www-data +listen.group = www-data +pm = dynamic +pm.max_children = 50 +pm.min_spare_servers = 4 +pm.max_spare_servers = 32 +pm.start_servers = 18 +clear_env = no +php_admin_value[post_max_size] = 35M +php_admin_value[upload_max_filesize] = 30M +''' + +"nginx.template.conf" = ''' +user www-data www-data; +worker_processes 5; +daemon off; + +worker_rlimit_nofile 8192; + +events { + worker_connections 4096; # Default: 1024 +} + +http { + include $!{nginx}/conf/mime.types; + index index.html index.htm index.php; + + default_type application/octet-stream; + log_format main '$remote_addr - $remote_user [$time_local] $status ' + '"$request" $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + access_log /var/log/nginx-access.log; + error_log /var/log/nginx-error.log; + sendfile on; + tcp_nopush on; + server_names_hash_bucket_size 128; # this seems to be required for some vhosts + + server { + listen ${PORT}; + listen [::]:${PORT}; + server_name localhost; + + $if(NIXPACKS_PHP_ROOT_DIR) ( + root ${NIXPACKS_PHP_ROOT_DIR}; + ) else ( + root /app; + ) + + add_header X-Content-Type-Options "nosniff"; + + client_max_body_size 35M; + + index index.php; + + charset utf-8; + + + $if(NIXPACKS_PHP_FALLBACK_PATH) ( + location / { + try_files $uri $uri/ ${NIXPACKS_PHP_FALLBACK_PATH}?$query_string; + } + ) else ( + location / { + try_files $uri $uri/ /index.php?$query_string; + } + ) + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + $if(IS_LARAVEL) ( + error_page 404 /index.php; + ) else () + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include $!{nginx}/conf/fastcgi_params; + include $!{nginx}/conf/fastcgi.conf; + } + + location ~ /\.(?!well-known).* { + deny all; + } + } +} +''' +``` + +### With Inertia.js + +When using Laravel with [Inertia.js](https://inertiajs.com/), you may need to specify some additional configuration in your `nixpacks.toml` file. + + +#### Increasing the NGINX buffer size for Inertia requests + +Because of a [known issue](https://github.com/inertiajs/inertia-laravel/issues/529) with Inertia.js and default NGINX configuration, you may need to increase the buffer size for NGINX to handle Inertia requests. + + +```diff +"nginx.template.conf" = ''' +# ... +http { + # ... + server { + # ... + location ~ \.php$ { ++ fastcgi_buffer_size 8k; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include $!{nginx}/conf/fastcgi_params; + include $!{nginx}/conf/fastcgi.conf; + + # ... + } + } +} +``` + +#### Inertia SSR + +If you are using Inertia.js with [server-side rendering](https://inertiajs.com/server-side-rendering), you should add another worker in your `nixpacks.toml` file to automatically start your SSR server. + + +```toml +"worker-inertia-ssr.conf" = ''' +[program:inertia-ssr] +process_name=%(program_name)s_%(process_num)02d +command=bash -c 'exec php /app/artisan inertia:start-ssr' +autostart=true +autorestart=true +stderr_logfile=/var/log/worker-inertia-ssr.log +stdout_logfile=/var/log/worker-inertia-ssr.log +''' +``` + +> [!NOTE] +> By default, Nixpacks runs the command `npm run build` to build your application during the deployment. Ensure that your `build` script in `package.json` contains the necessary build commands for server-side rendering. If you use one of the official starter kits including Inertia.js, change your scripts like this: +> ```diff +> "scripts": { +>- "build": "vite build", +>+ "build": "vite build && vite build --ssr", +> "build:ssr": "vite build && vite build --ssr", +> } +> ``` +> Alternatively, if you don't want to adapt your default `build` script in `package.json`, you can add the correct build command for server-side rendering directly in your `nixpacks.toml` configuration file. +>```diff +>[phases.build] +>cmds = [ +>+ "npm run build:ssr", +> "mkdir -p /etc/supervisor/conf.d/", +> "cp /assets/worker-*.conf /etc/supervisor/conf.d/", +> "cp /assets/supervisord.conf /etc/supervisord.conf", +> "chmod +x /assets/start.sh", +> "..." +> ] +>``` + +### Persistent php.ini customizations + +If you want to customize settings from your php.ini file, you can easily do so by using the `php_admin_value` directive and appending them to your `php-fpm.conf` file like this: + +```toml +"php-fpm.conf" = ''' +[www] +listen = 127.0.0.1:9000 +user = www-data +group = www-data +listen.owner = www-data +listen.group = www-data +pm = dynamic +pm.max_children = 50 +pm.min_spare_servers = 4 +pm.max_spare_servers = 32 +pm.start_servers = 18 +clear_env = no + +php_admin_value[memory_limit] = 512M +php_admin_value[max_execution_time] = 60 +php_admin_value[max_input_time] = 60 +php_admin_value[post_max_size] = 256M +''' +``` + +## Deploy with Dockerfile and Nginx Unit + +### Prerequisites + +1. Create a new resource from a private or public repository. +2. Set the `Ports Exposes` field to `8000`, for example. +3. Set default environment variables using `Developer view` in `Environment Variables`: + +```bash +APP_DEBUG=false +APP_ENV=staging +APP_KEY= #YourAppKey +APP_MAINTENANCE_DRIVER=file +APP_NAME=Laravel +CACHE_STORE=file +DB_CONNECTION= #YourDbConnection +DB_DATABASE= #YourDb +DB_HOST= #YourDbHost +DB_PASSWORD= #YourDbPassword +DB_PORT= #YourDbPort +DB_USERNAME= #YourDbUsername +FILESYSTEM_DISK=public +MAIL_MAILER=log +SESSION_DRIVER=file +``` + +4. Create a `Dockerfile` in the root of your project with the following content: + +```dockerfile +FROM unit:1.34.1-php8.3 + +RUN apt update && apt install -y \ + curl unzip git libicu-dev libzip-dev libpng-dev libjpeg-dev libfreetype6-dev libssl-dev \ + && docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j$(nproc) pcntl opcache pdo pdo_mysql intl zip gd exif ftp bcmath \ + && pecl install redis \ + && docker-php-ext-enable redis + +RUN echo "opcache.enable=1" > /usr/local/etc/php/conf.d/custom.ini \ + && echo "opcache.jit=tracing" >> /usr/local/etc/php/conf.d/custom.ini \ + && echo "opcache.jit_buffer_size=256M" >> /usr/local/etc/php/conf.d/custom.ini \ + && echo "memory_limit=512M" > /usr/local/etc/php/conf.d/custom.ini \ + && echo "upload_max_filesize=64M" >> /usr/local/etc/php/conf.d/custom.ini \ + && echo "post_max_size=64M" >> /usr/local/etc/php/conf.d/custom.ini + +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer + +WORKDIR /var/www/html + +RUN mkdir -p /var/www/html/storage /var/www/html/bootstrap/cache + +RUN chown -R unit:unit /var/www/html/storage bootstrap/cache && chmod -R 775 /var/www/html/storage + +COPY . . + +RUN chown -R unit:unit storage bootstrap/cache && chmod -R 775 storage bootstrap/cache + +RUN composer install --prefer-dist --optimize-autoloader --no-interaction + +COPY unit.json /docker-entrypoint.d/unit.json + +EXPOSE 8000 + +CMD ["unitd", "--no-daemon"] +``` + +3. Create a `unit.json` file (lowercase) at the root of your project with the following content. + +```json +{ + "listeners": { + "*:8000": { + "pass": "routes", + "forwarded": { + "protocol": "X-Forwarded-Proto", + "source": [""] + } + } + }, + + "routes": [ + { + "match": { + "uri": "!/index.php" + }, + "action": { + "share": "/var/www/html/public$uri", + "fallback": { + "pass": "applications/laravel" + } + } + } + ], + + "applications": { + "laravel": { + "type": "php", + "root": "/var/www/html/public/", + "script": "index.php" + } + } +} +``` +> [!NOTE] +> When using docker-compose for deployment, then there might be an issue with `Mixed content error` when some of the assets are requested via `http://` instead of `https://`. To avoid that, find your load balancer/proxy subnet or IP address and add it to the unit.config to explicitly tell unit to forward the correct headers to Laravel. Laravel also has to be configured trust proxies. More on that [here](https://laravel.com/docs/12.x/requests#configuring-trusted-proxies). +> ```json +> "listeners": { +> "*:8000": { +> "pass": "routes", +> "forwarded": { +> "protocol": "X-Forwarded-Proto", +> "source": [""] +> } +> } +> }, +>``` + +4. Set Post-deployment to: + +```bash +php artisan optimize:clear && php artisan config:clear && php artisan route:clear && php artisan view:clear && php artisan optimize +``` diff --git a/content/docs/applications/meta.json b/content/docs/applications/meta.json new file mode 100644 index 00000000..cbd3d1da --- /dev/null +++ b/content/docs/applications/meta.json @@ -0,0 +1,20 @@ +{ + "title": "Applications", + "pages": [ + "---Frameworks---", + "django", + "jekyll", + "laravel", + "phoenix", + "rails", + "symfony", + "nextjs", + "vite", + "vuejs", + "nuxt", + "svelte-kit", + "vitepress", + "build-packs", + "ci-cd" + ] +} \ No newline at end of file diff --git a/content/docs/applications/nextjs.mdx b/content/docs/applications/nextjs.mdx new file mode 100644 index 00000000..9f427f8b --- /dev/null +++ b/content/docs/applications/nextjs.mdx @@ -0,0 +1,32 @@ +--- +title: NextJS +description: Deploy Next.js applications on Coolify with server-side rendering, static builds, Nixpacks, or custom Dockerfile configurations. +--- + +# NextJS + +NextJS is a React framework that enables functionality such as server-side rendering and generating static websites. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/nextjs) + +## Deploy with Nixpacks + +### Server build (NodeJS) + +- Set `Build Pack` to `nixpacks`. + +### Static build (SPA) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `out`. + +## Deploy with Dockerfile + +If you are having problems with Nixpacks or want more control over the building stage, you can use a Dockerfile to deploy your NextJS application. + +### Prerequisites + +1. Set `Ports Exposes` field to `3000`. +2. Create a `Dockerfile` in the root of your project and copy the content from the official [NextJS Repository](https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile). +3. Set the Build Pack to `Dockerfile`. diff --git a/content/docs/applications/nuxt.mdx b/content/docs/applications/nuxt.mdx new file mode 100644 index 00000000..6acc239f --- /dev/null +++ b/content/docs/applications/nuxt.mdx @@ -0,0 +1,31 @@ +--- +title: Nuxt +description: Deploy Nuxt applications on Coolify with server builds, static generation, and Nitro support using Nixpacks build configurations. +--- + +# Nuxt + +Nuxt is an open source framework that makes web development intuitive and powerful. +Create performant and production-grade full-stack web apps and websites with confidence. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/nuxt) + +## Server build (Nuxt, using `nuxt build`) + +- Set `Build Pack` to `nixpacks`. +- Set Start Command to `node .output/server/index.mjs` + +Alternatively, you can set the `start` script inside package.json to `node .output/server/index.mjs`. Then Nixpacks will automatically use it as the start command. + +## Static build (Nuxt, using `nuxt generate`) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. + +## Nitro server build (Nitro, using `nitro build`) + +- Set `Build Pack` to `nixpacks`. +- Set Start Command to `node .output/server/index.mjs` + +Alternatively, you can set the `start` script inside package.json to `node .output/server/index.mjs`. Then Nixpacks will automatically use it as the start command. diff --git a/content/docs/applications/phoenix.mdx b/content/docs/applications/phoenix.mdx new file mode 100644 index 00000000..04efbf79 --- /dev/null +++ b/content/docs/applications/phoenix.mdx @@ -0,0 +1,19 @@ +--- +title: Phoenix +description: Deploy Phoenix framework applications on Coolify with Elixir/Erlang, Nixpacks, environment variables, and database integration. +--- + +# Phoenix + +Phoenix is a productive web framework that does not compromise speed and maintainability written in Elixir/Erlang. + +## Requirements + +- Set `Build Pack` to `nixpacks` +- Set `MIX_ENV` to `prod` + - It should be a `Build time` environment variable +- Set `SECRET_KEY_BASE` to a random string (https://hexdocs.pm/phoenix/deployment.html#handling-of-your-application-secrets) + - It should be a `Build time` environment variable +- Set `DATABASE_URL` to your database connection string + - It should be a `Build time` environment variable +- Set `Ports Exposes` to `4000` (default) \ No newline at end of file diff --git a/content/docs/applications/rails.mdx b/content/docs/applications/rails.mdx new file mode 100644 index 00000000..b80d1b3b --- /dev/null +++ b/content/docs/applications/rails.mdx @@ -0,0 +1,16 @@ +--- +title: Ruby on Rails +description: Deploy Ruby on Rails applications on Coolify with database migrations, MVC pattern support, and automated deployment workflows. +--- + +# Ruby on Rails + +Ruby on Rails is a web-application framework that includes everything needed to create database-backend web applications according to the Model-View-Controller (MVC) pattern. + +## Requirements + +If you would like to migrate the database during the deployment with `NIXPACKS` build pack, you need to set the following `Start Command`: + +```bash +bundle exec rake db:migrate && bundle exec bin/rails server -b 0.0.0.0 -p ${PORT:-3000} -e $RAILS_ENV +``` diff --git a/content/docs/applications/svelte-kit.mdx b/content/docs/applications/svelte-kit.mdx new file mode 100644 index 00000000..a9f970c5 --- /dev/null +++ b/content/docs/applications/svelte-kit.mdx @@ -0,0 +1,41 @@ +--- +title: SvelteKit +description: Deploy SvelteKit applications on Coolify with static builds using adapter-static or Node server builds with adapter-node. +--- + +# SvelteKit + +Svelte Kit is a framework for building web applications of all sizes, with a beautiful development experience and flexible filesystem-based routing. + +## Static build (`adapter-static`) + +You need to use `@sveltejs/adapter-static` ([docs](https://kit.svelte.dev/docs/adapter-static)) adapter to build a static site. + +1. Set your site to static `on` (under `Build Pack` section). +2. Set your `Publish Directory` to `/build` + +## Node server (`adapter-node`) + +You need to use `@sveltejs/adapter-node` ([docs](https://kit.svelte.dev/docs/adapter-node)) adapter to build a node server based SvelteKit app. + +1. Set `Static` to `off` (under the `Build Pack` section). +2. Set your `Install Command` to `npm install`. +3. Set your `Build Command` to `npm run build`. +4. Set your `Start Command` to `node build`. +5. Click `Save`. +6. In your Environment Variables tab, check the current Node version supported by Nix. In the example screenshot below, it's `version 22`. + +7. Add `engines` to your `package.json` with the Node version from your environment variables. For example + +```json +"engines": { + "node": ">=22" +} +``` + +8. Git Commit +9. Click Deploy from your Coolify Dashboard +10. Add an Environment Variable ORIGIN with your app's actual domain. For example: + +11. Optional, but recommended: Go to the Healthcheck tab and click `Enable Healthcheck` + \ No newline at end of file diff --git a/content/docs/applications/symfony.mdx b/content/docs/applications/symfony.mdx new file mode 100644 index 00000000..6cdfce6f --- /dev/null +++ b/content/docs/applications/symfony.mdx @@ -0,0 +1,78 @@ +--- +title: Symfony +description: Deploy Symfony PHP applications on Coolify with Nixpacks, Doctrine migrations, database connections, and trusted proxy configuration. +--- + +# Symfony + +Symfony is the leading PHP framework to create websites and web applications. Built on top of the Symfony Components. + +## Requirements + +- Set `Build Pack` to `nixpacks` +- Set `APP_ENV` +- Set `APP_SECRET` +- Set `NIXPACKS_PHP_FALLBACK_PATH` to `/index.php` +- Set `NIXPACKS_PHP_ROOT_DIR` to `/app/public` +- Set `Ports Exposes` to `80` + +### Database migrations + +If you use Doctrine, you can add the following `Post-deployment script` : + +`php bin/console doctrine:migrations:migrate --all-or-nothing --no-interaction` + +### Other components + +If your application needs a database or Redis, you can simply create them beforehand in the Coolify dashboard. + +You will receive the connection strings which you can use in your application and set them as environment variables: + +```bash +DATABASE_URL=postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8 + +REDIS_HOST= +REDIS_PASSWORD=null +REDIS_PORT=6379 +``` + +### Trusted proxy + +You might need to configure the [trusted proxy](https://symfony.com/doc/current/deployment/proxies.html) : + +- Set the environment variable `TRUSTED_PROXIES` with the IP of your server +- Add the following Symfony configuration : + +```yaml +# config/packages/framework.yaml + +framework: + trusted_proxies: "%env(TRUSTED_PROXIES)%" + trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto', 'x-forwarded-port', 'x-forwarded-prefix'] +``` + +### Persistent php.ini customizations + +If you want to customize settings from your php.ini file, you can easily do so by using the `php_admin_value` directive and appending them to your `php-fpm.conf` file like this: + +```toml +"php-fpm.conf" = ''' +[www] +listen = 127.0.0.1:9000 +user = www-data +group = www-data +listen.owner = www-data +listen.group = www-data +pm = dynamic +pm.max_children = 50 +pm.min_spare_servers = 4 +pm.max_spare_servers = 32 +pm.start_servers = 18 +clear_env = no + +php_admin_value[memory_limit] = 512M +php_admin_value[max_execution_time] = 60 +php_admin_value[max_input_time] = 60 +php_admin_value[post_max_size] = 256M +''' +``` diff --git a/content/docs/applications/vite.mdx b/content/docs/applications/vite.mdx new file mode 100644 index 00000000..8c801e9e --- /dev/null +++ b/content/docs/applications/vite.mdx @@ -0,0 +1,23 @@ +--- +title: Vite +description: Deploy Vite applications on Coolify with TypeScript or JavaScript, Nixpacks build process, and static site generation. +--- + +# Vite + +Vite is a build tool that aims to provide a faster and leaner development experience for modern web projects. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/vite) + +## Vanilla TypeScript build (Static) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Publish Directory` to `dist`. + + +## Vanilla JavaScript build (Static) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Publish Directory` to `dist`. diff --git a/content/docs/applications/vitepress.mdx b/content/docs/applications/vitepress.mdx new file mode 100644 index 00000000..3057f09b --- /dev/null +++ b/content/docs/applications/vitepress.mdx @@ -0,0 +1,17 @@ +--- +title: VitePress +description: Deploy VitePress documentation sites on Coolify with Vite, Vue, Nixpacks, and static site generation from Markdown files. +--- + +# VitePress + +Vite & Vue Powered Static Site Generator Markdown to Beautiful Docs in Minutes. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/vitepress) + +## Build (Static) + +- Use `Nixpacks`. +- Turn on `Is it a static site?`. +- Set `Base Directory` to `/.vitepress/static`. +- Set `Publish Directory` to `/.vitepress/dist`. diff --git a/content/docs/applications/vuejs.mdx b/content/docs/applications/vuejs.mdx new file mode 100644 index 00000000..1bee641d --- /dev/null +++ b/content/docs/applications/vuejs.mdx @@ -0,0 +1,27 @@ +--- +title: Vue +description: Deploy Vue.js applications on Coolify with server builds using Node/Express or static SPA builds with routing support. +--- + +# Vue + +Vue.js is an approachable, performant and versatile framework for building web user interfaces. + +[Example repository.](https://github.com/coollabsio/coolify-examples/tree/main/vue) + +## Server build (NodeJS|Express) + +- Set `Build Pack` to `nixpacks`. +- Set 'Start Command' to `node server.js`. + +## Static build (SPA) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. + +## Static build with Router (SPA) + +- Set `Build Pack` to `nixpacks`. +- Enable `Is it a static site?`. +- Set `Output Directory` to `dist`. diff --git a/content/docs/databases/backups.mdx b/content/docs/databases/backups.mdx new file mode 100644 index 00000000..c203ef77 --- /dev/null +++ b/content/docs/databases/backups.mdx @@ -0,0 +1,77 @@ +--- +title: "Backups" +description: Configure scheduled database backups for PostgreSQL, MySQL, MariaDB, and MongoDB with cron expressions and S3 storage integration. +--- + +# Backups + +Scheduled database backups could be configured for PostgreSQL and for Coolify itself. + +This schedules are based on cron expressions, so you can configure them to run as often as you want. + +You can also use simple cron expressions like: + +```js +const VALID_CRON_STRINGS = [ + 'every_minute' => '* * * * *', + 'hourly' => '0 * * * *', + 'daily' => '0 0 * * *', + 'weekly' => '0 0 * * 0', + 'monthly' => '0 0 1 * *', + 'yearly' => '0 0 1 1 *', +]; +``` + +## PostgreSQL + +Coolify creates a full backup of your PostgreSQL databases. You can specify which database to backup, with a comma separated list. + + + + +Coolify's own database is also backed up using this method. + + + + +### Backup command + +```bash +pg_dump --format=custom --no-acl --no-owner --username +``` + +### Restore command + +The backup has custom format, so you can restore it using the following command (or with any equivalent tool): + +```bash +pg_restore --verbose --clean -h localhost -U postgres -d postgres pg-dump-postgres-1697207547.dmp +``` + +## MySQL + +```bash +mysqldump -u root -p +``` + +## MariaDB + +```bash +mariadb-dump -u root -p +``` + +## MongoDB + +```bash +mongodump --authenticationDatabase=admin --uri= --gzip --archive= +``` + +Or if you exclude some collections: + +```bash +mongodump --authenticationDatabase=admin --uri= --gzip --archive= --excludeCollection= --excludeCollection= +``` + +## S3 Backups + +You can also define your own [S3 compatible](/knowledge-base/s3/introduction) storage to store your backups. diff --git a/content/docs/databases/clickhouse.mdx b/content/docs/databases/clickhouse.mdx new file mode 100644 index 00000000..ad42a965 --- /dev/null +++ b/content/docs/databases/clickhouse.mdx @@ -0,0 +1,94 @@ +--- +title: ClickHouse +description: Deploy ClickHouse on Coolify with column-oriented OLAP database, real-time analytics, S3 backups, and exceptional query performance. +--- + +# Clickhouse + + + +## What is ClickHouse + +ClickHouse is an open-source column-oriented database management system designed for online analytical processing (OLAP). + +It's known for its exceptional query performance on large datasets, making it ideal for real-time analytics and data warehousing applications. + +ClickHouse uses a column-oriented storage format and employs various optimizations like vectorized query execution to achieve high performance. + +It supports SQL with extensions and can handle both batch and stream data ingestion, making it versatile for various analytical workloads. + +## To connect + +Map the port `8123:8123` for the HTTP interface. + +In DBeaver, connect to `http://__ip_address__:8123` and use the `default` username plus the password in the UI. + +If you also want the native TCP protocol (used by [clickhouse-client](https://clickhouse.com/docs/interfaces/cli) CLI), publish `9000:9000` as well. + +## Backup and Restore Guide + +Currently, Coolify does not support modifying ClickHouse configurations, which means certain native backup options (e.g., backing up to a local Disk or using `ALTER TABLE ... FREEZE PARTITION ...`) are not possible. Instead, the recommended approach is to use S3 for backups. + +### How to Backup ClickHouse + +To backup a table or an entire database, use the following SQL command: + +- **Backup a Table:** + +```sql +BACKUP TABLE TO S3('/', '', '') +``` + +- **Backup a Database:** + Replace `TABLE` with `DATABASE` to backup the whole database: + +```sql +BACKUP DATABASE TO S3('/', '', '') +``` + +### How to Restore ClickHouse + +To restore a table or database from an S3 backup, use the corresponding RESTORE command: + +- **Restore a Table:** + +```sql +RESTORE TABLE FROM S3('/', '', '') +``` + +- **Restore a Database:** + Replace `TABLE` with `DATABASE` to restore the whole database: + +```sql +RESTORE DATABASE FROM S3('/', '', '') +``` + +### What Doesn't Work + +- **Disk Backups:** + +```sql +BACKUP TABLE test.table TO Disk('backups', '1.zip') +``` + +Does not work due to Coolify not allowing modifications to ClickHouse configurations. + +- **Native Partition Freezes:** + +```sql +ALTER TABLE ... FREEZE PARTITION ... +``` + +May not work because of limitations in the Docker/Coolify file structure. + +- **clickhouse-backup Tool:** + External tools like [clickhouse-backup](https://github.com/Altinity/clickhouse-backup?utm_source=coolify.io) might not function properly within the Docker/Coolify setup due to similar configuration restrictions. + +### Performance Notes + +A community member shared that backing up a 145GB database took around 12 minutes, while restoring it took roughly 17 minutes. + +## Links + +- [The official website](https://clickhouse.com/?utm_source=coolify.io) +- [GitHub](https://github.com/ClickHouse/ClickHouse?utm_source=coolify.io) diff --git a/content/docs/databases/dragonfly.mdx b/content/docs/databases/dragonfly.mdx new file mode 100644 index 00000000..b6b8ce93 --- /dev/null +++ b/content/docs/databases/dragonfly.mdx @@ -0,0 +1,33 @@ +--- +title: DragonFly +description: Deploy DragonFly in-memory datastore on Coolify with Redis compatibility, multi-threaded architecture, and enhanced scalability features. +--- + +# DragonFly + + + +## What is DragonFly + +DragonFly is a modern in-memory datastore, designed as a Redis alternative with better scalability and resource efficiency. It offers a Redis-compatible API while providing improved performance on multi-core systems. DragonFly is built to handle high-throughput scenarios and large datasets more efficiently than traditional in-memory datastores. + +With its multi-threaded architecture and advanced data structures, DragonFly aims to provide enhanced scalability and performance for applications that require Redis-like functionality on modern hardware. + +## Data Persistence + +By default, Dragonfly DB does not save data to disk. To enable persistence, set up snapshots manually. + +For example, configure the service with: + +```yaml +services: + dragonfly: + command: 'dragonfly --requirepass XXXXXXXX --dir /data --dbfilename dragonfly-snapshot-{timestamp} --snapshot_cron "*/5 * * * *"' +``` + +You can also trigger manual saves using the SDK's `SAVE` command. + +## Links + +- [The official website](https://dragonflydb.io/?utm_source=coolify.io) +- [GitHub](https://github.com/dragonflydb/dragonfly?utm_source=coolify.io) diff --git a/content/docs/databases/index.mdx b/content/docs/databases/index.mdx new file mode 100644 index 00000000..1a00d070 --- /dev/null +++ b/content/docs/databases/index.mdx @@ -0,0 +1,69 @@ +--- +title: Introduction +description: Deploy databases on Coolify with one-click setup for PostgreSQL, MySQL, MariaDB, MongoDB, Redis, KeyDB, DragonFly, and ClickHouse. +--- + +# Databases you can host with Coolify + +Coolify supports a variety of databases to suit different application needs. Even if you don't see your favorite database here, you can still host it with Coolify, using Docker. + +Coolify offers one-click setup for the following databases: + +- [PostgreSQL](/databases/postgresql) +- [Redis](/databases/redis) +- [DragonFly](/databases/dragonfly) +- [KeyDB](/databases/keydb) +- [Clickhouse](/databases/clickhouse) +- [MongoDB](/databases/mongodb) +- [MySQL](/databases/mysql) +- [MariaDB](/databases/mariadb) + +Each database has its own strengths and use cases. Click on a database to learn more about it. + +# Deploy a database + +When selecting a New Resource, you can select a database from the list. + + + +You can configure a database with a simple click. Coolify supports the following databases: + +- PostgreSQL +- MySQL +- MariaDB +- MongoDB +- Redis +- DragonFly +- KeyDB +- Clickhouse + +## Ports Mapping vs Public Port + +### Ports Mapping + +Ports mapping is using the Docker [port mapping](https:/.docker.com/network/#published-ports) feature. It is used to map the container port to the host port. For example, if you set the port mapping to `8080:80`, the container port `80` will be mapped to the host port `8080`. + +### Public Port + +Public port is used to expose the container port to the internet, by starting an Nginx TCP proxy. + +### Which one should I use? + +- Port mappings makes the connection/port permanent (you need to restart your database to change it). +- The public port makes the connection/port dynamic (you can change it without restarting the database, Coolify will restart the Nginx TCP proxy for you). + +## Proxy Timeout + +When using a public port, Coolify starts an Nginx TCP proxy to expose your database. By default, the proxy timeout is set to **3600 seconds** (1 hour). + +You can configure this in the database settings under **Proxy Timeout (seconds)**. This controls how long idle connections are kept open before Nginx closes them. + +- The minimum value is **1 second**. +- Set a higher value if you have long-running queries or connections that stay idle for extended periods. + +## Access database during builds + +If you are using `Nixpacks` build pack, you have two ways to access your database during builds: + +1. Database & your application are `in the same network`: You can reach it using the `internal URL` provided by Coolify. +2. Database & your application `are not in the same network`: You need to set your database to be `Accessible over the internet` and use the `public URL` provided by Coolify. diff --git a/content/docs/databases/keydb.mdx b/content/docs/databases/keydb.mdx new file mode 100644 index 00000000..5cb454ab --- /dev/null +++ b/content/docs/databases/keydb.mdx @@ -0,0 +1,20 @@ +--- +title: KeyDB +description: Deploy KeyDB on Coolify with high-performance multithreading, Redis compatibility, active replication, and FLASH storage support. +--- + +# KeyDB + + + + +## What is KeyDB + +KeyDB is a high-performance fork of Redis, focusing on multithreading, memory efficiency, and high availability. It maintains API compatibility with Redis while offering improved performance, especially on multi-core systems. KeyDB introduces features like active replication, FLASH storage support, and subkey expires to enhance the capabilities of the traditional Redis model. + +Designed to be a drop-in replacement for Redis, KeyDB aims to provide better resource utilization and scalability for applications requiring high-throughput in-memory data storage and processing. + +## Links + +- [The official website](https://keydb.dev/) +- [GitHub](https://github.com/EQ-Alpha/KeyDB) diff --git a/content/docs/databases/mariadb.mdx b/content/docs/databases/mariadb.mdx new file mode 100644 index 00000000..a72c6619 --- /dev/null +++ b/content/docs/databases/mariadb.mdx @@ -0,0 +1,20 @@ +--- +title: MariaDB +description: Deploy MariaDB databases on Coolify with MySQL compatibility, enhanced performance, additional storage engines, and automated backups. +--- + +# MariaDB + + + + +## What is MariaDB + +MariaDB is an open-source fork of MySQL, designed to remain free and open-source. It aims to be a drop-in replacement for MySQL with enhanced features and performance. MariaDB maintains high compatibility with MySQL while offering additional storage engines, performance improvements, and features. + +Started by core members of MySQL, MariaDB provides a robust and scalable database solution suitable for a wide range of applications. + +## Links + +- [The official website](https://mariadb.org/) +- [GitHub](https://github.com/MariaDB/server) diff --git a/content/docs/databases/meta.json b/content/docs/databases/meta.json new file mode 100644 index 00000000..07f48fcb --- /dev/null +++ b/content/docs/databases/meta.json @@ -0,0 +1,15 @@ +{ + "title": "Databases", + "pages": [ + "ssl", + "backups", + "mysql", + "mariadb", + "postgresql", + "mongodb", + "redis", + "dragonfly", + "keydb", + "clickhouse" + ] +} \ No newline at end of file diff --git a/content/docs/databases/mongodb.mdx b/content/docs/databases/mongodb.mdx new file mode 100644 index 00000000..ddf188ab --- /dev/null +++ b/content/docs/databases/mongodb.mdx @@ -0,0 +1,19 @@ +--- +title: MongoDB +description: Deploy MongoDB NoSQL databases on Coolify with flexible document storage, horizontal scalability, and automated backup solutions. +--- + +# MongoDB + + + +## What is MongoDB + +MongoDB is a popular, open-source document-oriented NoSQL database designed for scalability and flexibility. It stores data in flexible, JSON-like documents, meaning fields can vary from document to document and data structure can be changed over time. + +MongoDB is known for its horizontal scalability, powerful query language, and ability to handle large volumes of unstructured or semi-structured data. It's widely used in modern web applications, content management systems, and other scenarios where flexible data models and scalability are crucial. + +## Links + +- [The official website](https://www.mongodb.com/) +- [GitHub](https://github.com/mongodb/mongo) diff --git a/content/docs/databases/mysql.mdx b/content/docs/databases/mysql.mdx new file mode 100644 index 00000000..e361bb66 --- /dev/null +++ b/content/docs/databases/mysql.mdx @@ -0,0 +1,19 @@ +--- +title: MySQL +description: Deploy MySQL databases on Coolify with ACID compliance, replication, partitioning, full-text indexing, and automated backup features. +--- + +# MySQL + + + +## What is MySQL + +MySQL is a widely-used, open-source relational database management system (RDBMS) known for its reliability, ease of use, and performance. It's an essential component of the popular LAMP (Linux, Apache, MySQL, PHP/Python/Perl) stack used for web development. + +MySQL provides a robust, ACID-compliant database solution suitable for a wide range of applications, from small websites to large-scale enterprise systems. It offers features like replication, partitioning, and full-text indexing, making it versatile for various use cases. + +## Links + +- [The official website](https://www.mysql.com/) +- [GitHub](https://github.com/mysql/mysql-server) diff --git a/content/docs/databases/postgresql.mdx b/content/docs/databases/postgresql.mdx new file mode 100644 index 00000000..5c8d91ee --- /dev/null +++ b/content/docs/databases/postgresql.mdx @@ -0,0 +1,50 @@ +--- +title: PostgreSQL +description: Deploy PostgreSQL databases on Coolify with advanced features, automated backups, import/restore capabilities, and 30+ years of reliability. +--- + +# PostgreSQL + + + +## What is PostgreSQL + +PostgreSQL is an advanced, open-source object-relational database system known for its reliability, feature robustness, and performance. It has more than 30 years of development and is widely used in the industry. + +PostgreSQL, often simply "Postgres", uses and extends the SQL language combined with many features that safely store and scale the most complicated data workloads. + +## Links + +- [The official website](https://www.postgresql.org/) +- [GitHub](https://github.com/postgres/postgres) + +## Import Backups + +Coolify can import a database dump into a running PostgreSQL instance using the +**Import Backups** section of the Configuration for the instance. + +The database dump can either be a file uploaded to the server, or dragged and +dropped into the Configuration screen directly. + +The import command can be customized, but by default it expects a database dump +created using the `pg_dump` command with the `-Fc` flag passed in (custom +format). + +For example, the following command connects to a PostgreSQL database running in +a local Docker container named `pg-db` as the database user `postgres` and +writes a dump of the `postgres` database to the file `example-database.sql.gz`: + +```bash +docker exec pg-db pg_dump -U postgres -d postgres -Fc >example-database.sql.gz +``` + +### Note on upgrading PostgreSQL + +The **custom** dump format is sensitive to version differences between the dump and +restore commands. + +Use the plain (default) or **tar** dump formats to migrate from an older version +of PostgreSQL to a newer version. When using plain format dumps, use `psql` as +the custom import command instead of `pg_restore`. + +See the PostgreSQL documentation for `pg_dump` and `pg_restore` for more information. diff --git a/content/docs/databases/redis.mdx b/content/docs/databases/redis.mdx new file mode 100644 index 00000000..4210abf4 --- /dev/null +++ b/content/docs/databases/redis.mdx @@ -0,0 +1,17 @@ +--- +title: Redis +description: Deploy Redis in-memory databases on Coolify with caching, vector database, document storage, streaming, and message broker capabilities. +--- + +# Redis + + + +## What is Redis + +Redis is an in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker. Redis has built-in replication and different levels of on-disk persistence. It supports complex data types (for example, strings, hashes, lists, sets, sorted sets, and JSON), with atomic operations defined on those data types. + +## Links + +- [The official website](https://redis.io/) +- [GitHub](https://github.com/redis/redis) diff --git a/content/docs/databases/ssl.mdx b/content/docs/databases/ssl.mdx new file mode 100644 index 00000000..ce733ec3 --- /dev/null +++ b/content/docs/databases/ssl.mdx @@ -0,0 +1,144 @@ +--- +title: Database SSL +description: Secure database connections on Coolify with SSL encryption, automatic certificate generation, and multiple SSL modes for enhanced security. +--- + +# Database SSL `^v4.0.0-beta.399` +Database SSL in Coolify encrypts the communication between your applications and databases, ensuring that data remains secure. + +With automatic certificate binding and generation, this feature simplifies secure setup. It was first introduced in Coolify version **v4.0.0-beta.399**. + + +## Introduction +Database SSL adds an extra layer of security by encrypting data exchanged with your database. This guide covers: +- Enabling SSL mode for your database connections. +- Selecting the appropriate SSL mode based on your security needs. +- Managing the CA certificate that verifies database connections. + + +## 1. How to Enable Database SSL +To secure your database connection with SSL: + +1. **Access Database Settings** + In your Coolify dashboard, access the general settings of the database you want to secure. + + +2. **Enable SSL Mode** + Check the **Enable SSL** option to activate SSL for the database connection. + + +3. **Select the SSL Mode** + Choose the SSL mode from the dropdown menu. For example, select **verify-full** for maximum security. + + + + + +To make use of SSL after enabling it, you need to use the new connection URL for your app, which includes the SSL configuration. + +If you are not using the new URL, the database connection will not use SSL (in most cases). + + + + +Coolify automatically binds the generated certificates and keys to the required locations, so manual changes are only needed if you wish to use custom certificates. + +## 2. SSL Modes Explained +Coolify supports several SSL modes, each providing a different level of security: + + +### PostgreSQL +- **allow (insecure)** + This mode permits both encrypted and unencrypted connections. It does not enforce SSL, so if SSL fails, the connection will fall back to an unencrypted state. + + This option is considered insecure because it allows unencrypted traffic. + +- **prefer (secure)** + With this mode, Coolify will attempt to use SSL first. If an SSL connection is available, it will be used, otherwise, it will fall back to an unencrypted connection. + + While this option prefers encryption, it doesn’t guarantee that every connection will be secured. + +- **require (secure)** + This mode mandates that the connection must be encrypted. However, it does not perform any checks on the server certificate. + + This means the connection is encrypted, but the identity of the server is not verified. + +- **verify-ca (secure)** + This option goes a step further by encrypting the connection and verifying that the server's certificate is signed by a trusted Certificate Authority (CA). It does not check if the hostname matches the certificate. + + This mode offers a balance between security and ease of setup. + +- **verify-full (secure)** + This is the most secure mode. It not only encrypts the connection and verifies the certificate authority but also confirms that the server’s hostname matches the certificate. + + This provides full assurance that you are connecting to the correct server, similar to the security level provided by Cloudflare Origin Certificate setups. + +### Other Databases +- **MySQL & MongoDB:** + Only the following modes are available: **prefer, require, verify ca, verify full**. +- **MariaDB, Redis, KeyDB, DragonFly DB:** + No SSL modes are visible in the UI. +- **Clickhouse DB:** + SSL is not supported, there is no checkbox to enable SSL nor dropdown options. + + + + +Modes lower than **require** are not 100% secure as they only encrypt the connection without full verification of the server’s identity. + +For modes higher than **require** (i.e., **verify-ca** and **verify-full**), you must mount the Coolify CA certificate into the container that connects to the database for additional security. + +Note that in most cases (for example, PostgreSQL), merely enabling SSL does nothing unless you use the new connection URL that enforces SSL. + +However, for some databases, like the redis-based ones, enabling SSL in the UI does enforce the mode. + + + + + + + +For maximum security, **verify-full** is recommended (when available). + + + + + +## 3. CA SSL Certificate Management +Coolify manages the CA certificate automatically, ensuring that secure database connections are validated. + +In the dashboard, under **Servers > YOUR_SERVER_NAME > Proxy > Advanced**, you can see the following options: + + +- **CA SSL Certificate**: Displays the current CA certificate used. +- **Save Certificate**: Allows you to save a local copy of the certificate. +- **Regenerate Certificate**: Lets you generate a new CA certificate if needed. + + +### Recommended Configuration +For secure connections, mount the Coolify CA certificate into all containers that need to connect to your databases. + +The recommended bind mount is: + +```bash +/data/coolify/ssl/coolify-ca.crt:/etc/ssl/certs/coolify-ca.crt:ro +``` + + +## 4. Using a Custom CA Certificate +If you wish to use your own CA certificate instead of the one generated by Coolify: + +1. **Prepare Your CA Certificate** + Make sure your certificate is in PEM format. + +2. **Upload Your Certificate** + Upload your custom CA certificate in the following location: + ```bash + /data/coolify/ssl/coolify-ca.crt + ``` + +3. **Mount the Certificate** + Make sure that the container that requires database access mounts the certificate at: + ```bash + /data/coolify/ssl/coolify-ca.crt:/etc/ssl/certs/coolify-ca.crt:ro + ``` \ No newline at end of file diff --git a/content/docs/get-started/cloud.mdx b/content/docs/get-started/cloud.mdx new file mode 100644 index 00000000..ca47370d --- /dev/null +++ b/content/docs/get-started/cloud.mdx @@ -0,0 +1,262 @@ +--- +title: Coolify Cloud +description: Coolify Cloud is a fully managed PaaS service with zero maintenance, automatic scaling, daily backups, and email notifications. +--- + + + +
+ +[Coolify Cloud](https://coolify.io/pricing/) is our managed, paid service (maintained by [Andras](https://x.com/heyandras), Coolify’s Founder) that runs the Coolify on our infrastructure, so you don’t need to allocate CPU, RAM, or disk for Coolify itself. + +You still bring your own servers (VPS, Raspberry Pi, EC2, etc.) and connect them via SSH, then deploy apps, databases, and services exactly as you would with a self-hosted instance. + +Coolify Cloud uses the same open-source codebase, so there are no locked-behind-paywall features. + +## Benefits of Coolify Cloud + +| Features | Explanation | +| :--------------------------- | :------------------------------------------------------------------------------------------------------------------ | +| **Zero Maintenance Coolify** | No need to upgrade, or monitor Coolify, our team does it for you. | +| **Daily Backups** | The Coolify Cloud database is backed up every 24 hours. | +| **Preconfigured Email** | Receive build, deployment, and server status notifications via email without any setup on your end. | +| **Automatic Scaling** | As you connect more servers, our infrastructure scales CPU, RAM, and disk usage for Coolify. | +| **Staged Updates** | New updates are first rolled out to self-hosted users. Once stability is confirmed, they’re rolled out to Cloud. | +| **Founder-Tested Releases** | Andras personally tests every update before it’s deployed to the Cloud, ensuring maximum stability and reliability. | + +## Getting Started with Coolify Cloud + +1. **Create Your Account:** + + - Visit the [Coolify Cloud Registration](https://app.coolify.io/register) page and sign up. + +2. **Choose Your Plan:** + + - Base fee: **$5/month** (includes up to two connected servers). + - **$3/month** per additional server. + +3. **Complete Payment** + + - Use any major credit/debit card to finish the subscription process. + +4. **Connect Your Servers** + + +
+Detailed Server Connection Guide + + 1. **Add Private Key:** Login to your Coolify account (or create one if you’re new) and Add a new private key + +
+ + *** + 2. **Add a Server:** Navigate to the **Servers** tab and add a new server by entering your Hetzner server’s IPv4 address. + +
+ + *** + 3. **Validate Server:** Click **Validate Server & Install Docker Engine**. Coolify will automatically install all necessary components on your server. + + *** + 4. **Check Status:** Once finished, you should see a green **Proxy Running** status indicating everything is set up. + + +
+ + +5. **Deploy Your Applications** + +## How Coolify Cloud Pricing works? + +We charge a base fee of **\$5/month**, which covers up to **two servers**. Each additional server you connect is an **add-on of \$3/month**. + +Charging per server allows us to scale our infrastructure responsibly, since each connected server increases resource usage (CPU, RAM, storage) on our end. + +If you only need one server, you still pay the $5 base fee (with capacity for a second server if you add it later). + +If you plan to connect more than two, simply multiply $3 by the extra servers. + +## Why Coolify Cloud Exists + +You might wonder why Coolify Cloud is a paid service when there are no exclusive, locked-down features. + +The idea came to Andras (Coolify's Founder) as a way to offer a “**paid option without paywall**” — a model where the open-source project stays completely free, but those who prefer a managed experience can contribute financially. + +- **Experiment Turned Success:** + - Initially launched as an experiment, Coolify Cloud quickly attracted over 2,100 active users. + +* **Sustainable Funding:** + + - While the revenue from Cloud is modest, it provides a steady income stream that helps keep Coolify free and under active development for everyone. + +* **Community-First Approach** + - By not restricting any features, we maintain transparency and trust. + - Cloud subscribers simply pay for convenience and reliability, not to unlock core functionality. + +## Frequently Asked Questions + + +
+1. Do I get any Cloud-only features? + +No. Coolify Cloud and self-hosted Coolify share the same feature set. + +Cloud’s value lies in automatic backups, email notifications, scaling, and update testing handled for you. + +
+ + +
+2. Does Coolify Cloud back up my application data? + +No, Coolify Cloud only backs up the Coolify database (e.g., dashboard settings). + +You are responsible for backing up any databases or storage volumes on your servers. + +
+ + +
+3. Can I import my self-hosted Coolify configurations to Coolify Cloud? + +No. + +To transfer configurations, you'll need to back up the database from your self-hosted instance and restore it to a new Coolify instance. + +However, since you don’t have access to the database in Coolify Cloud, it’s not possible to migrate data or settings directly to the cloud version. + +
+ + +
+4. How often Coolify Cloud is backed up? + +Every 24 hours + +
+ + +
+5. Is Coolify Cloud really based on the open-source version of Coolify? + +Yes, Coolify Cloud uses the same open-source codebase as the self-hosted version. There are no paywall features, and the Cloud service is simply a managed experience for convenience. + +
+ + +
+6. What happens if I cancel my Coolify Cloud subscription? + +If you cancel your subscription, you will stop being billed, and your access to Coolify Cloud will be suspended at the end of your current billing cycle. + +However, your servers will remain unaffected, and all of your applications will continue running as normal. + +Since your server will still be hosting your applications with a reverse proxy handling incoming requests, there will be no interruptions. + +
+ + +
+7. What happens if I forget to pay an invoice? + +If a payment fails or an invoice is missed, your subscription and access to Coolify Cloud will be temporarily paused until the payment is successfully processed. + +You will receive an email notification about the failed payment. + +Once the payment is made, your Coolify Cloud access will be restored, and all your settings will remain intact—there’s no data loss. + +Your servers will also stay up and running, and your applications will continue to function normally, as everything is still hosted on your own server with a reverse proxy. + +
+ + + +
+8. Are there any IP addresses I need to whitelist for Coolify Cloud? + +Yes, Coolify Cloud uses specific IP addresses. + +You can find the list of IPs [here](https://coolify.io/docs/knowledge-base/faq#coolify-cloud-public-ips). + +The main requirement is that Coolify Cloud needs to access your server's SSH port. + +
+ + +
+9. Do I need to bring my own servers to Coolify Cloud? + +Yes, when using Coolify Cloud, you must provide your own servers (e.g., VPS, Raspberry Pi, EC2, etc.). + +Coolify Cloud manages Coolify on our infrastructure, but we don’t provide the servers themselves. + +This approach allows you to choose the hardware that best fits your needs. + +
+ + +
+10. Why do I have to pay for Coolify Cloud if I’m bringing my own servers? + +While you bring your own servers, the subscription fee for Coolify Cloud covers the managed service aspect. + +This includes infrastructure management, maintenance, support, updates, and scaling, so you don’t have to worry about technical aspects like monitoring, patching, or backups for Coolify. + +We take care of the heavy lifting to ensure everything runs smoothly. + +
+ + +
+11. What happens if I exceed the number of connected servers? + +You won’t be able to add extra servers to Coolify cloud unless your subscription is upgraded. + +
+ + +
+12. Is there a trial period for Coolify Cloud? + +Currently, Coolify Cloud doesn’t offer a free trial. However, the subscription is affordable—just **$5 per month** for up to two connected servers. + +If you want to explore all the features, you can run Coolify on a small Linux server or a VM on your PC by following the [self-hosted installation guide](https://coolify.io/docs/get-started/installation). + +Since both cloud and self-hosted versions use the same codebase, you’ll be able to test all the features without any limitations. + +
+ + +
+13. Can I get any discounts? + +The current **$5/month** subscription rate is already quite affordable, so discounts are not available at the moment. + +
+ + +
+14. I have to pay to use Coolify Cloud, so doesn't that mean I'm locked into a vendor? + +**Not really.** + +You're paying for the managed Coolify instance, but stopping the use of Coolify Cloud won't affect your applications. + +You can connect your own server, so you retain full control. Everything runs as a Docker container, and Coolify will install a reverse proxy on your server to ensure everything works smoothly without needing Coolify Cloud. + +In a true vendor lock-in, your apps would stop if you stop paying, but that’s not the case with Coolify Cloud. + +
+ + +
+15. Can I access the Coolify Cloud dashboard on my own domain? + +No. + +The Coolify Cloud dashboard is only available at https://app.coolify.io. + +If you’d like to access the dashboard on your own domain, you’ll need to self-host Coolify. + +
+ diff --git a/content/docs/get-started/concepts.mdx b/content/docs/get-started/concepts.mdx new file mode 100644 index 00000000..46a75f9c --- /dev/null +++ b/content/docs/get-started/concepts.mdx @@ -0,0 +1,80 @@ +--- +title: Coolify Concepts +description: Learn core Coolify concepts including servers, resources, environments, projects, Docker containers, reverse proxy, and team management basics. +--- + + + +
+ +Many people start their self-hosting journey after discovering Coolify. If you’re one of them, here’s a list of a few concepts that could make your experience smoother. + +## Servers + +A server is a computer designed to run applications or services, providing the necessary computing power for your projects. + +It can be either physical such as a machine you have at home, like a Raspberry Pi, or one rented from a hosting provider like Hetzner. + +## Resources + +In Coolify, a resource refers to an application or service you set up on your server—like a website, database, or API. + +Each resource comes with its own configuration, like domains, backups, health checks, and so on. + +Coolify offers a handy list of pre-set resources, called one-click services, that you can deploy instantly. But if you prefer, you can also deploy your own application easily. + +## Environments + +In Coolify, a environment is a tailored setup on your server that determines how your resources operate. + +For instance, you could have a development environment for testing and debugging your code, alongside a production environment where your finished application goes live. + +With Coolify, you can set up multiple environments on a single server, letting you switch between them effortlessly. + +## Projects + +A project in Coolify is a group of environments and resources you’ve deployed on your server. + +It serves as the highest-level structure in Coolify, organizing your deployment setup. + +You can manage multiple projects on the same server, each with its own unique set of environments and resources. + +For example, you might create one project for all your hobby-related resources and another for work-related ones. + +## Containers + +In Coolify, everything you deploy runs as a Docker container, making it easy to manage and isolate your application. + +You can use pre-built Docker images from public registries like Docker Hub or GitHub Container Registry to deploy without building them yourself. + +To deploy, you need a Docker image, either one you’ve built or one from someone else. + +If you’re coding your own app, Coolify can auto-build the image from a Dockerfile or Docker Compose file, though this resource-heavy process requires a capable server. + +Alternatively, you can build the image elsewhere, push it to a registry, and let Coolify deploy it as a container. + +## Reverse Proxy + +A reverse proxy is a server or app that sits between your application and users, forwarding requests to the right place. + +Coolify includes two proxy options, Caddy and Traefik, which handle requests to your website by directing them to the container running your app. + +This setup lets you run multiple applications on one server without tweaking configs or ports. + +Plus, Coolify supports unlimited domains, so you could deploy 20 different apps, each with its own unique domain. + +The reverse proxy also automatically manages SSL/TLS certificates for your applications. When you enter a domain with `https://`, the proxy requests and installs certificates from [Let's Encrypt](https://letsencrypt.org?utm_source=coolify.io) automatically, with no manual configuration needed. Certificates are renewed automatically before they expire, keeping your applications secure without any intervention. + +## Security + +Coolify doesn’t manage your server’s security or updates, that’s your responsibility to keep everything secure and up to date. + +It’s built to simplify deployment management for you. While the Coolify core team plans to introduce more security features eventually, for now, securing your server is entirely up to you. + +## Teams + +Coolify supports multiple users and teams, allowing each team to have its own projects and environments. + +You can assign roles like admin to users, simplifying project management and collaboration on a single server. + +Currently, the teams feature isn’t fully polished for production use, but the Coolify core team plans to enhance it down the line. diff --git a/content/docs/get-started/contribute/coolify.mdx b/content/docs/get-started/contribute/coolify.mdx new file mode 100644 index 00000000..2e099cc2 --- /dev/null +++ b/content/docs/get-started/contribute/coolify.mdx @@ -0,0 +1,282 @@ +--- +title: Contributing to Core Coolify +description: Contribute to Coolify open-source development with step-by-step setup guide, Docker environment, Spin commands, and pull request workflow. +--- + +# Contributing to Coolify +> "First, thanks for considering contributing to my project. It really means a lot!" - [@andrasbacsai](https://github.com/andrasbacsai) + +You can ask for guidance anytime on our [Discord Community Server](https://coollabs.io/discord) in the `#contribute` channel. + +To understand the tech stack, please refer to the [Tech Stack](https://github.com/coollabsio/coolify/blob/main/TECH_STACK.md) document. + + +## Table of Contents +1. [Setup Development Environment](#_1-setup-development-environment) +2. [Verify Installation](#_2-verify-installation-optional) +3. [Fork and Setup Local Repository](#_3-fork-and-setup-local-repository) +4. [Set up Environment Variables](#_4-set-up-environment-variables) +5. [Start Coolify](#_5-start-coolify) +6. [Start Development](#_6-start-development) +7. [Create a Pull Request](#_7-create-a-pull-request) +8. [Development Notes](#development-notes) +9. [Resetting Development Environment](#resetting-development-environment) +10. [Additional Contribution Guidelines](#additional-contribution-guidelines) + + +## 1. Setup Development Environment +Follow the steps below for your operating system: + +
+Windows + +1. Install `docker-ce`, Docker Desktop (or similar): + - Docker CE (recommended): + - Install Windows Subsystem for Linux v2 (WSL2) by following this guide: [Install WSL](https://learn.microsoft.com/en-us/windows/wsl/install?ref=coolify) + - After installing WSL2, install Docker CE for your Linux distribution by following this guide: [Install Docker Engine](https://docs.docker.com/engine/install/?ref=coolify) + - Make sure to choose the appropriate Linux distribution (e.g., Ubuntu) when following the Docker installation guide + - Install Docker Desktop (easier): + - Download and install [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/?ref=coolify) + - Ensure WSL2 backend is enabled in Docker Desktop settings + +2. Install Spin: + - Follow the instructions to install Spin on Windows from the [Spin documentation](https://serversideup.net/open-source/spin/docs/installation/install-windows#download-and-install-spin-into-wsl2?ref=coolify) + +
+ +
+MacOS + +1. Install Orbstack, Docker Desktop (or similar): + - Orbstack (recommended, as it is a faster and lighter alternative to Docker Desktop): + - Download and install [Orbstack](https://docs.orbstack.dev/quick-start#installation?ref=coolify) + - Docker Desktop: + - Download and install [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/?ref=coolify) + +2. Install Spin: + - Follow the instructions to install Spin on MacOS from the [Spin documentation](https://serversideup.net/open-source/spin/docs/installation/install-macos/#download-and-install-spin?ref=coolify) + +
+ +
+Linux + +1. Install Docker Engine, Docker Desktop (or similar): + - Docker Engine (recommended, as there is no VM overhead): + - Follow the official [Docker Engine installation guide](https://docs.docker.com/engine/install/?ref=coolify) for your Linux distribution + - Docker Desktop: + - If you want a GUI, you can use [Docker Desktop for Linux](https://docs.docker.com/desktop/install/linux-install/?ref=coolify) + +2. Install Spin: + - Follow the instructions to install Spin on Linux from the [Spin documentation](https://serversideup.net/open-source/spin/docs/installation/install-linux#configure-docker-permissions?ref=coolify) + +
+ + +## 2. Verify Installation (Optional) +After installing Docker (or Orbstack) and Spin, verify the installation: + +1. Open a terminal or command prompt +2. Run the following commands: + ```bash + docker --version + spin --version + ``` + You should see version information for both Docker and Spin. + + +## 3. Fork and Setup Local Repository +1. Fork the [Coolify](https://github.com/coollabsio/coolify) repository to your GitHub account. + +2. Install a code editor on your machine (choose one): + + | Editor | Platform | Download Link | + |--------|----------|---------------| + | Visual Studio Code (recommended free) | Windows/macOS/Linux | [Download](https://code.visualstudio.com/download?ref=coolify) | + | Cursor (recommended but paid) | Windows/macOS/Linux | [Download](https://www.cursor.com/?ref=coolify) | + | Zed (very fast) | Windows/macOS/Linux | [Download](https://zed.dev/download?ref=coolify) | + +3. Clone the Coolify Repository from your fork to your local machine + - Use `git clone` in the command line, or + - Use GitHub Desktop (recommended): + - Download and install from [https://desktop.github.com/](https://desktop.github.com/?ref=coolify) + - Open GitHub Desktop and login with your GitHub account + - Click on `File` -> `Clone Repository` select `github.com` as the repository location, then select your forked Coolify repository, choose the local path and then click `Clone` + +4. Open the cloned Coolify Repository in your chosen code editor. + + +## 4. Set up Environment Variables +1. In the Code Editor, locate the `.env.development.example` file in the root directory of your local Coolify repository. +2. Duplicate the `.env.development.example` file and rename the copy to `.env`. +3. Open the new `.env` file and review its contents. Adjust any environment variables as needed for your development setup. +4. If you encounter errors during database migrations, update the database connection settings in your `.env` file. Use the IP address or hostname of your PostgreSQL database container. You can find this information by running `docker ps` after executing `spin up`. +5. Save the changes to your `.env` file. + + +## 5. Start Coolify +1. Open a terminal in the local Coolify directory. +2. Run the following command in the terminal (leave that terminal open): + ```bash + spin up + ``` + + + + +You may see some errors, but don't worry this is expected. + + + + +3. If you encounter permission errors, especially on macOS, use: + ```bash + sudo spin up + ``` + + + + +If you change environment variables afterwards or anything seems broken, press Ctrl + C to stop the process and run `spin up` again. + + + + + +## 6. Start Development +1. Access your Coolify instance: + - URL: `http://localhost:8000` + - Login: `test@example.com` + - Password: `password` + +2. Additional development tools: + +| Tool | URL | Note | +|------|-----|------| +| Laravel Horizon (scheduler) | `http://localhost:8000/horizon` | Only accessible when logged in as root user | +| Mailpit (email catcher) | `http://localhost:8025` | | +| Telescope (debugging tool) | `http://localhost:8000/telescope` | Disabled by default | + + + + +To enable Telescope, add the following to your `.env` file: +```yaml +TELESCOPE_ENABLED=true +``` + + + + + +## 7. Create a Pull Request +1. After making changes or adding a new service: + - Commit your changes to your forked repository. + - Push the changes to your GitHub account. + +2. Creating the Pull Request (PR): + - Navigate to the main Coolify repository on GitHub. + - Click the "Pull requests" tab. + - Click the green "New pull request" button. + - Choose your fork and branch as the compare branch. + - Click "Create pull request". + +3. Filling out the PR details: + - Give your PR a descriptive title. + - Use the Pull Request Template provided and fill in the details. + + + + +Always set the base branch for your PR to the `next` branch of the Coolify repository, not the `v4.x` branch. + + + + +4. Submit your PR: + - Review your changes one last time. + - Click "Create pull request" to submit. + + + + +Make sure your PR is out of draft mode as soon as it's ready for review. PRs that are in draft mode for a long time may be closed by maintainers. + + + + +After submission, maintainers will review your PR and may request changes or provide feedback. + + +## Development Notes +When working on Coolify, keep the following in mind: + +1. **Database Migrations**: After switching branches or making changes to the database structure, always run migrations: +```bash +docker exec -it coolify php artisan migrate +``` + +2. **Resetting Development Setup**: To reset your development setup to a clean database with default values: +```bash +docker exec -it coolify php artisan migrate:fresh --seed +``` + +3. **Troubleshooting**: If you encounter unexpected behavior, ensure your database is up-to-date with the latest migrations and if possible reset the development setup to eliminate any environment-specific issues. + + + + +Forgetting to migrate the database can cause problems, so make it a habit to run migrations after pulling changes or switching branches. + + + + + +## Resetting Development Environment +If you encounter issues or break your database or something else, follow these steps to start from a clean slate (works since `v4.0.0-beta.342`): + +1. Stop all running containers `ctrl + c`. + +2. Remove all Coolify containers: +```bash +docker rm coolify coolify-db coolify-redis coolify-realtime coolify-testing-host coolify-minio coolify-vite-1 coolify-mail +``` + +3. Remove Coolify volumes (it is possible that the volumes have no `coolify` prefix on your machine, in that case remove the prefix from the command): +```bash +docker volume rm coolify_dev_backups_data coolify_dev_postgres_data coolify_dev_redis_data coolify_dev_coolify_data coolify_dev_minio_data +``` + +4. Remove unused images: +```bash +docker image prune -a +``` + +5. Start Coolify again: +```bash +spin up +``` + +6. Run database migrations and seeders: +```bash +docker exec -it coolify php artisan migrate:fresh --seed +``` + +After completing these steps, you'll have a fresh development setup. + + + + +Always run database migrations and seeders after switching branches or pulling updates to ensure your local database structure matches the current codebase and includes necessary seed data. + + + + + +## Additional Contribution Guidelines +### Contributing a New Service +To add a new service to Coolify, please refer to our documentation: [Adding a New Service](/get-started/contribute/service) + +### Contributing to Documentation + +To contribute to the Coolify documentation, please refer to this guide: [Contributing to the Coolify Documentation](/get-started/contribute/documentation) diff --git a/content/docs/get-started/contribute/documentation.mdx b/content/docs/get-started/contribute/documentation.mdx new file mode 100644 index 00000000..d9bb16b8 --- /dev/null +++ b/content/docs/get-started/contribute/documentation.mdx @@ -0,0 +1,96 @@ +--- +title: "Contributing to Coolify Documentation" +description: Contribute to Coolify docs with this guide covering repository setup, local development with Bun, image guidelines, and pull request workflow. +--- + +# Coolify Docs Contribution Guide + +This guide outlines the process for contributing updates and fixes to our docs. Please follow the steps below to ensure a smooth and efficient workflow. + + +## 1. Repository Workflow +- **Release Process:** + We follow a weekly production release cycle. The **main** branch represents production, while the **next** branch is used as our development branch. + +- **Branching Guidelines:** + - **Do not create pull requests (PRs) to the main branch.** + - All contributions should be made to the **next** branch. + - **Clone the repository from the next branch** to your GitHub account, then start working on your changes. + + +## 2. Getting Started + +### Step 1: Fork and Clone the Repository +- First fork the docs repository to your github account, then clone your fork to your local system using: + ```bash + git clone https://github.com/your-username/your-repo-name.git + ``` +- Navigate to the cloned repository: + ```bash + cd your-repo-name + ``` + +### Step 2: Install Dependencies and Run the Dev Server +We use [bun](https://bun.sh/) as our preferred package manager for local development. If you choose to use a different package manager, please **do not include its configuration files** in your commit. + +To set up your environment, run: +```bash +bun install && bun run dev +``` + +The development server will start on `localhost` at port `5173`. You can view the documentation by navigating to: +```bash +http://localhost:5173/docs/ +``` + + +## 3. Image Guidelines +- **Format:** + All images used in the documentation must be in `.webp` format. + +- **Location:** + Place all image files in the `/docs/public` directory. + +- **Usage:** + Use the Zoomable image component on the docs to attach your images + ```text + + ``` + + +## 4. Writing and Structuring Content + +### Best Practices for Documentation: +- **Clear and Simple Language:** + Use plain and easily understandable English. Remember that not all readers are native English speakers. + +- **Beginner-Friendly Guides:** + Break down instructions into small, easy-to-follow steps. Include screenshots wherever possible to help visualize the process, especially for users new to self-hosting or Coolify. + +- **Content Organization:** + Structure your content with clear headings, bullet points, and numbered steps where applicable. This makes it easier for readers to follow along. + + +## 5. Submitting Your Contribution +1. **Commit your changes to your repository** + +2. **Create a Pull Request:** + - Open a pull request (PR) to merge your changes into the **next** branch on the docs repository. + - Provide a detailed description of your updates to help maintainers review your contribution effectively. + + +## 6. Questions and Support +If you have any questions or run into issues while contributing: + - **Create an Issue:** Open an issue on the repository detailing your issue. + - **Discord:** Reach out to us on contribute channel on the [Coolify Discord community](https://coolify.io/discord). + + +## 7. Important Notes +- **Documentation Updates:** + The current docs are bit outdated and missing some information. The docs maintainers are actively rewriting parts of the documentation to improve structure and clarity before new content is added. + +- **PR Approval:** + Merging of your PR is subject to review by the maintainers. Please be patient as they work through the process. + + +We appreciate your contribution and effort in making the Coolify docs better for everyone. \ No newline at end of file diff --git a/content/docs/get-started/contribute/meta.json b/content/docs/get-started/contribute/meta.json new file mode 100644 index 00000000..fa9b34a7 --- /dev/null +++ b/content/docs/get-started/contribute/meta.json @@ -0,0 +1,8 @@ +{ + "title": "Contribute", + "pages": [ + "coolify", + "service", + "documentation" + ] +} \ No newline at end of file diff --git a/content/docs/get-started/contribute/service.mdx b/content/docs/get-started/contribute/service.mdx new file mode 100644 index 00000000..7e540c90 --- /dev/null +++ b/content/docs/get-started/contribute/service.mdx @@ -0,0 +1,208 @@ +--- +title: "Add a new service template to Coolify" +description: Add new service templates to Coolify using Docker Compose with magic environment variables, storage handling, and one-click deployment features. +--- + +# Adding a new service template to Coolify + +Services in Coolify are templates made from normal [docker-compose](https://docs.docker.com/reference/compose-file/) files with some added Coolify magic. + + + + +The service’s Git repository must have at least 1,000 stars to be added to Coolify as a one click service. + + + + + + + +See [Coolify's docker-compose specs](/knowledge-base/docker/compose#coolify-s-magic-environment-variables) to learn more about Coolify's magic and how to benefit from generated variables and storage handling. Please use this magic when submitting your PR to make the merging process smoother. + + + + +1. Add metadata + + At the top of your `docker-compose` file, add the following metadata: + + ```yaml + # documentation: https://docs.example.com/ + # slogan: A brief description of your service + # category: One word, broad app type + # tags: tag1,tag2,tag3 + # logo: svgs/your-service.svg + # port: 1234 + ``` + + - `documentation`: Link to the service's official documentation + - `slogan`: A short description of the service + - `category`: A one word broad app type + - `tags`: Comma-separated list for better searchability + - `logo`: Path to the service's logo (see step 3) + - `port`: The main entrypoint port of the service + + + + +Always specify a port, as Caddy Proxy cannot automatically determine the service's port. + + + + +2. Create the docker-compose file + + Below the metadata, add your docker-compose configuration. Use Coolify's environment variable magic [here](/knowledge-base/docker/compose#coolifys-magic-environment-variables). + + Example: + + ```yaml + services: + app: + image: your-service-image:tag + environment: + - DATABASE_URL=${COOLIFY_DATABASE_URL} + volumes: + - ${COOLIFY_VOLUME_APP}:/data + ``` + + **Using Required Environment Variables:** + When creating service templates, mark critical configuration as required to improve user experience: + + ```yaml + services: + app: + image: your-service:latest + environment: + # Required - critical configuration that must be set by the user + - DATABASE_URL=${DATABASE_URL:?} + - API_KEY=${API_KEY:?} + + # Required with sensible defaults - improves usability + - PORT=${PORT:?8080} + - LOG_LEVEL=${LOG_LEVEL:?info} + + # Optional - features that can be left empty + - DEBUG=${DEBUG:-false} + - CACHE_TTL=${CACHE_TTL:-3600} + ``` + + This helps users understand which configuration is essential and prevents deployment failures. + +3. Add a logo + + - Create or obtain an SVG logo for your service (strongly preferred format) + - If SVG is unavailable, use a high-quality.webp or JPG as a last resort + - Add the logo file to the `svgs` folder in the Coolify repository + - The logo filename should match the docker-compose service name exactly + - For example, if your service name is `wordpress`, your logo should be `wordpress.svg` and the final path then is `svgs/wordpress.svg` use this path in the `logo` metadata. + +4. Test your template + + Use the `Docker Compose Empty` deployment option in Coolify to test your template. This process mimics the one-click service deployment. + +5. Submit a Pull Request + + Once your template works correctly: + + - Open a [PR](https://github.com/coollabsio/coolify/compare) + - Add your new `.yaml` compose file under `/templates/compose` + - Include the logo file in the `svgs` folder + + + + + Coolify uses a [parsed version](https://github.com/coollabsio/coolify/blob/main/templates/service-templates.json) of the templates for deployment. + + + + +## Adding a new service template to the Coolify Documentation + +Once your service template is merged into Coolify, it will be important to also add documentation for it in the Coolify docs. +In the [Coolify Docs Contribute section](/get-started/contribute/documentation) we explain how to contribute and run the documentation on your own PC. + + + + +The services overview page and the [All Services](/services/all) directory are **generated automatically** from the frontmatter of each markdown file in `docs/services/`. You do **not** need to edit `List.vue` or `all.md` manually anymore. The generators run as part of `bun run dev`, `bun run build`, and `bun run preview`. + +- `scripts/generate-service-list.mjs` → writes `src/generated/services.json` (consumed by the services overview component) +- `scripts/generate-services-page.mjs` → writes `docs/services/all.md` +- Both scripts share `scripts/services-data.mjs`, which parses each service's frontmatter and resolves its logo from `docs/public/images/services/` + + + + +As soon as you have your local setup ready, follow these steps to add your new service: + +1. Add the service logo under `/docs/public/images/services/` + + - Use the same base name as your service slug, e.g. `my-service.svg` or `my-service-logo.svg`. The icon resolver tries `-logo`, `_logo`, `logo`, then bare ``, then the same variants based on the title. + - Prefer SVG; otherwise WebP, then PNG. Avoid JPEG for logos. + +2. Create the documentation file + + Create `/docs/services/.md`. The slug must be lowercase and kebab-case, and must match the filename. Use this frontmatter: + + ```yaml + --- + title: "Service Name" + description: "Short description that appears on the service card and search results." + og: + description: "SEO/social-card description (optional, longer than `description`)." + category: "Analytics" + icon: "/docs/images/services/service-name-logo.svg" + --- + ``` + + | Field | Required | Notes | + |---|---|---| + | `title` | yes | Display name shown on the card | + | `description` | yes | Used as the card description and in `all.md` | + | `category` | yes | Determines the heading the service appears under in `all.md` and the filter in the overview | + | `icon` | optional | Only set if auto-resolution can't find your logo | + | `og.description` | optional | Longer description used for social/SEO meta tags | + | `disabled` | optional | Set to `true` to hide the service from the listing while keeping the page reachable by direct URL | + +3. Write the documentation + + Start writing your documentation under the frontmatter. Use the following template as a starting point: + + ```text + # Service Name + + ![Service Name](/docs/images/services/service-name-logo.svg) + + ## What is Service Name? + + Brief description and use cases. + + ## Links + + - [Official website](https://example.com?utm_source=coolify.io) + - [GitHub](https://github.com/example/repo?utm_source=coolify.io) + ``` + + Use `` only for screenshots that benefit from a zoomable view, not for the logo. + +4. Regenerate the listings (optional — happens automatically on `dev`/`build`) + + ```bash + bun run generate:services + ``` + + This refreshes `src/generated/services.json` and `docs/services/all.md`. Commit both regenerated files alongside your new service page. + +5. Submit a Pull Request + + - Target the `next` branch + - Verify the service renders correctly with `bun run dev`, including the listing card, the filter category, and the entry in `/services/all` + +# Request a new service + +If there's a service template you'd like to see in Coolify: + +1. Search [GitHub discussions](https://github.com/coollabsio/coolify/discussions/categories/service-template-requests) for existing requests. +2. If the service has been requested, upvote it. If not, create a new request. diff --git a/content/docs/get-started/dev.mdx b/content/docs/get-started/dev.mdx new file mode 100644 index 00000000..7441bcb4 --- /dev/null +++ b/content/docs/get-started/dev.mdx @@ -0,0 +1,51 @@ +--- +title: Coolify Concepts +description: Learn core Coolify concepts including servers, resources, environments, projects, Docker containers, reverse proxy, and team management basics. +--- + + + + +This draws attention to important information + + + + + + + +This draws attention to important information + + + + + + + +This draws attention to important information + + + + + + + +This draws attention to important information + + + + + + + +This draws attention to important information + + + + + + + +This draws attention to important information + + diff --git a/content/docs/get-started/downgrade.mdx b/content/docs/get-started/downgrade.mdx new file mode 100644 index 00000000..fabb8577 --- /dev/null +++ b/content/docs/get-started/downgrade.mdx @@ -0,0 +1,89 @@ +--- +title: Downgrading Coolify +description: Downgrade self-hosted Coolify to previous versions by disabling auto-update, using SSH terminal commands, and handling database compatibility risks. +--- + + + +
+ +If you're using [Coolify Cloud](https://coolify.io/pricing/), the Coolify team handles all updates so you **cannot** downgrade the version of Coolify. If you are facing any issues, please contact [support](/get-started/support). + +For those who **self-host** Coolify, you can easily downgrade to the previous version. Follow the steps below to perform a downgrade on to a previous version. + + + + + +- Always back up your Coolify data before performing an downgrade. +- Downgrading can introduce issues that can be difficult to fix. + + + + +The Downgrade process involves the following three steps: + +- [Disable Auto Update](#_1-disable-auto-update) +- [Login to Your Server via SSH](#_2-login-to-your-server-via-ssh) +- [Execute the Downgrade Command](#_3-execute-the-downgrade-command) + +## 1. Disable Auto Update + +Before downgrading, it's important to disable the Auto Update feature to prevent Coolify from automatically upgrading again after you perform the downgrade. + +1. Log in as the root user (or any user who has access to the root or initial team). + +2. Navigate to the Settings menu in your Coolify dashboard. + +3. In the Settings menu, disable the **Auto Update** feature. + + + + + + +Disabling auto-update is essential, as it ensures that Coolify doesn’t override your downgrade with a newer version. + + + + +## 2. Login to Your Server via SSH + +Next, you need to SSH into your server to execute the downgrade command. + +## 3. Execute the Downgrade Command + +To downgrade Coolify to the desired version, run the following command in your terminal: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.0.0-beta.369 +``` + +Replace `4.0.0-beta.369` with the version number you want to downgrade to. + +For example, you can downgrade to `4.0.0-beta.333` or any previous version. + + + + +Double-check the version number you are specifying to ensure you are downgrading to the correct version. You can check the Coolify [release notes](https://github.com/coollabsio/coolify/releases) for version details. + + + + +## Potential Issues with Downgrading + +While downgrading is possible, be aware of the following risks: + +- [Database Schema Compatibility](#database-schema-compatibility) +- [Feature Incompatibility](#feature-incompatibility) + +--- + +#### Database Schema Compatibility: + +Downgrading can cause issues since the database schema may not be backward compatible. Some features may not work as expected due to changes in the database structure between versions. + +#### Feature Incompatibility: + +Some features might not function properly after downgrading, as certain features in the newer version may rely on changes that are not present in the older version. diff --git a/content/docs/get-started/installation.mdx b/content/docs/get-started/installation.mdx new file mode 100644 index 00000000..83c9856e --- /dev/null +++ b/content/docs/get-started/installation.mdx @@ -0,0 +1,464 @@ +--- +title: Installation +description: Install Coolify self-hosted PaaS on Linux servers with automated Docker setup script, manual configuration, SSH access, and firewall setup. +outline: 2 +--- + + + +
+ +If you decide to go with **Coolify Cloud**, there's no installation required. Simply visit [Coolify Cloud Registration](https://app.coolify.io/register) to create an account and start using Coolify within minutes! + +Below, you'll find instructions for installing Coolify if you prefer to **self-host** it. + +## Self-hosted Installation + +If you like taking control and managing everything yourself, self-hosting Coolify is the way to go. + +It's completely free (apart from your server costs) and gives you full control over your setup. + + + + + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash +``` + +Run this script in your terminal, and Coolify will be installed automatically. For more details, including firewall configuration and prerequisites, check out the guide below. + + + + + + + + +The automatic installation script only works with Ubuntu LTS versions (20.04, 22.04, 24.04). If you're using a non-LTS version (e.g., 24.10), please use the [Manual Installation](#manual-installation) method below. + + + + +## Before You Begin + +Before installing Coolify, make sure your server meets the necessary requirements. + +### 1. Server Requirements + +You need a server with SSH access. This could be: + +- A VPS (Virtual Private Server) +- A Dedicated Server +- A Virtual Machine (VM) +- A Raspberry Pi (see our [Raspberry Pi OS Setup Guide](/knowledge-base/how-to/raspberry-pi-os#prerequisites)) +- Or any other server with SSH access + + + + +It’s best to use a fresh server for Coolify to avoid any conflicts with existing applications. + + + + + + + +If you haven't picked a server provider yet, consider using [Hetzner](https://coolify.io/hetzner). You can even use our [referral link](https://coolify.io/hetzner) to support the project. + + + + +### 2. Supported Operating Systems + +Coolify supports several Linux distributions: + +- Debian-based (e.g., Debian, Ubuntu - all versions supported, but non-LTS Ubuntu requires manual installation) +- Redhat-based (e.g., CentOS, TencentOS, Fedora, Redhat, AlmaLinux, Rocky, Asahi) +- SUSE-based (e.g., SLES, SUSE, openSUSE) +- Arch Linux (Note: Not all Arch derivatives are supported) +- Alpine Linux +- Raspberry Pi OS 64-bit (Raspbian) + + + + +For some distros (like AlmaLinux), Docker must be pre-installed. If the install script fails, manually install Docker and re-run the script. + +Other Linux distributions may work with Coolify, but have not been officially tested. + + + + +### 3. Supported Architectures + +Coolify runs on 64-bit systems: + +- AMD64 +- ARM64 + + + + +Be sure to use the 64-bit version of Raspberry Pi OS (Raspbian). For details, check our [Raspberry Pi OS Setup Guide](/knowledge-base/how-to/raspberry-pi-os#prerequisites). + + + + +### 4. Minimum Hardware Requirements + +Your server should have at least: + +- **CPU**: 2 cores +- **Memory (RAM)**: 2 GB +- **Storage**: 30 GB of free space + +Coolify may function properly on servers with lower specs than those mentioned above, but we recommend slightly higher minimum requirements. + +This ensures that users have sufficient resources to deploy multiple applications without performance issues. + + + + +If you’re running both builds and Coolify on the same server, monitor your resource usage. High resource usage could make your server unresponsive. + +Consider enabling swap space or upgrading your server if needed. + + + + +### 5. Server Resources for Your Projects + +The resources you need depend on your projects. For example, if you're hosting multiple services or larger applications, choose a server with higher CPU, memory, and storage. + + + + +Andras runs his production apps on a server with: + +- **Memory**: 8GB (average usage: 3.5GB) +- **CPU**: 4 cores (average usage: 20–30%) +- **Storage**: 150GB (average usage: 40GB) + +This setup comfortably supports: + +- 3 NodeJS apps +- 4 Static sites +- Plausible Analytics +- Fider (feedback tool) +- UptimeKuma (uptime monitoring) +- Ghost (newsletters) +- 3 Redis databases +- 2 PostgreSQL databases + + + + +## Installation Methods + +There are two ways to install Coolify: + +- [Quick Installation](#quick-installation-recommended) (Recommended) +- [Manual Installation](#manual-installation) + +We highly recommend the **Quick Installation** method as it automates the process and reduces the chance of errors. + +--- + +### Quick Installation (Recommended) + +This is the simplest and fastest way to get Coolify up and running. + +#### 1. Prepare Your Server + +- Log in as the root user (non-root users are not fully supported yet). +- Configure SSH by following the [SSH Settings Guide](/knowledge-base/server/openssh#ssh-settings-configuration). +- Set up your firewall with the help of the [Firewall Guide](/knowledge-base/server/firewall). +- Ensure that [curl](https://curl.se/) is installed (it usually comes pre-installed). + +#### 2. Run the Installation Script + +Once your server is ready, run: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash +``` + +View the [Script's Source Code](https://github.com/coollabsio/coolify/blob/main/scripts/install.sh) + + + + +If you're not logged in as the root user, run the script with sudo: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash +``` + + + + + +#### Advanced: Customizing Installation with Environment Variables + +The installation script supports several environment variables to customize your Coolify installation. These are completely optional. + + +
+Click to view all available environment variables + + +You can set these environment variables before running the installation script to customize your Coolify setup: + +| Environment Variable | Description | Default Value | Example | +| ---------------------------- | ----------------------------------------------------- | ------------- | -------------------- | +| `ROOT_USERNAME` | Predefined root username for first admin account | - | `admin` | +| `ROOT_USER_EMAIL` | Predefined root user email for first admin account | - | `admin@example.com` | +| `ROOT_USER_PASSWORD` | Predefined root user password for first admin account | - | `SecurePassword123!` | +| `DOCKER_ADDRESS_POOL_BASE` | Custom Docker address pool base (CIDR notation) | `10.0.0.0/8` | `172.16.0.0/12` | +| `DOCKER_ADDRESS_POOL_SIZE` | Custom Docker address pool size (must be 16-28) | `24` | `20` | +| `DOCKER_POOL_FORCE_OVERRIDE` | Force override existing Docker pool configuration | `false` | `true` | +| `AUTOUPDATE` | Enable/disable automatic Coolify updates | `true` | `false` | +| `REGISTRY_URL` | Custom Docker registry URL for Coolify images | `ghcr.io` | `your-registry.com` | + +**Usage Examples:** + +**1. Create Admin Account During Installation:** + +```bash +env ROOT_USERNAME=admin \ +ROOT_USER_EMAIL=admin@example.com \ +ROOT_USER_PASSWORD=SecurePassword123 \ +bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' +``` + +See the [Create Root User with Environment Variables](/knowledge-base/create-root-user-with-env) guide for more details. + +**2. Custom Docker Network Pool:** + +```bash +env DOCKER_ADDRESS_POOL_BASE=172.16.0.0/12 \ +DOCKER_ADDRESS_POOL_SIZE=20 \ +bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' +``` + +See the [Define Custom Docker Network with ENV](/knowledge-base/define-custom-docker-network-with-env) guide for more details. + +**3. Disable Auto-Updates:** + +```bash +env AUTOUPDATE=false \ +bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' +``` + +**4. Use Custom Docker Registry:** + +```bash +env REGISTRY_URL=your-registry.com \ +bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' +``` + +When using a custom registry, make sure all required Coolify images are available in your registry. + +**5. Combine Multiple Variables:** + +```bash +env ROOT_USERNAME=admin \ +ROOT_USER_EMAIL=admin@example.com \ +ROOT_USER_PASSWORD=SecurePassword123 \ +AUTOUPDATE=false \ +DOCKER_ADDRESS_POOL_BASE=172.16.0.0/12 \ +bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' +``` + + +
+ + +#### 3. Access Coolify + +After installation, the script will display your Coolify URL (e.g., `http://203.0.113.1:8000`). Visit this URL, and you'll be redirected to a registration page to create your first admin account. + + + + +**Immediately create your admin account after installation. If someone else accesses the registration page before you, they might gain full control of your server.** + + + + + + + +If you installed Coolify on a Raspberry Pi within your home network, use your private IP address to access it, as the public IP may not work. + + + + +#### What the Installer Does: + +- Installs essential tools (curl, wget, git, jq, openssl) +- Installs Docker Engine (version 24+) +- Configures Docker settings (logging, daemon) +- Sets up directories at `/data/coolify` +- Configures SSH keys for server management +- Installs and starts Coolify + + + + +Docker installed via snap is not supported! + + + + +**The quick installation guide ends here. If you’ve followed the steps above, you can start using Coolify now. The guide below is for those who want to manually install and set up Coolify.** + +--- + +### Manual Installation + +For those who prefer more control, you can install Coolify manually. This method requires a few extra steps. + + + + +This manual installation method is required for: + +- Non-LTS Ubuntu versions (e.g., 24.10) +- Systems where the automatic script encounters issues + + + + +#### Prerequisites + +- **SSH**: Ensure SSH is enabled and set up correctly (see [SSH Configuration Guide](/knowledge-base/server/openssh)). +- **curl**: Confirm that [curl](https://curl.se/) is installed. +- **Docker Engine**: Install Docker by following the official [Docker Engine Installation guide](https://docs.docker.com/engine/install/#server) (version 24+). + + + + +Docker installed via snap is not supported! + + + + +--- + +Follow these steps for a manual setup: + +#### 1. Create Directories + +Create the base directories for Coolify under `/data/coolify`: + +```bash +mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance} +mkdir -p /data/coolify/ssh/{keys,mux} +mkdir -p /data/coolify/proxy/dynamic +``` + +#### 2. Generate & Add SSH Key + +Generate an SSH key for Coolify to manage your server: + +```bash +ssh-keygen -f /data/coolify/ssh/keys/id.root@host.docker.internal -t ed25519 -N '' -C root@coolify +``` + +Then, add the public key to your `~/.ssh/authorized_keys`: + +```bash +cat /data/coolify/ssh/keys/id.root@host.docker.internal.pub >> ~/.ssh/authorized_keys +chmod 600 ~/.ssh/authorized_keys +``` + + + + +If you already have an SSH key, you can skip generating a new one, but remember to add it to your Coolify instance after installation. + + + + +#### 3. Setup Configuration Files + +Download the necessary files from Coolify’s CDN to `/data/coolify/source`: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/docker-compose.yml -o /data/coolify/source/docker-compose.yml +curl -fsSL https://cdn.coollabs.io/coolify/docker-compose.prod.yml -o /data/coolify/source/docker-compose.prod.yml +curl -fsSL https://cdn.coollabs.io/coolify/.env.production -o /data/coolify/source/.env +curl -fsSL https://cdn.coollabs.io/coolify/upgrade.sh -o /data/coolify/source/upgrade.sh +``` + +#### 4. Set Permissions + +Set the correct permissions for the Coolify files and directories: + +```bash +chown -R 9999:root /data/coolify +chmod -R 700 /data/coolify +``` + +#### 5. Generate Values + +Update the `.env` file with secure random values: + +```bash +sed -i "s|APP_ID=.*|APP_ID=$(openssl rand -hex 16)|g" /data/coolify/source/.env +sed -i "s|APP_KEY=.*|APP_KEY=base64:$(openssl rand -base64 32)|g" /data/coolify/source/.env +sed -i "s|DB_PASSWORD=.*|DB_PASSWORD=$(openssl rand -base64 32)|g" /data/coolify/source/.env +sed -i "s|REDIS_PASSWORD=.*|REDIS_PASSWORD=$(openssl rand -base64 32)|g" /data/coolify/source/.env +sed -i "s|PUSHER_APP_ID=.*|PUSHER_APP_ID=$(openssl rand -hex 32)|g" /data/coolify/source/.env +sed -i "s|PUSHER_APP_KEY=.*|PUSHER_APP_KEY=$(openssl rand -hex 32)|g" /data/coolify/source/.env +sed -i "s|PUSHER_APP_SECRET=.*|PUSHER_APP_SECRET=$(openssl rand -hex 32)|g" /data/coolify/source/.env +``` + + + + +Run these commands only the first time you install Coolify. Changing these values later can break your installation. Keep them safe! + + + + +#### 6. Create Docker Network + +Ensure the Docker network is created: + +```bash +docker network create --attachable coolify +``` + +#### 7. Start Coolify + +Launch Coolify using Docker Compose: + +```bash +docker compose --env-file /data/coolify/source/.env -f /data/coolify/source/docker-compose.yml -f /data/coolify/source/docker-compose.prod.yml up -d --pull always --remove-orphans --force-recreate +``` + + + + +You might have to do `docker login` at this point if you have any issues above. + + + + + + + +You can customize Coolify's containers (ports, resource limits, labels, etc.) in a way that survives upgrades by creating a `docker-compose.custom.yml` file. See [Custom Compose Overrides](/knowledge-base/custom-compose-overrides) for details. + + + + +#### 8. Access Coolify + +You can now access Coolify by visiting `http://203.0.113.1:8000` (replace the `203.0.113.1` with the IP address of your server). + +If you get stuck at any step, feel free to join our [Discord community](https://coolify.io/discord) and create a post in the support forum channel. diff --git a/content/docs/get-started/introduction.mdx b/content/docs/get-started/introduction.mdx new file mode 100644 index 00000000..738ae066 --- /dev/null +++ b/content/docs/get-started/introduction.mdx @@ -0,0 +1,96 @@ +--- +title: Introduction to Coolify +description: Coolify is an open-source self-hosted PaaS alternative to Vercel, Heroku, and Railway with unlimited deployments, no vendor lock-in, and free SSL. +outline: [2, 4] +lastUpdated: true +editLink: true +--- + + + +
+ +## What is Coolify? + +Coolify is a software that makes self-hosting simple and powerful. It lets you run your applications, databases, and services on your own server, whether that’s an old laptop, a Raspberry Pi, or a rented server from a provider like [Hetzner](https://coolify.io/hetzner). + +With Coolify, you get full control over your projects, your data, and your costs. It’s completely free to use, open-source, and has no features locked behind a paywall. + +Think of Coolify as your personal alternative to cloud platforms like [Vercel](https://vercel.com?utm_source=coolify.io), [Railway](https://railway.com/?utm_source=coolify.io), or [Heroku](https://www.heroku.com/?utm_source=coolify.io), but without the huge bills or privacy trade-offs. + +### What Coolify Is Not + +Coolify isn’t a cloud service that hosts everything for you, you need your own server. That could be your old laptop, a Raspberry Pi, or a rented server from a hosting provider like [Hetzner](https://coolify.io/hetzner), and you’ll need SSH access to use it. + +It’s not a zero-effort solution either, if you choose to self-host, you’ll need to set up your server and install Coolify. But once it’s running, managing your projects becomes very easy. + +## Features of Coolify + +Coolify is loaded with tools to make self-hosting smooth and powerful. Here’s a detailed look at what it offers: + +| Features | Explanation | +| :------------------------ | :-------------------------------------------------------------------------------------------------------- | +| **Any Language** | Deploy static sites, APIs, backends, databases, and more with support for all major frameworks. | +| **Any Server** | Deploy to any server - VPS, Raspberry Pi, EC2, your laptop via SSH. | +| **Any Use-Case** | Supports single servers, multi-server setups, and Docker Swarm clusters (Kubernetes support coming soon). | +| **Any Service** | Deploy any Docker-compatible service, plus a wide range of one-click options. | +| **Push to Deploy** | Git integration with GitHub, GitLab, Bitbucket, Gitea, and other platforms. | +| **Free SSL Certificates** | Automatically sets up and renews Let's Encrypt SSL certificates for custom domains. | +| **No Vendor Lock-In** | Your data and settings stay on your servers for full control and easy portability. | +| **Automatic Backups** | Back up data to S3-compatible storage and restore it with one click if needed. | +| **Webhooks** | Integrate with CI/CD tools like GitHub Actions, GitLab CI, or Bitbucket Pipelines. | +| **Powerful API** | Automate deployments, manage resources, and integrate with your existing tools easily. | +| **Real-Time Terminal** | Run server commands directly from your browser in real-time. | +| **Collaborative** | Share projects with your team, control roles, and manage permissions. | +| **PR Deployments** | Deploy commits and pull requests separately for quick reviews and faster teamwork. | +| **Server Automations** | Handles server setup tasks automatically after connection, saving you time. | +| **Monitoring** | Monitor deployments, servers, disk usage, and receive alerts for issues. | + +## Benefits of Using Coolify + +Coolify delivers unbeatable advantages for developers who want to self-host. Here’s why it stands out: + +| Benefits | Explanation | +| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Cost Savings** | Avoid skyrocketing cloud costs. Use your own server for a steady, predictable price. | +| **No Hidden Costs** | Transparent pricing with no unexpected charges. | +| **Highly Cost-Efficient** | Save thousands monthly compared to traditional cloud platforms. Real examples can be found [here](https://twitter.com/heyandras/status/1742078215986860460), [here](https://twitter.com/heyandras/status/1752209429276086688), and [here](https://twitter.com/heyandras/status/1724510876256944244) | +| **Complete Data Privacy** | Your data stays on your server, ensuring total control and security. | +| **No Feature Restrictions** | All features are included in the open-source version—nothing locked behind a paywall. | +| **Unlimited Usage** | Deploy unlimited websites and applications across any number of servers. | +| **Quick Setup** | Start hosting in minutes with minimal maintenance required. | +| **User-Friendly Interface** | Manage your infrastructure through a clean, simple dashboard designed for developers. | +| **100% Open Source** | Review the code, contribute to development, and help shape the platform’s future. | +| **Active Community** | Join over 16,000 people on Discord and 204,000+ servers running Coolify worldwide. | + +## Getting Started with Coolify + +Before you jump into using Coolify, it’s worth understanding a few key concepts to make your journey smoother. + +Learn about servers, SSH access, and how Coolify manages your projects by checking out our [concepts guide](/get-started/concepts). + +You have two ways to use Coolify: + +- [Self-Host Coolify](#self-host-coolify) +- [Use Coolify Cloud](#use-coolify-cloud) + +--- + +### Self-Host Coolify + +- Install Coolify on your own server. This requires setting up the server, installing Coolify, and handling updates yourself. +- You’ll also need to allocate some server resources to run Coolify. +- It’s completely free (except your server bills) and gives you full control over your infrastructure. + +### Use Coolify Cloud + +- Let the Coolify team manage Coolify for you. +- With Coolify Cloud, you don’t need to install or update Coolify yourself, and no server resources are required for Coolify itself, it runs on the Coolify team’s managed servers. +- Simply create an account from [here](https://app.coolify.io/register), connect your servers via SSH keys, and start deploying. + This is a paid service (starting at $5/mo), as it costs the team to host and maintain the infrastructure. +- Updates on Coolify Cloud are thoroughly tested by the core team, so they might be slightly delayed for added stability. + +## Join Our Community + +Got questions or need support? Our [discord community](https://coollabs.io/discord) is here to help. +Connect with other Coolify users on our community server to get assistance and share your experiences. diff --git a/content/docs/get-started/meta.json b/content/docs/get-started/meta.json new file mode 100644 index 00000000..7b42108f --- /dev/null +++ b/content/docs/get-started/meta.json @@ -0,0 +1,19 @@ +{ + "title": "Get Started", + "pages": [ + "introduction", + "installation", + "upgrade", + "downgrade", + "uninstallation", + "cloud", + "usage", + "concepts", + "screenshots", + "videos", + "team", + "support", + "sponsors", + "contribute" + ] +} \ No newline at end of file diff --git a/content/docs/get-started/screenshots.mdx b/content/docs/get-started/screenshots.mdx new file mode 100644 index 00000000..756008f0 --- /dev/null +++ b/content/docs/get-started/screenshots.mdx @@ -0,0 +1,63 @@ +--- +title: Coolify UI Screenshots +description: View screenshots of Coolify's user interface showing dashboard, deployment options, server management, and application configuration features. +--- + + +# Coolify UI Screenshots +The Coolify team is currently developing a brand new UI design. Below are the images showing the current UI. + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + + \ No newline at end of file diff --git a/content/docs/get-started/sponsors.mdx b/content/docs/get-started/sponsors.mdx new file mode 100644 index 00000000..9d3d894a --- /dev/null +++ b/content/docs/get-started/sponsors.mdx @@ -0,0 +1,336 @@ +--- +layout: page +title: Coolify Sponsors +description: Meet the companies and organizations sponsoring Coolify development including Hetzner, Logto, Tolgee, and other technology partners. +--- + +# Coolify Sponsors + +We have amazing sponsors who support the development of Coolify. + +
+ +
+ Hetzner logo +
+

Hetzner

+

Server, cloud, hosting, and data center solutions

+
+
+
+ +
+ Logto logo +
+

Logto

+

The better identity infrastructure for developers

+
+
+
+ +
+ Tolgee logo +
+

Tolgee

+

The open source localization platform

+
+
+
+ +
+ Best Consultant logo +
+

Best Consultant

+

Your trusted technology consulting partner

+
+
+
+ +
+ QuantCDN logo +
+

QuantCDN

+

Enterprise-grade content delivery network

+
+
+
+ +
+ Arcjet logo +
+

Arcjet

+

Advanced web security and performance solutions

+
+
+
+ +
+ SupaGuide logo +
+

SupaGuide

+

Your comprehensive guide to Supabase

+
+
+
+ +
+ CodeRabbit logo +
+

CodeRabbit

+

Cut Code Review Time & Bugs in Half

+
+
+
+ +
+ Convex logo +
+

Convex

+

Open-source reactive database for web app developers

+
+
+
+ +
+ GoldenVM logo +
+

GoldenVM

+

Premium virtual machine hosting solutions

+
+
+
+ +
+ Tigris logo +
+

Tigris

+

Modern developer data platform

+
+
+
+ +
+ Cloudify logo +
+

Cloudify

+

Cloud hosting solutions

+
+
+
+ +
+ Trieve logo +
+

Trieve

+

AI-powered search and analytics

+
+
+
+ +
+ Blacksmith logo +
+

Blacksmith

+

Infrastructure automation platform

+
+
+
+ +
+ Comit International logo +
+

Comit International

+

New York Times award–winning contractor!

+
+
+
+ +
+ Brand.dev logo +
+

Brand.dev

+

The #1 Brand API for B2B software startups

+
+
+
+ +
+ Syntax.fm logo +
+

Syntax.fm

+

Podcast for web developers

+
+
+
+ +
+ Jobs Collider logo +
+

Jobs Collider

+

30,000+ remote jobs for developers

+
+
+
+ +
+ Hostinger logo +
+

Hostinger

+

Web hosting and VPS solutions

+
+
+
+ +
+ GlueOps logo +
+

GlueOps

+

DevOps automation and infrastructure management

+
+
+
+ +
+ Ubicloud logo +
+

Ubicloud

+

Open source cloud infrastructure platform

+
+
+
+ +
+ Pfglabs logo +
+

Pfglabs

+

Build Real Projects with Golang

+
+
+
+ +
+ JuxtDigital logo +
+

JuxtDigital

+

Digital transformation and web solutions

+
+
+
+ +
+ SaasyKit logo +
+

SaasyKit

+

Complete SaaS starter kit for developers

+
+
+
+ +
+ MassiveGrid logo +
+

MassiveGrid

+

Enterprise cloud hosting solutions

+
+
+
+ +
+ American Cloud logo +
+

American Cloud

+

US-based cloud infrastructure services

+
+
+
+ +
+ Algora logo +
+

Algora

+

Open source contribution platform

+
+
+
+ +
+ LiquidWeb logo +
+

LiquidWeb

+

Premium managed hosting solutions

+
+
+
+ +
+ Yaak logo +
+

Yaak

+

The API client for modern developers

+
+
+
+ +
+ Comp AI logo +
+

Comp AI

+

The open-source platform that automates compliance

+
+
+
+ +
+ Darweb logo +
+

Darweb

+

Design. Develop. Deliver. Specialized in 3D CPQ Solutions for eCommerce

+
+
+
+ +
+ WZ-IT logo +
+

WZ-IT

+

German agency for customized cloud solutions, migration, managed services and open source hosting

+
+
+
+ +
+ Supadata logo +
+

Supadata

+

Scrape YouTube, web, and files. Get AI-ready, clean data for your next project

+
+
+
+ +
+ Gozunga logo +
+

Gozunga

+

Seriously Simple Cloud Infrastructure

+
+
+
+ +
+ Macarne logo +
+

Macarne

+

Best IP Transit & Carrier Ethernet Solutions for Simplified Network Connectivity

+
+
+
+
+
+ Your Company? logo +
+

Your Company?

+

Will Your Company Be Next?

+
+
+
+
diff --git a/content/docs/get-started/support.mdx b/content/docs/get-started/support.mdx new file mode 100644 index 00000000..2728faff --- /dev/null +++ b/content/docs/get-started/support.mdx @@ -0,0 +1,25 @@ +--- +title: Support +description: Get Coolify support through Discord community with 19K+ members, direct email support for Cloud users, and core team developer assistance. +--- + + + +
+ +## Community Support + +Join our [Discord community](https://coollabs.io/discord) with over **19K members**, where you can create a post in the **support forum channel** for assistance. + +While the community does provide some help, the [Core team](/get-started/team) is actively involved in the forum to ensure questions are addressed. + +## Direct Support from Core Developers + +If you are a **Coolify Cloud user**, you can reach out via email at **hi@coollabs.io** for direct support from [Andras (Coolify’s founder)](https://x.com/heyandras). Since he personally handles emails, response times may be delayed. + +We highly recommend posting in the **Discord support forum** first, as core team members can escalate issues to the developers ([Andras](https://x.com/heyandras) & [Peak](https://x.com/peaklabs_dev)) if necessary. + +## Important Notes + +- We are a **small team** (fewer than **6 people**) supporting **325K+ users**, making it challenging to offer direct assistance to everyone. However, we do our best to help as much as possible. +- We are planning a **paid support option** for **self-hosted users**. If you need dedicated support for your **self-hosted instance**, email **hi@coollabs.io** to discuss options. diff --git a/content/docs/get-started/team.mdx b/content/docs/get-started/team.mdx new file mode 100644 index 00000000..0c51171b --- /dev/null +++ b/content/docs/get-started/team.mdx @@ -0,0 +1,16 @@ +--- +layout: page +title: coolLabs Team +description: Meet the international team developing Coolify including founder Andras Bacsai, core developers, community leads, and documentation maintainers. +--- + +# coolLabs Team + +Meet the international team developing Coolify including founder Andras Bacsai, core developers, community leads, and documentation maintainers. + +- **Andras Bacsai** - Founder, Lead Developer +- **Peaklabs Dev** - Core Developer +- **ShadowArcanist** - Community Lead, Docs Maintainer +- **Aditya Tripathi** - Developer, Community Moderator +- **Oren Aksakal** - Developer +- **You?** - Will You Be Next? diff --git a/content/docs/get-started/uninstallation.mdx b/content/docs/get-started/uninstallation.mdx new file mode 100644 index 00000000..4bfa6da2 --- /dev/null +++ b/content/docs/get-started/uninstallation.mdx @@ -0,0 +1,111 @@ +--- +title: Uninstalling Coolify +description: Completely remove Coolify from your self-hosted server by stopping containers, deleting volumes, networks, data directories, and Docker images. +--- + + + +
+ +If you're using [Coolify Cloud](https://coolify.io/pricing/), you don't need to uninstall Coolify since the Coolify Team manages everything on their servers. + +To stop using Coolify Cloud, simply visit the [Billing page](https://app.coolify.io/subscription/) and cancel your subscription. + +For those who **self-host** Coolify and wish to remove it from your server, follow the steps below to uninstall it safely: + +- [Stop and Remove Containers](#_1-stop-and-remove-containers) +- [Remove Docker Volumes](#_2-remove-docker-volumes) +- [Remove Docker Network](#_3-remove-docker-network) +- [Delete Coolify Data Directory](#_4-delete-coolify-data-directory) +- [Remove Docker Images](#_5-remove-docker-images) + +## 1. Stop and Remove Containers + +Stop all Coolify-related Docker containers and remove them to free up system resources. + +Run the following commands in your terminal: + +```bash +sudo docker stop -t 0 coolify coolify-realtime coolify-db coolify-redis coolify-proxy coolify-sentinel +sudo docker rm coolify coolify-realtime coolify-db coolify-redis coolify-proxy coolify-sentinel +``` + +The `-t 0` flag ensures that the containers stop immediately without waiting for a timeout. + +## 2. Remove Docker Volumes + +To remove the persistent data stored in Docker volumes for Coolify, run: + +```bash +sudo docker volume rm coolify-db coolify-redis +``` + + + + +Removing volumes will delete all data stored in them permanently. Ensure you have backups if needed. + + + + +## 3. Remove Docker Network + +Coolify uses a custom Docker network named coolify. Remove it with the following command: + +```bash +sudo docker network rm coolify +``` + + + + +If you encounter an error indicating the network is in use, ensure that no containers are using the network before retrying. + + + + +## 4. Delete Coolify Data Directory + +Remove the directory where Coolify stores its data on your server: + +```bash + sudo rm -rf /data/coolify +``` + + + + +This will permanently delete all Coolify-related data. Double-check the directory path before executing this command. + + + + +## 5. Remove Docker Images + +To free up disk space, remove all Docker images used by Coolify by running the following commands: + +```bash +sudo docker rmi ghcr.io/coollabsio/coolify:latest +sudo docker rmi ghcr.io/coollabsio/coolify-helper:latest +sudo docker rmi quay.io/soketi/soketi:1.6-16-alpine +sudo docker rmi postgres:15-alpine +sudo docker rmi redis:alpine +``` + +If you were using the default proxy, also remove its image: + +```bash +sudo docker rmi traefik:v3.1 +``` + +If you switched to the Caddy proxy, remove its image instead: + +```bash +sudo docker rmi lucaslorentz/caddy-docker-proxy:2.8-alpine +``` + +--- + +### Coolify Successfully Uninstalled + +After completing these steps, Coolify and all its related resources will be completely removed from your server. diff --git a/content/docs/get-started/upgrade.mdx b/content/docs/get-started/upgrade.mdx new file mode 100644 index 00000000..0f64c4d7 --- /dev/null +++ b/content/docs/get-started/upgrade.mdx @@ -0,0 +1,107 @@ +--- +title: Upgrading Coolify +description: Upgrade self-hosted Coolify automatically, semi-automatically with UI notifications, or manually via terminal with version-specific installation. +--- + + + +
+ +If you're using [Coolify Cloud](https://coolify.io/pricing/), the Coolify team handles all updates so you don’t need to worry about them. + +For those who **self-host** Coolify, there are three ways to upgrade your instance: + +- [Automatic Upgrade:](#_1-automatic-upgrade) For users who want easy, hands-off updates. +- [Semi-Automatic Upgrade:](#_2-semi-automatic-upgrade) For users who want control over when to apply updates. +- [Manual Upgrade:](#_3-manual-upgrade) For advanced users who prefer to manage the upgrade process themselves. + + + + + +- Always back up your Coolify data before starting an upgrade. + + + + +## 1. Automatic Upgrade + +Coolify can update itself automatically. This option keeps your instance always up-to-date without any extra effort. + +### How it works? + +Coolify periodically checks the [CDN](https://cdn.coollabs.io/coolify/versions.json) for updates. When a new version is available, it automatically fetches the latest release from the [official repository](https://github.com/orgs/coollabsio/packages?repo_name=coolify) and starts the upgrade process on its own. + +### Customize Automatic Updates + +If you’d rather manage updates yourself, you can disable auto-updates in your Coolify dashboard’s Settings. + + + + + + +Turning off automatic updates lets you test a new version on a staging setup before updating your live environment. + + + + +## 2. Semi-Automatic Upgrade + +This option gives you a bit more control. Coolify notifies you when an update is available, and you decide when to apply it. + +### How it works? + +Coolify periodically checks the [CDN](https://cdn.coollabs.io/coolify/versions.json) for updates. When a new version is available, you will see an "**Upgrade**" button in the sidebar of your Coolify dashboard. + + + +Click the upgrade button to start the update process. + +### Set Update Frequency + +You can also choose how often Coolify checks for updates by adjusting the settings (daily, weekly, etc.). + + + + + + +This method is perfect if you want to review update details or test the upgrade before applying it. + + + + +## 3. Manual Upgrade + +For those who prefer full control, you can upgrade Coolify manually. + +### How to do this? + +Open your server's terminal and run the command below: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash +``` + +To upgrade to a specific version, run the following command in your terminal: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.0.0-beta.400 +``` + +Replace `4.0.0-beta.400` with the version number you want to upgrade to. + +### How it works? + +This command runs the official [Coolify installation script](https://github.com/coollabsio/coolify/blob/main/scripts/install.sh). The script checks the [CDN](https://cdn.coollabs.io/coolify/versions.json) for the latest version and updates your Coolify Instance. + + + + +In the Automatic and Semi-Automatic methods, Coolify runs the installation script automatically in the background. + +In the Manual upgrade method, you run the script yourself. + + + diff --git a/content/docs/get-started/usage.mdx b/content/docs/get-started/usage.mdx new file mode 100644 index 00000000..31df7959 --- /dev/null +++ b/content/docs/get-started/usage.mdx @@ -0,0 +1,58 @@ +--- +title: Usage +description: Compare Coolify Cloud managed service starting at $5/month versus free self-hosted deployment with maintenance, support, and backup differences. +--- + + + +
+ +So, you’ve decided to use Coolify, awesome choice! + +Now, you might be wondering whether to go with **Coolify Cloud** or set it up yourself through **self-hosting**. Let’s break it down so you can pick the best option for you. + +## Coolify Cloud + +Coolify Cloud is the easy way to get started. It’s a paid service (starting at just **$5 a month**) where you bring your own servers and connect them to a Coolify instance that’s fully managed by our team. + + + + +**We host and update the Coolify instance for you, so you don't have to allocate any of your server resources to Coolify, but you’re still responsible for your own servers and any other services running on them** + + + + +## Coolify Self-Hosted + +If you’re more of a hands-on person, self-hosting Coolify might be your thing. + +It’s completely free (except for your server costs, of course), and you get to control everything. + +You’ll install Coolify on your own server, keep it updated, and manage all the related services yourself. + +## How Do They Compare? + +_All of the features below refer only to the Coolify instance, not your entire server or other services._ + +| Feature | Coolify Cloud | Self-Hosted Coolify | +| ----------------------- | ------------------------------------------------------------------- | --------------------------------------------------------- | +| **Maintenance** | We take care of hosting and updating the Coolify instance for you | You’re in charge of keeping the instance running smoothly | +| **Support** | Help from Coolify experts and our core team | Chat with the community on Discord | +| **Email Notifications** | Pre-configured and ready to use for free | You’ll need to set this up yourself | +| **Backups** | We handle automatic backups for your Coolify instance | Set up your own backup system for the Coolify instance | +| **High Availability** | We’ve got you covered with reliable uptime for the Coolify instance | Depends on how you set things up | +| **Stability** | We test updates thoroughly before rolling them out | Test updates yourself before upgrading | +| **Cost** | Starts at **$5/month** | Free forever (just pay for your server) | + +And just so you know, we don’t play the “**feature lock**” game. Whether you choose Coolify Cloud or self-host, you get all the same powerful features. + +We’re all about giving you the full Coolify experience, no matter which path you take. + +## Which One is Right for You? + +If you want a quick, easy setup and don’t mind paying a small fee for convenience, **Coolify Cloud** is perfect. + +But if you love getting hands-on, want to save every penny, and enjoy being in full control, **Self-Hosting** is the way to go. + +If you're still not sure which path to take, join our [Discord community](https://coolify.io/discord) and ask any questions you might have! We're here to help you decide what's best for your needs. diff --git a/content/docs/get-started/videos.mdx b/content/docs/get-started/videos.mdx new file mode 100644 index 00000000..165d8234 --- /dev/null +++ b/content/docs/get-started/videos.mdx @@ -0,0 +1,98 @@ +--- +title: Coolify Tutorial videos +description: Watch community video tutorials on Coolify self-hosted PaaS including installation, deployment, and complete walkthroughs for beginners. +--- + + +# Video Tutorials created by the community +Only few of the videos are listed here + +### Syntax: 1.5 hours long complete walkthrough + + +### WebdevCody: 6 minutes quick overview + + +### Developedbyed: 20 minutes overview + + +### Fireship video + + +### MelkeyDev video + + +### Brendan O'Connell + + +### Awesome Open Source + + + +### Airoflare Coolify beginner playlist + + diff --git a/content/docs/index.mdx b/content/docs/index.mdx new file mode 100644 index 00000000..94ea5661 --- /dev/null +++ b/content/docs/index.mdx @@ -0,0 +1,7 @@ +--- +title: Coolify +description: Coolify is an open-source Platform as a Service (PaaS) for self-hosting databases, services, and applications with free SSL, backups, and Git integration. +full: true +--- + + diff --git a/content/docs/integrations/cloudflare/ddos-protection.mdx b/content/docs/integrations/cloudflare/ddos-protection.mdx new file mode 100644 index 00000000..c0961e24 --- /dev/null +++ b/content/docs/integrations/cloudflare/ddos-protection.mdx @@ -0,0 +1,356 @@ +--- +title: Cloudflare DDoS Protection +description: Learn how to set up Cloudflare DDoS protection for applications deployed with Coolify. +--- + +# Cloudflare DDoS Protection + +Cloudflare provides a robust layer of DDoS protection for your server and applications. + +When using Cloudflare’s Proxy, CDN, and security features, all incoming traffic to your Coolify-hosted apps is shielded from malicious attacks, like DDoS, and secured through Cloudflare’s global network. + +--- + +### Why Use Cloudflare for DDoS Protection with Coolify? + +1. Blocks malicious traffic before it reaches your server, reducing risk and server load. +2. No need to scale server resources during DDoS attacks — Cloudflare absorbs the impact. +3. Minimal configuration required to enable robust protection against potentially costly attacks. +4. Hides your server’s real IP address by resolving your domain to Cloudflare’s IPs. + +--- + +### When Not to Use Cloudflare for DDoS Protection + +1. You prefer not to route all traffic through Cloudflare’s network. +2. Privacy concerns, Cloudflare terminates TLS, which means they can inspect incoming requests. +3. Cloudflare downtime, although extremely rare, could affect your service if you rely entirely on their protection. +4. You want full control over SSL/TLS certificates issued by a global Certificate Authority. +5. You need free wildcard support for deep subdomains (more than 1 level subdomains -- e.g., `*.sub.domain.com` which Cloudflare does not offer for free). + +--- + + + + + The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + + - **IPv4 Address of Origin Server:** 203.0.113.1 + - **Domain Name:** shadowarcanist.com + - **Username:** shadowarcanist + + + + + +## 1. Create the Origin Certificate +Communication between your server and Cloudflare is encrypted using a custom Cloudflare Origin Certificate (required when using Cloudflare’s proxy). + + + + +To create your Cloudflare Origin Certificate, follow these steps: + + + +1. In your Cloudflare dashboard, go to **SSL/TLS**. +2. Select **Origin Server**. +3. Click the **Create Certificate** button. + +You’ll be asked to choose a private key type, hostnames, and certificate validity. + + + +1. Choose **RSA (2048)** for the key type. +2. Add the hostnames you want the certificate to cover. + + + + + - **`shadowarcanist.com`** will cover only the main domain. + - **`*.shadowarcanist.com`** will cover all subdomains. + + On Cloudflare’s free plan, wildcard certificates cover just one level of subdomains + + For example, it works for **`coolify.shadowarcanist.com`** but not **`www.coolify.shadowarcanist.com`**. + + To cover multiple levels, you'll need to purchase the [Advanced Certificate Manager ↗](https://www.cloudflare.com/application-services/products/advanced-certificate-manager/) + + + + +3. Set the certificate validity to **15 years**. + +Your certificate will now be generated. + + + +1. Choose **PEM** as the key format. +2. Copy your **Certificate**. +3. Copy your **Private Key**. + +Next, you'll add these to your server running Coolify and configure Coolify to use this certificate. + + +## 2. Add Certificate to Your Server +SSH into your server or use Coolify's terminal feature. For this guide, I’m using SSH: +```bash +ssh shadowarcanist@203.0.113.1 +``` + +Once logged in, navigate to the Coolify proxy directory: +```bash +$ cd /data/coolify/proxy +``` + +Adding certificates slightly varies for Caddy and Traefik proxy so choose the correct one from the below section + + + + + +== Traefik +Create the `certs` directory: +```bash +$ mkdir certs +``` + +Verify it was created: +```bash +$ ls +> acme.json certs docker-compose.yml dynamic +``` + +Now, navigate into the **certs** directory: +```bash +$ cd certs +``` + +Create two new files for the certificate and private key: +```bash +$ touch shadowarcanist.cert shadowarcanist.key +``` + +Verify the files were created: +```bash +$ ls +> shadowarcanist.cert shadowarcanist.key +``` + +Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard: +```bash +$ nano shadowarcanist.cert +``` +Save and exit after pasting the certificate. + +Do the same for the **shadowarcanist.key** file and paste the private key: +```bash +$ nano shadowarcanist.key +``` +Save and exit. + +== Caddy +Create the `caddy/data/certs` directory: +```bash +$ mkdir -p caddy/data/certs +``` + +Verify it was created: +```bash +$ ls caddy/data +> certs +``` + +Now, navigate into the **certs** directory: +```bash +$ cd caddy/data/certs +``` + +Create two new files for the certificate and private key: +```bash +$ touch shadowarcanist.cert shadowarcanist.key +``` + +Verify the files were created: +```bash +$ ls +> shadowarcanist.cert shadowarcanist.key +``` + +Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard: +```bash +$ nano shadowarcanist.cert +``` +Save and exit after pasting the certificate. + +Do the same for the **shadowarcanist.key** file and paste the private key: +```bash +$ nano shadowarcanist.key +``` +Save and exit. + + + + + +Now the origin certificate is installed on your server. + + +## 3. Set Up DNS Records and TLS Encryption +To make the origin certificate work, configure your DNS records, enable TLS, and set up HTTP to HTTPS redirects in Cloudflare: + + + +1. In Cloudflare, go to **DNS**. +2. Select **Records**. +3. Add 2 A records: +4. Enter name as **`shadowarcanist.com`** and `*` +5. Use the **IP address** of your server as the content for both records. +6. Set the proxy status to **Proxied** for both records. + + + + +Enabling the "Proxied" (orange cloud) option for both A records — `shadowarcanist.com` and `*` — will proxy the root domain and all one-level subdomains via a wildcard. + +This isn't necessary if you only need to proxy (or protect against DDoS) for a specific domain. In that case, simply enable proxying for the domain you want protection for. + + + + +Next, set up TLS encryption: + + + +1. Go to **SSL/TLS** in Cloudflare. +2. Select **Overview**. +3. Click **Configure** button + +Choose **Full (Strict)** as the encryption mode. + + + +Finally, enable HTTP to HTTPS redirects: + + + +1. In Cloudflare, go to **SSL/TLS** +2. Select **Edge Certificates**. +3. Enable **Always Use HTTPS**. + + +## 4. Configure Coolify proxy to Use the Origin Certificate + + +1. Go to the **Server** section in the sidebar. +2. Select **Proxy**. +3. Open the **Dynamic Configuration** page +4. Click **Add** button + +You will now be prompted to enter the Dynamic Configuration. + +Adding Dynamic Configuration slightly varies for Caddy and Traefik proxy so choose the correct one from the below section + + + + + +== Traefik + + + +1. Choose a name for your configuration (must end with `.yaml`). +2. Enter the following details in the configuration field: +```bash +tls: + certificates: + - + certFile: /traefik/certs/shadowarcanist.cert + keyFile: /traefik/certs/shadowarcanist.key +``` + +3. Save the configuration +--- +If you want to add multiple certificates and keys, you can do it like this: +```bash +tls: + certificates: + - + certFile: /traefik/certs/shadowarcanist.cert + keyFile: /traefik/certs/shadowarcanist.key + - + certFile: /traefik/certs/name2.cert + keyFile: /traefik/certs/name2.key + - + certFile: /traefik/certs/name3.cert + keyFile: /traefik/certs/name3.key +``` + +== Caddy + + +1. Choose a name for your configuration (must end with `.caddy`). +2. Enter the following details in the configuration field: +```bash +*.shadowarcanist.com, shadowarcanist.com { + tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key +} +``` + +> Note: The wildcard `*.shadowarcanist.com` provides coverage for all subdomains, exclude it if you’re only securing a single domain (i.e, `shadowarcanist.com`). + +3. Save the configuration + +--- + +If you want to add multiple certificates and keys, you can do it like this: +```bash +*.shadowarcanist.com, shadowarcanist.com { + tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key +} + +*.name2.com, name2.com { + tls /data/certs/name2.cert /data/certs/name2.key +} + +*.name3.com, name3.com { + tls /data/certs/name3.cert /data/certs/name3.key +} +``` + + + + + +From now on, Coolify will use the origin certificate for requests matching the hostname. + +Now you’re done! Your server is set up to use the Cloudflare Origin Certificate, and all traffic is proxied through Cloudflare network so all incoming attacks like DDoS are prevented by Cloudflare before it reaches your server. + + + + +**All the steps below are optional. Cloudflare should already be protecting your applications. Follow the below steps if you want to prevent attackers from directly attacking your server by it's IP Address on Port 80 and 443** + + + + + +## 5. Configure Firewall to Allow Only Cloudflare Traffic +Configure your firewall to allow incoming traffic on port **443** only from [Cloudflare’s IP ranges ↗](https://www.cloudflare.com/en-gb/ips/). + +Block all other inbound traffic, except for your SSH port. + +This prevents attackers from bypassing Cloudflare and directly targeting your server with traffic on ports 80 or 443. + +This step is completely optional but recommended. + + +## Credits +The origin-cert-illustration image is designed using icons from [Flaticon ↗](https://www.flaticon.com/). +Links to each icon can be found below: +- [Medal icon ↗](https://www.flaticon.com/free-icon/medal_14468558) by [Vlad Szirka ↗](https://www.flaticon.com/authors/vlad-szirka) +- [Award icon ↗](https://www.flaticon.com/free-icon/award_15218157) by [explanaicon ↗](https://www.flaticon.com/authors/explanaicon) +- [Worldwide icon ↗](https://www.flaticon.com/free-icon/worldwide_870169) by [Freepik ↗](https://www.flaticon.com/authors/freepik) +- [Lock icon ↗](https://www.flaticon.com/free-icon/lock_2089784) by [Those Icons ↗](https://www.flaticon.com/authors/those-icons) +- [Browser icon ↗](https://www.flaticon.com/free-icon/browser_331190) by [Alfredo Hernandez ↗](https://www.flaticon.com/authors/alfredo-hernandez) +- [Database icon ↗](https://www.flaticon.com/free-icon/database_8028666) by [Tanah Basah ↗](https://www.flaticon.com/authors/tanah-basah) \ No newline at end of file diff --git a/content/docs/integrations/cloudflare/meta.json b/content/docs/integrations/cloudflare/meta.json new file mode 100644 index 00000000..d72d4397 --- /dev/null +++ b/content/docs/integrations/cloudflare/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Cloudflare", + "pages": [ + "tunnels", + "ddos-protection" + ] +} \ No newline at end of file diff --git a/content/docs/integrations/cloudflare/tunnels/all-resource.mdx b/content/docs/integrations/cloudflare/tunnels/all-resource.mdx new file mode 100644 index 00000000..1d5a9790 --- /dev/null +++ b/content/docs/integrations/cloudflare/tunnels/all-resource.mdx @@ -0,0 +1,199 @@ +--- +title: "Access All Resource via Cloudflare Tunnels" +description: "Expose all Coolify resources securely through Cloudflare Tunnels without public IPs or port forwarding using wildcard domains and HTTP proxy routing." +--- + +# Access All Resource via Cloudflare Tunnels + +Accessing All Resource deployed on Coolify using a Cloudflare Tunnel allows you to securely reach your app without exposing your server’s IP address or without having a Public IP address for the server. + +## Who this is for? + +This setup is ideal for people who: + +- Don't have a public IP for their server (could be a laptop, raspberry pi etc..). +- Are unable to port forward (e.g., using home internet or on a private network). +- Want to keep their server’s IP address private and avoid exposing it to the public internet. +- Have an resource already deployed on Coolify and need an external method to access it securely. + +## Setup Requirements + +To follow this guide, you'll need: + +- A free [Cloudflare](https://cloudflare.com) account. +- You need a domain that has it's **DNS managed by Cloudflare**. + +## Before We Start + +- We assume you have Coolify running on your server. +- If your app requires HTTPS for functionality like cookies or login, then you need to follow the [Full TLS HTTPS guide](/integrations/cloudflare/tunnels/full-tls) after following this guide. This is because in this guide, Cloudflare will manage HTTPS externally, while your app will run over HTTP within Coolify. + +## How It Works? + +A simple high-level overview diagram to give you a visual idea of how this works: + + + +--- + +### Quick Links to Important Sections: + +- [Create a Cloudflare Tunnel](#_1-create-a-cloudflare-tunnel) +- [Setup Encryption mode on Cloudflare](#_2-setup-encryption-mode-on-cloudflare) +- [Setup Cloudflare Tunnel on Coolify](#_3-setup-cloudflare-tunnel-on-coolify) +- [Start Coolify Proxy](#_4-start-coolify-proxy) +- [Configure Your Resource to Use the Tunnel Domain](#_5-configure-your-resource-to-use-the-tunnel-domain) +- [How to use Multiple Different Domains](#how-to-use-multiple-different-domains) +- [Known issues and Solutions](#known-issues-and-solutions) + +--- + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **Domain Name:** shadowarcanist.com + + + + +--- + +## 1. Create a Cloudflare Tunnel + +To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page. + + + +1. On the Zero Trust page, go to **Networks** in the sidebar. +2. Click on **Tunnels** +3. Click on **Add a tunnel** button + +You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button. + + + +You will be prompted to enter a tunnel name. Choose a name that you prefer. + + + +Next you will see the configuration page with multiple options to install cloudflared. + + + +Copy the install command, which contains the token for your tunnel (token starts with "eyJ"). Make sure to save only the token, removing the command part before it, and store it in a safe place, as we need it later. + + + +Scroll down until you see the **Next** button, then click it. + +Then, you will be prompted to add a hostname. + + + +1. **Subdomain** - (Optional) You can make your all of your resource accessible on any subdomain/domain. For this guide, we are using a wildcard subdomain. +2. **Domain** - Choose the domain you want to use for the tunnel. +3. **Path** - Leave this field empty. +4. **Type** - Choose **HTTP** (this is very important). +5. **URL** - Enter **localhost:80** (this is very important). +6. After filling in the details, click the **Save Tunnel** button. + +## 2. Setup Encryption mode on Cloudflare + +To set up encryption on Cloudflare, follow these steps: + + + +1. Go to https://dash.cloudflare.com/ and select the domain you created the tunnel for. +2. Click **SSL/TLS** in the sidebar. +3. Select **Overview**. +4. Click **Configure** button + + + +Choose **Full** as the encryption mode. + +## 3. Setup Cloudflare Tunnel on Coolify + +To set up the tunnel on Coolify, follow these steps: + + + +Go to your project on Coolify dashboard and click the **+ New** button to create a new resource. + + + +You will see many options to deploy a new app. Search for Cloudflared and click on it. + + + +Go to the **Environment Variables** page, enter your tunnel token, and deploy the Cloudflared app. This token was copied in [Step 1](#_1-create-a-cloudflare-tunnel) + +## 4. Start Coolify Proxy + +To start the Coolify proxy, follow these steps: + + + +1. In the Coolify dashboard, go to the **Servers** page from the sidebar. +2. Select the server where coolify is running, then Click on the **Proxy** tab. +3. Open the **General** tab. +4. Click the **Start Proxy** button. + + + + + The Coolify proxy is used to route traffic to apps running on your server. This eliminates the need to create new hostnames on the Cloudflare tunnel every time you deploy a new app. + + + + +## 5. Configure Your Resource to Use the Tunnel Domain + +Enter the domain you want to use for your resource/app and deploy your resource. + + + + + + + You should enter the domain as **HTTP** because Cloudflare handles **HTTPS** and TLS terminations. If you use **HTTPS** for your resource, you may encounter a **TOO_MANY_REDIRECTS** error. + +If your app requires **HTTPS** for features like cookies or login, follow the [Full TLS HTTPS Guide](/integrations/cloudflare/tunnels/full-tls) after completing this guide. + + + + +**Congratulations**! You've successfully set up a resource that can be accessed by anyone on the internet your domain. + +## How to use Multiple Different Domains? + +You don't need to create new tunnels for each domain, just create a new hostname with the new domain and point it to the `localhost:80`. + + + +## Known issues and Solutions + +When you create a new public hostname in [Step 1](#_1-create-a-cloudflare-tunnel), Cloudflare will create a DNS record for the hostname. + +However, if a DNS record for the hostname already exists, Cloudflare won’t create a new one. + +In this case, your app won’t work. To fix this issue, follow the steps below: + + + +First, copy your tunnel ID from the Tunnels page on the Cloudflare dashboard. + + + +Create a new DNS record with the following details: + +1. In the Cloudflare dashboard, go to **DNS**. +2. Select **Records**. +3. Add a **CNAME** record. +4. Enter the name as `*` or the name of your subdomain (this should match the hostname you have for your app on the tunnel). +5. For the **Target**, enter the tunnel ID followed by `.cfargotunnel.com` +6. Set the proxy status to **Proxied**. + +Now, visit the domain of your application, and it should be accessible there. diff --git a/content/docs/integrations/cloudflare/tunnels/full-tls.mdx b/content/docs/integrations/cloudflare/tunnels/full-tls.mdx new file mode 100644 index 00000000..004a3739 --- /dev/null +++ b/content/docs/integrations/cloudflare/tunnels/full-tls.mdx @@ -0,0 +1,375 @@ +--- +title: "Full HTTPS/TLS Setup for All Resources" +description: "Configure end-to-end HTTPS for Coolify resources through Cloudflare Tunnels with Origin Certificates, strict TLS encryption, and proper domain setup." +--- + +# Full HTTPS/TLS Setup for All Resources + +When tunneling resources with Coolify through Cloudflare, Cloudflare typically handles HTTPS and TLS termination, while Coolify runs your resources over HTTP. + +This setup works for most users, but some may face issues with URL mismatches, especially for apps that require HTTPS on Coolify to issue JWT tokens or handle callback URLs. + +This guide solves that issue by configuring your resources to run fully on HTTPS, bypassing Cloudflare's HTTPS handling and ensuring your app functions correctly with secure connections. + +## Who this is for? + +This guide is ideal for users who: + +- Have followed our [Tunnel All Resources Using Cloudflare Tunnel](/integrations/cloudflare/tunnels/all-resource) or [Tunnel Specific Resources Using Cloudflare Tunnel](/integrations/cloudflare/tunnels/single-resource) guide. +- Need their resources deployed with Coolify to run on HTTPS for applications requiring HTTPS for JWT issuance, callback functions, or similar features. + +## Setup Requirements + +To follow this guide, you'll need: + +- A working Cloudflare tunnel setup as described in the previous guides. +- A domain configured in Cloudflare to handle HTTP traffic and redirect to HTTPS. + +## Before We Start + +- If your Coolify instance is on the same tunnel as the domain you want to configure, make sure you can access the Coolify Dashboard using the server IP and port (e.g., **203.0.113.1:8000**) before starting these steps. +- The default port is **8000**, but if you’ve changed or disabled it, ensure you can access the Coolify Dashboard through the new port or that port **8000** is re-enabled on the server. + +--- + +### Quick Links to Important Sections: + +- [Create a Cloudflare Origin Certificate](#_1-create-a-cloudflare-origin-certificate) +- [Add Origin Certificate to Your Server](#_2-add-origin-certificate-to-your-server) +- [Configure Coolify to Use the Origin Certificate](#_3-configure-coolify-to-use-the-origin-certificate) +- [Setup Encryption mode on Cloudflare](#_4-setup-encryption-mode-on-cloudflare) +- [Configure Tunnel to Use HTTPS](#_5-configure-tunnel-to-use-https) +- [Configure Cloudflare to Always Use HTTPS](#_6-configure-cloudflare-to-always-use-https) +- [Update URLs from HTTP to HTTPS](#_7-update-urls-from-http-to-https) + +--- + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **IPv4 Address of Origin Server:** 203.0.113.1 +- **Domain Name:** shadowarcanist.com +- **Username:** shadowarcanist + + + + +## 1. Create a Cloudflare Origin Certificate + +To create your Cloudflare Origin Certificate, follow these steps: + + + +1. In your Cloudflare dashboard, go to **SSL/TLS**. +2. Select **Origin Server**. +3. Click the **Create Certificate** button. + +You’ll be asked to choose a private key type, hostnames, and certificate validity. + + + +1. Choose **RSA (2048)** for the key type. +2. Add the hostnames you want the certificate to cover. + + + + + +- **`shadowarcanist.com`** will cover only the main domain. +- **`*.shadowarcanist.com`** will cover all subdomains. + +On Cloudflare’s free plan, wildcard certificates cover just one level of subdomains + +For example, it works for **`coolify.shadowarcanist.com`** but not **`www.coolify.shadowarcanist.com`**. + +To cover multiple levels, you'll need to purchase the [Advanced Certificate Manager](https://www.cloudflare.com/application-services/products/advanced-certificate-manager/) + + + + +3. Set the certificate validity to **15 years**. + +Your certificate will now be generated. + + + +1. Choose **PEM** as the key format. +2. Copy your **Certificate**. +3. Copy your **Private Key**. + +Next, you'll add these to your server running Coolify and configure Coolify to use this certificate. + +## 2. Add Origin Certificate to Your Server + +SSH into your server or use Coolify's terminal feature. For this guide, I’m using SSH: + +```bash +ssh shadowarcanist@203.0.113.1 +``` + +Once logged in, navigate to the Coolify proxy directory: + +```bash +$ cd /data/coolify/proxy +``` + +Adding certificates slightly varies for Caddy and Traefik proxy so choose the correct one from the below section + + + + + +== Traefik +Create the `certs` directory: + +```bash +$ mkdir certs +``` + +Verify it was created: + +```bash +$ ls +> acme.json certs docker-compose.yml dynamic +``` + +Now, navigate into the **certs** directory: + +```bash +$ cd certs +``` + +Create two new files for the certificate and private key: + +```bash +$ touch shadowarcanist.cert shadowarcanist.key +``` + +Verify the files were created: + +```bash +$ ls +> shadowarcanist.cert shadowarcanist.key +``` + +Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard: + +```bash +$ nano shadowarcanist.cert +``` + +Save and exit after pasting the certificate. + +Do the same for the **shadowarcanist.key** file and paste the private key: + +```bash +$ nano shadowarcanist.key +``` + +Save and exit. + +== Caddy +Create the `caddy/data/certs` directory: + +```bash +$ mkdir -p caddy/data/certs +``` + +Verify it was created: + +```bash +$ ls caddy/data +> certs +``` + +Now, navigate into the **certs** directory: + +```bash +$ cd caddy/data/certs +``` + +Create two new files for the certificate and private key: + +```bash +$ touch shadowarcanist.cert shadowarcanist.key +``` + +Verify the files were created: + +```bash +$ ls +> shadowarcanist.cert shadowarcanist.key +``` + +Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard: + +```bash +$ nano shadowarcanist.cert +``` + +Save and exit after pasting the certificate. + +Do the same for the **shadowarcanist.key** file and paste the private key: + +```bash +$ nano shadowarcanist.key +``` + +Save and exit. + + + + + +Now the origin certificate is installed on your server. + +## 3. Configure Coolify to Use the Origin Certificate + + + +1. Go to the **Server** section in the sidebar. +2. Select **Proxy**. +3. Open the **Dynamic Configuration** page +4. Click **Add** button + +You will now be prompted to enter the Dynamic Configuration. + +Adding Dynamic Configuration slightly varies for Caddy and Traefik proxy so choose the correct one from the below section + + + + + +== Traefik + + + +1. Choose a name for your configuration (must end with `.yaml`). +2. Enter the following details in the configuration field: + +```bash +tls: + certificates: + - + certFile: /traefik/certs/shadowarcanist.cert + keyFile: /traefik/certs/shadowarcanist.key +``` + +3. Save the configuration + +--- + +If you want to add multiple certificates and keys, you can do it like this: + +```bash +tls: + certificates: + - + certFile: /traefik/certs/shadowarcanist.cert + keyFile: /traefik/certs/shadowarcanist.key + - + certFile: /traefik/certs/name2.cert + keyFile: /traefik/certs/name2.key + - + certFile: /traefik/certs/name3.cert + keyFile: /traefik/certs/name3.key +``` + +== Caddy + + +1. Choose a name for your configuration (must end with `.caddy`). +2. Enter the following details in the configuration field: + +```bash +*.shadowarcanist.com, shadowarcanist.com { + tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key +} +``` + +> Note: The wildcard `*.shadowarcanist.com` provides coverage for all subdomains, exclude it if you’re only securing a single domain (i.e, `shadowarcanist.com`). + +3. Save the configuration + +--- + +If you want to add multiple certificates and keys, you can do it like this: + +```bash +*.shadowarcanist.com, shadowarcanist.com { + tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key +} + +*.name2.com, name2.com { + tls /data/certs/name2.cert /data/certs/name2.key +} + +*.name3.com, name3.com { + tls /data/certs/name3.cert /data/certs/name3.key +} +``` + + + + + +From now on, Coolify will use the origin certificate for requests matching the hostname. + +## 4. Setup Encryption mode on Cloudflare + +To set up encryption on Cloudflare, follow these steps: + + + +1. Go to **SSL/TLS** in Cloudflare. +2. Select **Overview**. +3. Click **Configure** button + + + +Choose **Full (Strict)** as the encryption mode. + +## 5. Configure Tunnel to Use HTTPS + +To configure the tunnel for HTTPS, follow these steps: + + + +1. Click the three dots icon to open the settings menu. +2. Select **Edit** to allow hostname modifications. + +Next, update the hostnames as follows: + + + +1. Change the type from **HTTP** to **HTTPS**. +2. Change the port from **80** to **443**. + + + +3. Click on **Additional Application Settings**. +4. Select **TLS**. +5. Enter your root domain in the **Origin Server Name** field. +6. Scroll down and click the **Save Hostname** button. + +## 6. Configure Cloudflare to Always Use HTTPS + + + +1. In the Cloudflare dashboard, go to **SSL/TLS**. +2. Select **Edge Certificates**. +3. Enable **Always Use HTTPS**. + +## 7. Update URLs from HTTP to HTTPS + +Now, update all URLs from **HTTP** to **HTTPS** in Coolify, including resources and the instance domain on the settings page. + + + +
+ + + +**Congratulations!** All your resources are now running on HTTPS at all times. diff --git a/content/docs/integrations/cloudflare/tunnels/index.mdx b/content/docs/integrations/cloudflare/tunnels/index.mdx new file mode 100644 index 00000000..552cbb59 --- /dev/null +++ b/content/docs/integrations/cloudflare/tunnels/index.mdx @@ -0,0 +1,46 @@ +--- +title: "Cloudflare Tunnels" +description: "Connect Coolify resources securely without port forwarding using Cloudflare Tunnels for all resources, single apps, SSH access, or full HTTPS setups." +--- + +# Cloudflare Tunnels + +[Cloudflare Tunnels](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) allow you to securely expose your local server or applications to the internet without opening ports on your router. + +This makes them a great option for hosting projects on devices like old laptops or Raspberry Pis. + +## Why Use Cloudflare Tunnels? + +- No need to open or forward ports on your device to the public internet. +- Simplifies routing and DNS configuration. +- Supports exposing a single application or multiple services. +- Hides your server's IP address by routing traffic through a Cloudflare Tunnel, showing only your domain. +- Works even if you have a dynamic IP (or) no public IP at all. +- Eliminates the hassle of managing and setting up SSL certificates. + +## When Not to Use Cloudflare Tunnels? + +- If you prefer direct access to your server without a proxy layer. +- If you're concerned about routing traffic through Cloudflare's servers. +- If you rely on additional firewall tools, as Cloudflare Tunnels bypass all firewall rules. +- If you need SSL certificates trusted by entities other than Cloudflare. + +## Ways to Use Cloudflare Tunnels with Coolify + +You can set up Cloudflare Tunnels with Coolify in several ways, depending on your needs. Below are the available options, each linked to a detailed guide for easy setup: + +1. [All Resources](/integrations/cloudflare/tunnels/all-resource) -> Use a tunnel for all resources deployed through Coolify. This is the **easiest** and **most recommended** way for beginners. + +2. [Single Resource](/integrations/cloudflare/tunnels/single-resource) -> Use a tunnel for a single resource deployed through Coolify. + +3. [Server SSH Access](/integrations/cloudflare/tunnels/server-ssh) -> Securely connect your server to Coolify using a domain through Cloudflare Tunnel. + +4. [Full HTTPS/TLS](/integrations/cloudflare/tunnels/full-tls) -> Setup always-on **HTTPS** for all domains and subdomains. Normally, Coolify uses **HTTP** while Cloudflare manages **HTTPS**. If certain apps require **HTTPS** directly on Coolify. + + + + +It’s highly recommended to go with the first option [All Resources](/integrations/cloudflare/tunnels/all-resource) if you're new to Coolify and Cloudflare Tunnels, as it’s much easier to set up and manage. + + + diff --git a/content/docs/integrations/cloudflare/tunnels/meta.json b/content/docs/integrations/cloudflare/tunnels/meta.json new file mode 100644 index 00000000..52164dd4 --- /dev/null +++ b/content/docs/integrations/cloudflare/tunnels/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Tunnels", + "pages": [ + "all-resource", + "single-resource", + "server-ssh", + "full-tls" + ] +} \ No newline at end of file diff --git a/content/docs/integrations/cloudflare/tunnels/server-ssh.mdx b/content/docs/integrations/cloudflare/tunnels/server-ssh.mdx new file mode 100644 index 00000000..0ef7ca07 --- /dev/null +++ b/content/docs/integrations/cloudflare/tunnels/server-ssh.mdx @@ -0,0 +1,374 @@ +--- +title: "Server SSH Access via Cloudflare Tunnels" +description: "Enable secure SSH access to Coolify servers via Cloudflare Tunnels with automated or manual cloudflared installation hiding server IP addresses." +--- + +# Server SSH Access via Cloudflare Tunnels + +Accessing your server using SSH over a Cloudflare Tunnel is a secure and easy way to connect to a remote server while keeping its IP address hidden. + +This guide explains how to set it up using Coolify's automated cloudflare tunnel installation. + +## Who this is for? + +This setup is ideal for people who: + +- Want to keep their server's IP address private. +- Want to close all SSH ports on their server. +- Don’t want to rely on static public IPs for accessing their remote server. +- Don't have a static public IP for the server (only applies if you're doing the [manual setup](#manual-setup)). + +## Before We Start + +- We assume you already have a server running Coolify and you are looking to set up a tunnel to connect a different server to Coolify. +- If you are trying to set up a tunnel on the server where Coolify is running and you don’t have any other servers to connect, you don’t need a SSH tunnel. Coolify already has full root access to the server it’s running on, so there’s no need for an SSH tunnel in this case. + +## How It Works? + +A simple high-level overview diagram to give you a visual idea of how this works: + + + +--- + +# Setup Methods + +There are two ways to set this up: automated and manual. + +The main difference is that in the manual setup, you install cloudflared yourself, while in the automated setup, Coolify does it for you. + +Choose one of the links below for the setup guide: + +- [Automated](#automated-setup) +- [Manual Setup](#manual-setup) + +## Automated Setup + +To use Coolify's automated setup for a Cloudflare Tunnel: + +- Your remote server must have a **public IP address** and an **active SSH port** during the initial setup for Coolify to configure the tunnel. After setup, you can close all ports on the server. +- If your server doesn’t have a public IP address, then this automated setup is **not for you**. Please follow the [Manual setup guide](#manual-setup) instead. +- You need a domain that has it's **DNS managed by Cloudflare**. + +### Quick Links to Important Sections: + +- [Create a Private SSH Key](#_1-create-a-private-ssh-key) +- [Add Public Key to Your Server](#_2-add-public-key-to-your-server) +- [Add your Server to Coolify](#_3-add-your-server-to-coolify) +- [Validate your Server on Coolify](#_4-validate-your-server-on-coolify) +- [Create a Cloudflare Tunnel](#_5-create-a-cloudflare-tunnel) +- [Setup Cloudflare Tunnel on Coolify](#_6-setup-cloudflare-tunnel-on-coolify) + +--- + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **IPv4 Address of Remote Server:** 203.0.113.1 +- **Domain Name:** shadowarcanist.com +- **Username:** root +- **SSH Port:** 22 + + + + +--- + +## 1. Create a Private SSH Key + +To create a Private SSH Key, follow these steps: + + + +1. In your Coolify Dashboard, go to **Keys & Tokens** +2. Click the **+ Add** button + +You will be prompted to choose a key type, along with providing a name and description for the key. + + + +1. Click on Generate new **ED25519** or **RSA** button to generate a new SSH key. +2. Copy the public key and save it somewhere safe (you'll need it in the next step). Then, click Continue. + +## 2. Add Public Key to Your Server + +SSH into the server you want to connect to Coolify: + +```bash + ssh root@203.0.113.1 +``` + +Once logged in, add your public key to the authorized keys file: + +```bash + $ echo "" >> ~/.ssh/authorized_keys +``` + +## 3. Add your Server to Coolify + +To add your server to Coolify, follow these steps: + + + +1. In your Coolify Dashboard, go to **Servers** +2. Click the **+ Add** button + +You will be prompted to enter details about your server. Make sure the information you provide is accurate, as Coolify will use these details to access your server. + + + +1. **Name** - Choose a name to easily identify your server in the dashboard. +2. **Description** - (Optional) Provide a description for your server. +3. **IP Address/Domain** - Enter the public IP address of your server. +4. **Port** - Enter the port number your server uses for SSH connections. +5. **User** - Enter the username Coolify will use (it should have root privileges on the server). +6. **Private key** - Select the private key you created in [Step 1](#_1-create-a-private-ssh-key) +7. After filling in the details, click the **Continue** button. + +## 4. Validate your Server on Coolify + +To validate your server, simply click the **Validate Server & Install Docker Engine** button. + + + +During this process, Coolify will log in to your server and set up everything needed for Coolify to use the server. + +Once the validation is completed, your server page will look like this: + + + +## 5. Create a Cloudflare Tunnel + +To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page. + + + +1. On the Zero Trust page, go to **Networks** in the sidebar. +2. Click on **Tunnels** +3. Click on **Add a tunnel** button + +You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button. + + + +You will be prompted to enter a tunnel name. Choose a name that you prefer. + + + +Next you will see the configuration page with multiple options to install cloudflared. + + + +Copy the install command, which contains the token for your tunnel (token starts with "eyJ"). Make sure to save only the token, removing the command part before it, and store it in a safe place, as we need it later. + + + +Scroll down until you see the **Next** button, then click it. + +Then, you will be prompted to add a hostname. This is where we expose our SSH tunnel. + + + +1. **Subdomain** - (Optional) You can make SSH accessible on any subdomain. For this guide, we are using the subdomain **ssh**. +2. **Domain** - Choose the domain you want to use for the tunnel. +3. **Path** - Leave this field empty. +4. **Type** - Choose **SSH** (this is very important). +5. **URL** - Enter **localhost:22** If your SSH port is different from 22, use that port instead. +6. After filling in the details, click the **Save Tunnel** button. + +## 6. Setup Cloudflare Tunnel on Coolify + +To set up the tunnel on Coolify, follow these steps: + + + +Go to the **Servers** page and select the server you want to connect. This is the server you added in [Step 3](#_3-add-your-server-to-coolify) + +1. Click on **Cloudflare Tunnels** +2. Click on **Automated** button + +You will be prompted to enter the Tunnel Token and SSH domain. + + + +1. Enter your **Tunnel Token** (this is the token we copied in [Step 5](#_5-create-a-cloudflare-tunnel)) +2. Enter your **SSH Domain** (this is the subdomain we set up in [Step 5](#_5-create-a-cloudflare-tunnel)) +3. Click on **Continue** button. + +Coolify will now install **cloudflared** on the server and set everything up automatically. This process will take about 30 seconds to 1 minute. + +Once completed, you will see that the Cloudflare tunnel is enabled on the Cloudflare Tunnels page, like this: + + + +At this point, your server's IP address will be automatically updated to the SSH domain by Coolify. + + + +You can now block your SSH port on the server if you wish. + +**Congratulations**! You've successfully set up a server that can be accessed by Coolify over SSH using Cloudflare tunnels via your domain. + + + + +**The steps above show how to do the automated setup. Below are the steps for the manual setup.** + + + + +## Manual Setup + +To manually setup Cloudflare Tunnel: + +- You need access to your remote server to install cloudflared (a public IP for your server is not required). +- You need a domain that has it's **DNS managed by Cloudflare**. + +### Quick Links to Important Sections: + +- [Create a Private SSH Key](#_1-create-a-private-ssh-key-1) +- [Add Public Key to Your Server](#_2-add-public-key-to-your-server-1) +- [Create a Cloudflare Tunnel](#_3-create-a-cloudflare-tunnel) +- [Add your Server to Coolify](#_4-add-your-server-to-coolify) +- [Validate your Server on Coolify](#_5-validate-your-server-on-coolify) +- [Setup Cloudflare Tunnel on Coolify](#_6-setup-cloudflare-tunnel-on-coolify-1) + +--- + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **IPv4 Address of Remote Server:** 203.0.113.1 +- **Domain Name:** shadowarcanist.com +- **Username:** root +- **SSH Port:** 22 + + + + +--- + +## 1. Create a Private SSH Key + +To create a Private SSH Key, follow these steps: + + + +1. In your Coolify Dashboard, go to **Keys & Tokens** +2. Click the **+ Add** button + +You will be prompted to choose a key type, along with providing a name and description for the key. + + + +1. Click on Generate new **ED25519** or **RSA** button to generate a new SSH key. +2. Copy the public key and save it somewhere safe (you'll need it in the next step). Then, click Continue. + +## 2. Add Public Key to Your Server + +SSH into the server you want to connect to Coolify: + +```bash + ssh root@203.0.113.1 +``` + +This server can be on your local network without a public IP address. All you need is SSH access to the terminal to run commands. + +Once logged in, add your public key to the authorized keys file: + +```bash + $ echo "" >> ~/.ssh/authorized_keys +``` + +## 3. Create a Cloudflare Tunnel + +To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page. + + + +1. On the Zero Trust page, go to **Networks** in the sidebar. +2. Click on **Tunnels** +3. Click on **Add a tunnel** button + +You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button. + + + +You will be prompted to enter a tunnel name. Choose a name that you prefer. + + + +Next you will see the configuration page with multiple options to install cloudflared. + + + +Select your preferred option and follow the installation instructions provided by Cloudflare on the page. + + + +Scroll down a bit and wait for your server (connector) to appear in the list. Once it appears, click the **Next** button. + +Then, you will be prompted to add a hostname. This is where we expose our SSH tunnel. + + + +1. **Subdomain** - (Optional) You can make SSH accessible on any subdomain. For this guide, we are using the subdomain **ssh**. +2. **Domain** - Choose the domain you want to use for the tunnel. +3. **Path** - Leave this field empty. +4. **Type** - Choose **SSH** (this is very important). +5. **URL** - Enter **localhost:22** If your SSH port is different from 22, use that port instead. +6. After filling in the details, click the **Save Tunnel** button. + +## 4. Add your Server to Coolify + +To add your server to Coolify, follow these steps: + + + +1. In your Coolify Dashboard, go to **Servers** +2. Click the **+ Add** button + +You will be prompted to enter details about your server. Make sure the information you provide is accurate, as Coolify will use these details to access your server. + + + +1. **Name** - Choose a name to easily identify your server in the dashboard. +2. **Description** - (Optional) Provide a description for your server. +3. **IP Address/Domain** - Enter the SSH domain of your server (which we set up in the previous step). +4. **Port** - Enter the port number your server uses for SSH connections. +5. **User** - Enter the username Coolify will use (it should have root privileges on the server). +6. **Private key** - Select the private key you created in [Step 1](#_1-create-a-private-ssh-key-1) +7. After filling in the details, click the **Continue** button. + +## 5. Validate your Server on Coolify + +To validate your server, simply click the **Validate Server & Install Docker Engine** button. + + + +During this process, Coolify will log in to your server and set up everything needed for Coolify to use the server. + +Once the validation is completed, your server page will look like this: + + + +## 6. Setup Cloudflare Tunnel on Coolify + +To set up the tunnel on Coolify, follow these steps: + + + +Go to the **Servers** page and select the server (which we added in the previous step) you want to connect. + +1. Click on **Cloudflare Tunnels** +2. Click on **Manual** button + +Once completed, you will see that the Cloudflare tunnel is enabled on the Cloudflare Tunnels page, like this: + + + +**Congratulations**! You've successfully set up a server that can be accessed by Coolify over SSH using Cloudflare tunnels via your domain. diff --git a/content/docs/integrations/cloudflare/tunnels/single-resource.mdx b/content/docs/integrations/cloudflare/tunnels/single-resource.mdx new file mode 100644 index 00000000..c25d5c54 --- /dev/null +++ b/content/docs/integrations/cloudflare/tunnels/single-resource.mdx @@ -0,0 +1,255 @@ +--- +title: "Access Single Resource via Cloudflare Tunnels" +description: "Securely access individual Coolify applications through Cloudflare Tunnels with port mapping, domain configuration, and multi-resource tunneling support." +--- + +# Access Single Resource via Cloudflare Tunnels + +Accessing an Resource deployed on Coolify using a Cloudflare Tunnel allows you to securely reach your app without exposing your server’s IP address or without having a Public IP address for the server. + +## Who this is for? + +This setup is ideal for people who: + +- Don't have a public IP for their server (could be a laptop, raspberry pi etc..). +- Are unable to port forward (e.g., using home internet or on a private network). +- Want to keep their server’s IP address private and avoid exposing it to the public internet. +- Have an app already deployed on Coolify and need an external method to access it securely. + +## Setup Requirements + +To follow this guide, you'll need: + +- A free [Cloudflare](https://cloudflare.com) account. +- You need a domain that has it's **DNS managed by Cloudflare**. +- Your Resource has to be deployed and managed with Coolify. + +## Before We Start + +- We assume you have Coolify running and an app already deployed. +- If your app requires HTTPS for functionality like cookies or login, then you need to follow the [Full TLS HTTPS guide](/integrations/cloudflare/tunnels/full-tls) after following this guide. This is because in this guide, Cloudflare will manage HTTPS externally, while your app will run over HTTP within Coolify. + +## How It Works? + +A simple high-level overview diagram to give you a visual idea of how this works: + + + +--- + +### Quick Links to Important Sections: + +- [Setup your app for tunneling](#_1-setup-your-app-for-tunneling) +- [Create a Cloudflare Tunnel](#_2-create-a-cloudflare-tunnel) +- [Setup Cloudflare Tunnel on Coolify](#_3-setup-cloudflare-tunnel-on-coolify) +- [Expose Multiple Resource on Different Domains](#expose-multiple-resource-on-different-domains) +- [Known issues and Solutions](#known-issues-and-solutions) + +--- + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + +- **Domain Name:** shadowarcanist.com +- **Ports Exposes:** 80 +- **Ports Mapping:** 4477:80 + + + + +--- + +## 1. Setup your app for tunneling + +To setup your app for tunneling, follow these steps: + + + +1. Remove all domains from the **Domains** field. +2. Set the correct port in **Ports Exposed** (the port your app uses). +3. Set the correct ports in **Port Mappings** (left is the host port, right is the app port). +4. Deploy your app by clicking the **Deploy** button. + +## 2. Create a Cloudflare Tunnel + +To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page. + + + +1. On the Zero Trust page, go to **Networks** in the sidebar. +2. Click on **Tunnels** +3. Click on **Add a tunnel** button + +You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button. + + + +You will be prompted to enter a tunnel name. Choose a name that you prefer. + + + +Next you will see the configuration page with multiple options to install cloudflared. + + + +Copy the install command, which contains the token for your tunnel (token starts with "eyJ"). Make sure to save only the token, removing the command part before it, and store it in a safe place, as we need it later. + + + +Scroll down until you see the **Next** button, then click it. + +Then, you will be prompted to add a hostname. + + + +1. **Subdomain** - (Optional) You can make your app/resource accessible on any subdomain/domain. For this guide, we are not using a subdomain. +2. **Domain** - Choose the domain you want to use for the tunnel. +3. **Path** - Leave this field empty. +4. **Type** - Choose **HTTP** (this is very important). +5. **URL** - Enter **localhost:4477** The port 4477 is the one we mapped to the host system in [Step 1](#_1-setup-your-app-for-tunneling). Replace 4477 with your own port. +6. After filling in the details, click the **Save Tunnel** button. + +## 3. Setup Cloudflare Tunnel on Coolify + +To set up the tunnel on Coolify, follow these steps: + + + +Go to your project on Coolify dashboard and click the **+ New** button to create a new resource. + + + +You will see many options to deploy a new app. Search for Cloudflared and click on it. + + + +Go to the **Environment Variables** page, enter your tunnel token, and deploy the Cloudflared app. This token was copied in [Step 2](#_2-create-a-cloudflare-tunnel) + +**Congratulations**! You've successfully set up a resource that can be accessed by anyone on the internet your domain. + + + + +**The steps above show how to tunnel a single resource. Below are the steps for tunneling multiple resources** + + + + +## Tunnel Multiple Resources + +The easiest way to tunnel multiple resources is by following our [Tunnel All Resources](/integrations/cloudflare/tunnels/all-resource) guide, which uses Coolify's built-in proxy. However, if you prefer not to use the proxy, there are two alternative methods: + +- [Tunnel Multiple Single Resources](#tunnel-multiple-single-resources) +- [Tunnel Coolify](#tunnel-coolify) + +Tunneling multiple single resources is straightforward, but tunneling Coolify itself requires additional manual setup. + +## Tunnel Multiple Single Resources + +If you want to expose different apps individually, you can follow our [Tunnel All Resources](/integrations/cloudflare/tunnels/all-resource), or take an alternate approach: + + + +1. Follow [Step 1](#_1-setup-your-app-for-tunneling) for your new resource. +2. Create a new public hostname on Cloudflare Tunnel as described in [Step 2](#_2-create-a-cloudflare-tunnel). + +There’s no need to create a separate tunnel for each resources, simply create a new hostname and point it to the port your app is listening on. + +## Tunnel Coolify + +Tunneling Coolify itself to make it accessible over a domain requires a bit more manual configuration. Here's how you can set it up: + +### 1. Create Public Hostnames in Cloudflare Tunnel + +Follow [Step 2](#_2-create-a-cloudflare-tunnel) from the main guide to create public hostnames for each service Coolify exposes. Use the following mapping: + + + +- **Hostnames**: + 1. `app.shadowarcanist.com/terminal/ws` → `localhost:6002` (WebSocket terminal) + 2. `realtime.shadowarcanist.com` → `localhost:6001` (Realtime server) + 3. `app.shadowarcanist.com` → `localhost:8000` (Coolify dashboard) + +- **Type**: HTTP (Ensure you select HTTP for each hostname.) + + + + +The order of the hostnames matters! Be sure to match it exactly as shown above. + + + + +--- + +### 2. Update Coolify’s `.env` File + +After creating public hostnames, update the `.env` file in your Coolify instance located at `/data/coolify/source` to enable connections to the realtime server. Add the following lines: + +```bash +APP_ID= +APP_KEY= +APP_NAME=Coolify +DB_PASSWORD= +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +REDIS_PASSWORD= + +########### +# Add these lines +PUSHER_HOST=realtime.shadowarcanist.com +PUSHER_PORT=443 +########### +``` + +This ensures that Coolify uses the Cloudflare Tunnel for its realtime server. + +### 3. Restart Coolify + +Run the following command to restart Coolify and apply the changes: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash +``` + +### 4. Verify the Setup + +1. Access your Coolify dashboard at `https://app.shadowarcanist.com`. +2. Test the realtime functionality by visiting `https://app.shadowarcanist.com/realtime` in another browser tab. You should see a notification about a test event. +3. If you know what are you doing, you can check the network tab as well. Search for a websocket connection. + + + + +If you use a firewall, ensure that the required ports (e.g., `8000`, `6001`, `6002`) are open for internal communication but not exposed to the public internet. + + + + +## Known issues and Solutions + +When you create a new public hostname in [Step 2](#_2-create-a-cloudflare-tunnel), Cloudflare will create a DNS record for the hostname. + +However, if a DNS record for the hostname already exists, Cloudflare won’t create a new one. + +In this case, your app won’t work. To fix this issue, follow the steps below: + + + +First, copy your tunnel ID from the Tunnels page on the Cloudflare dashboard. + + + +Create a new DNS record with the following details: + +1. In the Cloudflare dashboard, go to **DNS**. +2. Select **Records**. +3. Add a **CNAME** record. +4. Enter the name as `*` or the name of your subdomain (this should match the hostname you have for your app on the tunnel). +5. For the **Target**, enter the tunnel ID followed by `.cfargotunnel.com` +6. Set the proxy status to **Proxied**. + +Now, visit the domain of your application, and it should be accessible there. diff --git a/content/docs/integrations/meta.json b/content/docs/integrations/meta.json new file mode 100644 index 00000000..84603121 --- /dev/null +++ b/content/docs/integrations/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Integrations", + "pages": [ + "cloudflare", + "external:[Crowdsec](https://www.crowdsec.net/blog/securing-automated-app-deployment-crowdsec-and-coolify)" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/change-localhost-key.mdx b/content/docs/knowledge-base/change-localhost-key.mdx new file mode 100644 index 00000000..0aa1fa90 --- /dev/null +++ b/content/docs/knowledge-base/change-localhost-key.mdx @@ -0,0 +1,64 @@ +--- +title: "Change Localhost Key" +description: "Replace and regenerate Coolify's localhost SSH private key with safe database backup procedures and Docker container key installation." +--- + +# Change Localhost Key +This guide will show you how to replace the stored localhost private key for Coolify. + + + + + Take a backup of the stored private key in the database before starting this operation. + + + + +## Key deletion from database +In the Postgres database in which the data for Coolify is stored, there is a private_keys table. +This table contains the private keys for all servers connected to the Coolify instance. +Be careful to not accidentally delete the wrong keys, as there usually is no way to undo. + + +1. Navigate to the private_keys table in the Postgres database for Coolify + - Said table is located under the public schema in the database. + +2. Select the row that is marked with: + - Row index and ID of 0, as well as the name of "localhost's key" + +3. Delete the selected row from the database + - If completed successfully, proceed to the next section. + + + + + + It helps to do this with a graphical interface for managing the database. + + + + +## Installing new keys in the host machine + +After the key has been deleted from the database, you need to add the new keys into the correct place in the Coolify data folders. + +1. Stop your Coolify instance completely. + +2. Find the /ssh/keys directory for your Coolify installation. + - Usually located in /data/ssh/keys if you followed the quick install. + +3. Write the public and private keys to the correct files + - Your ED25519 public key shall be stored in id.root@host.docker.internal.pub + - Your ED25519 private key shall be stored in id.root@host.docker.internal + +4. Start your Coolify instance + - Coolify will now proceed to seed your keys to the Postgres database. + - Make sure the Database\Seeders\PopulateSshKeysDirectorySeeder does not error. + + + + + If you receive an output of "SSH key found for the Coolify host machine (localhost)", the operation completed successfully and unless you get any other output, your new key shall now be working. + + + diff --git a/content/docs/knowledge-base/commands.mdx b/content/docs/knowledge-base/commands.mdx new file mode 100644 index 00000000..9a512a03 --- /dev/null +++ b/content/docs/knowledge-base/commands.mdx @@ -0,0 +1,33 @@ +--- +title: Commands +description: "Essential Coolify CLI commands for root password reset, email changes, and deleting stuck services via Docker exec and Artisan commands." +--- + +# Commands +## Root password reset without SMTP +You can use the following method to reset the root user's password, in case you forgot and do not have an SMTP server set, so you cannot request a forgot password. + +Login to your server through SSH and execute the following command: + +```bash +docker exec -ti coolify sh -c "php artisan root:reset-password" +``` + +## Root email change +You can change root user's email. + +Login to your server through SSH and execute the following command: + +```bash +docker exec -ti coolify sh -c "php artisan root:change-email" +``` + +## Delete a stuck service + You can easily delete a stuck service. + + Login to your server through SSH and execute the following command: + +```bash +docker exec -ti coolify sh -c "php artisan services:delete" +``` + diff --git a/content/docs/knowledge-base/create-root-user-with-env.mdx b/content/docs/knowledge-base/create-root-user-with-env.mdx new file mode 100644 index 00000000..eba52b46 --- /dev/null +++ b/content/docs/knowledge-base/create-root-user-with-env.mdx @@ -0,0 +1,103 @@ +--- +title: "Create Root User with Environment Variables" +description: "Create Coolify root user during installation with environment variables including email validation, username requirements, and strong password policies." +--- + +# Create Root User with Environment Variables + +Creating the root user during installation is optional but recommended as it prevents the registration page from ever being exposed. + +## Validation Requirements + +The following requirements must be met for the root user credentials in a production environment. + +### Email +- Must be a valid email address +- Must have a valid DNS record +- Maximum length: 255 characters + +### Username +- Minimum length: 3 characters +- Maximum length: 255 characters +- Can only contain letters, numbers, spaces, underscores, and hyphens + +### Password +- Minimum length: 8 characters +- Must contain both uppercase and lowercase letters +- Must contain at least one number +- Must contain at least one special symbol +- Must not be a commonly used or compromised password + +## Automated Installation Method + + +1. **Prepare Your Credentials** + + Create your root user credentials according to the validation requirements above. + +2. **Run Installation Command** + + Execute the automated installation script with your prepared credentials: + + ```bash + env ROOT_USERNAME=RootUser ROOT_USER_EMAIL=example@example.com ROOT_USER_PASSWORD=Password bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + > View the [Scripts Source Code](https://github.com/coollabsio/coolify/blob/main/scripts/install.sh) + + + + + The installation script must be run as `root`. If you're not logged in as `root`, the script will use `sudo` to elevate privileges. + ```bash + sudo -E env ROOT_USERNAME=RootUser ROOT_USER_EMAIL=example@example.com ROOT_USER_PASSWORD=Password bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + + + + + + + + If any of the environment variables values contain a space, wrap the values in double quotes, for example `ROOT_USERNAME="Root User"`. + + + + +3. **Complete Setup** + After configuring the root user credentials, continue with the [installation steps](/get-started/installation#quick-installation-recommended) to complete your Coolify setup. + + + +## Manual Installation Method + + +1. **Prepare Your Credentials** + + Create your root user credentials according to the validation requirements above. + +2. **Configure Environment Variables** + + Edit the environment variables file: + + ```bash + nano /data/coolify/source/.env + ``` + + Add the following variables with your prepared credentials: + ```bash + ROOT_USERNAME=RootUser + ROOT_USER_EMAIL=example@example.com + ROOT_USER_PASSWORD=Password + ``` + + + + + If any of the environment variables values contain a space, wrap the values in double quotes, for example `ROOT_USERNAME="Root User"` + + + + +3. **Complete Setup** + After configuring the root user credentials, continue with the [installation steps](/get-started/installation#quick-installation-recommended) to complete your Coolify setup. + diff --git a/content/docs/knowledge-base/cron-syntax.mdx b/content/docs/knowledge-base/cron-syntax.mdx new file mode 100644 index 00000000..192bc6e3 --- /dev/null +++ b/content/docs/knowledge-base/cron-syntax.mdx @@ -0,0 +1,31 @@ +--- +title: "Supported Cron Syntax" +description: "Complete cron syntax reference for Coolify scheduled tasks including standard format and predefined schedules like hourly, daily, and weekly." +--- + +# Supported Cron Syntax +Coolify supports scheduling automated tasks like cleanups, backups, and more using cron syntax. + +## Supported Syntax + +### Standard Cron Format +Coolify supports the complete standard cron syntax format (`* * * * *`). + +### Predefined Schedules +For convenience, Coolify also supports the following predefined schedule strings: + +#### Without @ Prefix +- `every_minute` - Runs every minute +- `hourly` - Runs once per hour +- `daily` - Runs once per day +- `weekly` - Runs once per week +- `monthly` - Runs once per month +- `yearly` - Runs once per year + +#### With @ Prefix +- `@every_minute` - Runs every minute +- `@hourly` - Runs once per hour +- `@daily` - Runs once per day +- `@weekly` - Runs once per week +- `@monthly` - Runs once per month +- `@yearly` - Runs once per year \ No newline at end of file diff --git a/content/docs/knowledge-base/custom-compose-overrides.mdx b/content/docs/knowledge-base/custom-compose-overrides.mdx new file mode 100644 index 00000000..3f5b3358 --- /dev/null +++ b/content/docs/knowledge-base/custom-compose-overrides.mdx @@ -0,0 +1,165 @@ +--- +title: "Custom Compose Overrides" +description: "Customize Coolify's infrastructure containers using a docker-compose.custom.yml file that persists across upgrades" +--- + +# Custom Compose Overrides + +Coolify runs as a set of Docker Compose services. On every upgrade, the base `docker-compose.yml` and `docker-compose.prod.yml` files are **overwritten** with the latest versions. Any manual edits to those files will be lost. + +To make persistent customizations to Coolify's own containers, you can create a **custom override file** that is automatically merged during upgrades. + +## How It Works + +Place a file at: + +``` +/data/coolify/source/docker-compose.custom.yml +``` + +During startup and upgrades, Coolify's upgrade script checks for this file. If it exists, the containers are started with: + +```bash +docker compose \ + -f docker-compose.yml \ + -f docker-compose.prod.yml \ + -f docker-compose.custom.yml \ + up -d +``` + +Docker Compose [merges these files](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/?utm_source=coolify.io) in order — properties in later files override the same properties in earlier files. You only need to specify the keys you want to change. + + + + +The base files (`docker-compose.yml` and `docker-compose.prod.yml`) are re-downloaded on every upgrade. Your `docker-compose.custom.yml` is **never touched** by the upgrade process, so your customizations persist automatically. + + + + +## Service Names + +The Compose services are defined with these names — you must use these exact names in your override file: + +| Service name | Container name | Description | +|--------------|--------------------|--------------------------| +| `coolify` | `coolify` | Main Coolify application | +| `postgres` | `coolify-db` | PostgreSQL database | +| `redis` | `coolify-redis` | Redis cache | +| `soketi` | `coolify-realtime` | WebSocket server | + +## Examples + +### Add Container Labels + +Add labels for external tooling such as monitoring or log aggregation: + +```yaml +services: + coolify: + labels: + com.example.monitoring: "true" + com.example.environment: "production" +``` + +### Set Resource Limits + +Restrict CPU and memory usage for the main Coolify container: + +```yaml +services: + coolify: + cpus: 2.0 + mem_limit: 2G + mem_reservation: 512M +``` + +See the Docker Compose documentation for the full list of available attributes: [`cpus`](https://docs.docker.com/reference/compose-file/services/#cpus?utm_source=coolify.io), [`mem_limit`](https://docs.docker.com/reference/compose-file/services/#mem_limit?utm_source=coolify.io), [`mem_reservation`](https://docs.docker.com/reference/compose-file/services/#mem_reservation?utm_source=coolify.io), and [other resource constraints](https://docs.docker.com/reference/compose-file/services/#cpu_count?utm_source=coolify.io). + +### Change Port Binding + +The port number can be changed via the `APP_PORT` variable in [Coolify's `.env` file](/get-started/installation#manual-installation). However, the override file lets you control *how* the port is bound — something `.env` cannot do. + +Bind the Coolify UI to localhost only, so it is only accessible through a reverse proxy: + +```yaml +services: + coolify: + ports: + - "127.0.0.1:8000:8080" +``` + +Or close the port entirely and rely on the Docker network (useful when the Coolify Proxy is enabled and configured for the Coolify Dashboard): + +```yaml +services: + coolify: + ports: !override [] +``` + + + + +If you remove or restrict port access, make sure you have another way to reach the Coolify UI (e.g., a reverse proxy). Otherwise you will lock yourself out. + + + + +### Adjust Database Configuration + +Add custom PostgreSQL parameters: + +```yaml +services: + postgres: + command: postgres -c max_connections=200 -c shared_buffers=512MB +``` + +### Combine Multiple Customizations + +A single override file can modify multiple services: + +```yaml +services: + coolify: + mem_limit: 2G + labels: + com.example.monitoring: "true" + + postgres: + mem_limit: 1G + + redis: + mem_limit: 256M +``` + +## Important Considerations + + + + +A malformed or invalid `docker-compose.custom.yml` can **prevent Coolify from starting**. Always validate your YAML before saving the file. + +You can test your configuration without restarting by running: + +```bash +cd /data/coolify/source +docker compose \ + -f docker-compose.yml \ + -f docker-compose.prod.yml \ + -f docker-compose.custom.yml \ + config +``` + +If the output is valid merged YAML with no errors, your file is safe to use. + + + + +- **Service names must match exactly** — use `coolify`, `postgres`, `redis`, and `soketi`, not the container names. +- **Do not redefine the `image` property** unless you know what you are doing — using an incompatible image will break Coolify. +- **Scalar properties are replaced, list properties are merged** — for example, setting `ports` replaces all port mappings, but `volumes` entries are appended. +- To apply changes immediately without waiting for an upgrade, re-run the upgrade script: + ```bash + curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash + ``` diff --git a/content/docs/knowledge-base/custom-docker-registry.mdx b/content/docs/knowledge-base/custom-docker-registry.mdx new file mode 100644 index 00000000..32ac42e9 --- /dev/null +++ b/content/docs/knowledge-base/custom-docker-registry.mdx @@ -0,0 +1,68 @@ +--- +title: "Custom Docker Registry" +description: "Switch between Docker Hub and GitHub Container Registry (ghcr.io) for pulling Coolify images during installation or runtime" +--- + +# Custom Docker Registry + +If you would like to get Coolify's images from `dockerhub` instead of the default `ghcr.io`, you can do it by setting the `REGISTRY_URL` environment variable to `docker.io`. + +## Registry URL (`REGISTRY_URL`) +- Valid values: `docker.io` & `ghcr.io`. + +## Automated Installation Method + +1. **Run Installation Command** + + Execute the automated installation script with your prepared credentials: + + ```bash + env REGISTRY_URL=docker.io bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + > View the [Scripts Source Code](https://github.com/coollabsio/coolify/blob/main/scripts/install.sh) + + + + + The installation script must be run as `root`. If you're not logged in as `root`, the script will use `sudo` to elevate privileges. + ```bash + sudo -E env REGISTRY_URL=docker.io bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + + + + + +## Manual Installation Method + + +1. **Configure Environment Variables** + + Edit the environment variables file: + + ```bash + nano /data/coolify/source/.env + ``` + + Add the following variables with your prepared credentials: + ```bash + REGISTRY_URL=docker.io + ``` + +## Switch after installation + +If you want to switch the registry after installation, you can do it by running the following command: + +```bash +env REGISTRY_URL=docker.io bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' +``` + + + + + The installation script must be run as `root`. If you're not logged in as `root`, the script will use `sudo` to elevate privileges. + ```bash + sudo -E env REGISTRY_URL=docker.io bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + + diff --git a/content/docs/knowledge-base/define-custom-docker-network-with-env.mdx b/content/docs/knowledge-base/define-custom-docker-network-with-env.mdx new file mode 100644 index 00000000..5e9bdf44 --- /dev/null +++ b/content/docs/knowledge-base/define-custom-docker-network-with-env.mdx @@ -0,0 +1,76 @@ +--- +title: "Define Custom Docker Network with Environment Variables" +description: "Configure custom Docker network CIDR blocks and address pools using environment variables during Coolify installation for advanced network setups" +--- + +# Define Custom Docker Network with Environment Variables + +## Validation Requirements + +The following requirements must be met for the custom docker network in a production environment. + +### Network Name (`DOCKER_ADDRESS_POOL_BASE`) +- Must be a valid CIDR block, like `10.0.0.0/8`. + +### Address Pool Size (`DOCKER_ADDRESS_POOL_SIZE`) +- Must be a valid number, like `10`. + +### Force Override (`DOCKER_POOL_FORCE_OVERRIDE`) +- This only needed if you already have a docker address pool on the host and you want to override it. + +## Automated Installation Method + +1. **Prepare Your Credentials** + + Create your root user credentials according to the validation requirements above. + +2. **Run Installation Command** + + Execute the automated installation script with your prepared credentials: + + ```bash + env DOCKER_ADDRESS_POOL_BASE=10.0.0.0/8 DOCKER_ADDRESS_POOL_SIZE=10 bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + > View the [Scripts Source Code](https://github.com/coollabsio/coolify/blob/main/scripts/install.sh) + + + + + The installation script must be run as `root`. If you're not logged in as `root`, the script will use `sudo` to elevate privileges. + ```bash + sudo -E env DOCKER_ADDRESS_POOL_BASE=10.0.0.0/8 DOCKER_ADDRESS_POOL_SIZE=10 bash -c 'curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash' + ``` + + + + + +3. **Complete Setup** + After configuring the root user credentials, continue with the [installation steps](/get-started/installation#quick-installation-recommended) to complete your Coolify setup. + + +## Manual Installation Method + + +1. **Prepare Your Credentials** + + Create your root user credentials according to the validation requirements above. + +2. **Configure Environment Variables** + + Edit the environment variables file: + + ```bash + nano /data/coolify/source/.env + ``` + + Add the following variables with your prepared credentials: + ```bash + DOCKER_ADDRESS_POOL_BASE=10.0.0.0/8 + DOCKER_ADDRESS_POOL_SIZE=10 + DOCKER_POOL_FORCE_OVERRIDE=false + ``` + +3. **Complete Setup** + After configuring the root user credentials, continue with the [installation steps](/get-started/installation#manual-installation) to complete your Coolify setup. + diff --git a/content/docs/knowledge-base/delete-user.mdx b/content/docs/knowledge-base/delete-user.mdx new file mode 100644 index 00000000..05676142 --- /dev/null +++ b/content/docs/knowledge-base/delete-user.mdx @@ -0,0 +1,52 @@ +--- +title: Delete User +description: "Safely delete users from Coolify with automatic team ownership transfer, resource cleanup, and team member reassignment procedures." +--- + +# Delete User +This guide will show you how to delete a user from the self-hosted Coolify instance. + + + + + If you delete a user, and Coolify still has connection to the servers, it will + delete all the resources on the servers as well, not just from Coolify's + database. + + + + +Only users who are in the `root` team can delete users from the UI. + +- Go to the `Team` page. +- Switch to `Admin View` tab. + +Here you can see all the users registered in Coolify. Click on the `Delete` button next to the user you want to delete. + +## Deletion process + + + + +The root team or root user cannot be deleted. + + + + +Coolify iterate over all the teams of a user and decide of the followings: + +### The user is alone in the team + +The team and all resources from the server and from Coolify's database are deleted. + +### The user is not alone in the team + +1. The user is the owner/admin of the team and no other owners/admins found, but the team **has members**: + - The ownership is transferred to the first user in the team who is not the owner/admin. + - The user is removed from the team. No resources are deleted. + +2. The user is the owner/admin of the team and no other owners/admins found, but the team has **no members**: + - The team and all resources from the server and from Coolify's database are deleted. + +3. The user is not the owner/admin of the team: + - The user is removed from the team. No resources are deleted. diff --git a/content/docs/knowledge-base/destinations/create.mdx b/content/docs/knowledge-base/destinations/create.mdx new file mode 100644 index 00000000..7c93a65a --- /dev/null +++ b/content/docs/knowledge-base/destinations/create.mdx @@ -0,0 +1,120 @@ +--- +title: "Creating Destinations" +description: "Create Docker network destinations in Coolify for standalone or Swarm deployments with automatic proxy configuration and network scanning." +--- + +# Creating Destinations + +This guide shows you how to create new destinations in Coolify for deploying your applications and databases. + +## Prerequisites + +Before creating a destination, ensure you have: + +- At least one server connected to Coolify +- Appropriate permissions to manage destinations +- Basic understanding of [Docker networks](https://docs.docker.com/engine/network/) + +## Creating a New Destination + +### Method 1: From Destinations Page + + + +1. Navigate to **Destinations** in the main navigation +2. Click on **+ Add** +3. Fill in the destination details. + +### Method 2: From Server Management + + + +1. Go to **Servers** and select your server +2. Navigate to the **Destinations** tab +3. Click **+ Add** +4. Fill in the destination details. + +## Configuration Options + + + +### Destination Name + +- Auto-generated based on server name and network ID +- Can be customized to be more descriptive + +### Network Name + +- Must be unique per server +- Auto-generated unique identifier (CUID2 format) +- Can be customized to be more descriptive +- Cannot be changed after creation +- Used as the actual Docker network name + +### Server Selection + +- Choose from available servers in your team +- Server must be online and accessible +- Can not be a [build server](/knowledge-base/server/build-server) +- Determines where the Docker network will be created + +### Destination Type + +The destination type is **automatically determined** based on your selected server's configuration: + +#### Standalone Docker + +- **Automatically selected** when the server is configured as a standalone Docker host +- Creates a standard Docker network +- Suitable for single-server deployments +- Supports bridge and custom networks + +#### Docker Swarm + +- **Automatically selected** when the server is configured as a Docker Swarm manager or worker +- Creates overlay networks for multi-node communication +- Server must have Docker Swarm mode enabled during server setup +- Advanced feature for clustered deployments + + + + +You cannot manually choose between Standalone Docker and Docker Swarm when creating a destination. The type is determined by how your server was configured when it was added to Coolify. + + + + +## Automatic Network Creation + +When you create a destination, Coolify automatically: + +1. **Creates the Docker network** on the target server +2. **Connects the proxy** (Traefik/Caddy) to the network +3. **Configures network settings** for proper isolation +4. **Enables inter-container communication** within the network + +## Network Scanning + +You can also scan existing Docker networks on a server and add them as destinations: + + + +1. Go to **Server** and select your server +2. Navigate to **Destinations** +3. Click **Scan for Destinations** +4. Select existing networks to import and Coolify will create destination entries for them + +## Validation and Errors + +Common errors when creating destinations: + +- **Network already added to this server**: The network name conflicts with an existing one + +## After Creation + +Once created, your destination will: + +- Appear in the destinations list +- Be available for deploying applications and databases +- Have network connectivity configured automatically +- Be ready to host your containerized resources diff --git a/content/docs/knowledge-base/destinations/index.mdx b/content/docs/knowledge-base/destinations/index.mdx new file mode 100644 index 00000000..29710e32 --- /dev/null +++ b/content/docs/knowledge-base/destinations/index.mdx @@ -0,0 +1,61 @@ +--- +title: "Destinations" +description: "Manage Docker network destinations in Coolify for isolated deployment environments supporting standalone Docker and Swarm cluster configurations." +--- + +# Destinations + +Destinations in Coolify are **Docker network endpoints** where your applications, databases, and services are deployed. They represent isolated network environments on your servers that provide containerized isolation and networking for your resources. + +## What are Destinations? + +A destination is essentially a [Docker network](https://docs.docker.com/engine/network/) that acts as a deployment target for your resources. When you deploy an application or database, it gets deployed to a specific destination (Docker network) on a server, providing network isolation and organization for your containerized workloads. + +## Types of Destinations + +Coolify differentiates destinations between two types based on the server configuration: + +### 1. Standalone Docker + +- **Purpose**: For single-server deployments +- **Use Case**: Most common setup for individual servers +- **Network Type**: [Docker bridge](https://docs.docker.com/engine/network/drivers/bridge/) or custom networks + +### 2. Docker Swarm + +- **Purpose**: For [Docker Swarm](https://docs.docker.com/engine/swarm/) cluster deployments +- **Use Case**: Multi-node cluster environments +- **Network Type**: [Docker overlay networks](https://docs.docker.com/engine/network/drivers/overlay/) + +## Key Concepts + +### Network Isolation + +Each destination provides network isolation between different deployments. Applications deployed to different destinations cannot communicate with each other unless explicitly configured. + +### Server Relationship + +- Each destination belongs to exactly one server +- A server can have multiple destinations +- Destinations are tied to the server's Docker daemon + +### Resource Assignment + +Destinations can host multiple types of resources: + +- **Applications** (web apps, APIs, microservices) +- **Databases** (PostgreSQL, MySQL, Redis, MongoDB, etc.) +- **Services** (one-click deployments like WordPress, Ghost, etc.) + +## Benefits + +1. **Isolation**: Network-level separation between different projects or environments +2. **Organization**: Logical grouping of related applications and databases +3. **Security**: Prevents unauthorized network access between different deployments +4. **Flexibility**: Ability to deploy the same application to multiple destinations/servers +5. **Scalability**: Support for multi-server deployments through additional destinations + +## Related Topics + +- [Creating Destinations](./create.md) +- [Managing Destinations](./manage.md) diff --git a/content/docs/knowledge-base/destinations/manage.mdx b/content/docs/knowledge-base/destinations/manage.mdx new file mode 100644 index 00000000..de10f381 --- /dev/null +++ b/content/docs/knowledge-base/destinations/manage.mdx @@ -0,0 +1,94 @@ +--- +title: "Managing Destinations" +description: "Manage Coolify destinations including editing, deleting, resource assignment, and connecting service stacks to predefined Docker networks." +--- + +# Managing Destinations + +Learn how to manage your existing destinations in Coolify, and how to assign resources to them. + +## Viewing Destinations + +### Destinations Overview + +Navigate to **Destinations** to see all your destinations across all servers. + + +### Server-Specific Destinations + +Navigate to **Servers** → **[Server Name]** → **Destinations** to view destinations specific to that server. + + +## Editing & Deleting Destinations + +Click on a destination to access its management page where you can either edit or delete it. + + + +### Basic Information + +- **Name**: Update the destination display name +- **Server IP**: View the server IP address where the destination is hosted (read-only) +- **Docker Network**: View the Docker network name (read-only) + +### Before You Delete + +#### Check for Active Resources + +Coolify won't allow you to delete a destination that has active resources. Therefore, before deleting a destination, ensure it's not being used: + +1. **Applications**: No applications deployed to this destination +2. **Databases**: No databases running in this destination +3. **Services**: No services configured for this destination + +#### Resource Dependencies + +Verify that no other resources depend on this destination, to avoid issues after deletion: + +- **Environment Variables**: Check for hardcoded references +- **Network Dependencies**: Ensure no cross-destination communication +- **Proxies & Load Balancers**: Update load balancer and proxy configuration + +## Assign Resources to a Destination + +When you have more then one destination on a server, you will get prompted to select a destination when creating a new resource. + + + +If your resource is already created, you can make a **Clone** of it to another destination: + + + +1. Navigate to the resource's management page over the **Projects** tab. +2. Go to **Resource Operations** +3. Select the destination + + + + +Cloning a resource to another destination will create a new instance of that resource. This will not move the resource or it's data but create a duplicate. + + + + +### Service Stacks + +Unlike applications or databases, service stacks are not by default connected to the assigned destination. This also includes applications using the [Docker Compose Build Pack](/applications/build-packs/docker-compose). Coolify creates an isolated network for each service stack, allowing you to run multiple instances of the same service on the same server without conflicts. + +If you want to connect a service stack to a destination, enable [Connect to Predefined Networks](/knowledge-base/docker/compose#connect-to-predefined-networks) in it's settings. This allows the service stack to communicate with other resources on the same destination. + + + + +Avoid defining network configurations directly in your service stack's `docker-compose.y[a]ml` and instead use Coolify's Destination settings to manage network connections. This could otherwise lead to undesired behavior, such as [Gateway Timeout](/troubleshoot/applications/gateway-timeout) errors. + + + + +## Best Practices + +1. **Naming Convention**: Use descriptive names for destinations +2. **Resource Organization**: Group related applications in the same destination +3. **Monitoring**: Regularly check destination health and resource usage +4. **Documentation**: Document purpose and configuration of each destination +5. **Cleanup**: Remove unused destinations to reduce server load diff --git a/content/docs/knowledge-base/destinations/meta.json b/content/docs/knowledge-base/destinations/meta.json new file mode 100644 index 00000000..58ab31e0 --- /dev/null +++ b/content/docs/knowledge-base/destinations/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Destinations", + "pages": [ + "create", + "manage" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/dns-configuration.mdx b/content/docs/knowledge-base/dns-configuration.mdx new file mode 100644 index 00000000..af55064d --- /dev/null +++ b/content/docs/knowledge-base/dns-configuration.mdx @@ -0,0 +1,73 @@ +--- +title: "DNS Configuration" +description: "Configure A records, wildcard domains, and autogenerated subdomains for Coolify applications with DNS setup examples and preview deployments." +--- + + +# DNS Configuration +In general you need an `A` record for all the domains or subdomains you want to use, pointing to the IP address of your server where you would like to deploy your application. + +Note that you can use the same IP address for multiple domains and subdomains. + +**In the examples, `1.1.1.1` is your server's IP address.** + + + + +If your domain contains special or non-ASCII characters (for example `å`, `ä`, `ö`, `é`, etc.), you must use the **punycode version** of the domain when configuring DNS or entering the FQDN in Coolify. + +For example: +- `münchen.example.com` → `xn--mnchen-3ya.example.com` + +Most DNS providers automatically convert these domains, but if you experience issues you should manually use the punycode representation. + + + + +## Single Domain + +Let's say you want deploy your resource to `example.com` with the IP address `1.1.1.1`. + +- You need to set an `A` record for `example.com` pointing to `1.1.1.1`. + + + + + You can also add `www.example.com` as an `A` record and redirect it inside Coolify with the chosen reverse proxy. + + + + +Then you can use `https://example.com` as a FQDN (Fully Qualified Domain Name) for any of your resources, even for your Coolify instance. + +## Wildcard Domains + +Let's say you want deploy your resource to `*.example.com` with the IP address `1.1.1.1`. + +- You need to set an `A` record for `*.example.com` pointing to `1.1.1.1`. + +This allows you to use any subdomain of `example.com` as a FQDN (Fully Qualified Domain Name) for any of your resources, even for your Coolify instance. + +For example, you can use `https://app.example.com` or `https://api.example.com` as a FQDN. + +## Autogenerated Domains + +If you set a wildcard domain in your DNS settings, you can also use Coolify to autogenerate domains for your resources. +You just need to go to the `Server` settings and set the `Wildcard Domain` field to your domain, for example `https://example.com`. + +Then if you create a new resource: + +- You will get a random subdomain for your application, for example `https://random.example.com`. +- Also for your Preview Deployments, for example `https://.random.example.com`. + + + + + The Preview URL template could be modified in the application's page / `Preview Deployments` tab. + + + + +## Instance Domain + +If you self-host Coolify, you can set your Coolify instance a custom domain in the `/settings` page. diff --git a/content/docs/knowledge-base/docker/compose.mdx b/content/docs/knowledge-base/docker/compose.mdx new file mode 100644 index 00000000..134f9094 --- /dev/null +++ b/content/docs/knowledge-base/docker/compose.mdx @@ -0,0 +1,356 @@ +--- +title: "Docker Compose" +description: "Deploy multi-container Docker Compose stacks in Coolify with magic environment variables, persistent storage, healthchecks, and predefined network connections." +--- + +# Docker Compose + +If you are using `Docker Compose` based deployments, you need to understand how Docker Compose works with Coolify. + +In all cases the Docker Compose (`docker-compose.y[a]ml`) file is the single source of truth. +This means various settings you would normally configure in the Coolify UI (like environment variables, storage, etc.) need to be defined in the compose file itself. + +## Making services available to the outside world + +When Coolify deploys a Docker Compose, it creates a network for the services in the deployment. In addition, it adds the proxy service so that it can make services available from within the new network. + +That means that there are a few ways to make your services available: + +### Domains + +Once Coolify loads your compose file, it finds a list of services and allows you to assign a domain. If your services listen on port 80, assigning a domain is enough for the proxy to find and route traffic to them. If they're listening on other ports, add that port to the domain. + +For example, if your app is listening on (container) port 80, and you want to run it on `example.com`, enter `http://example.com` (or `https://`) for the domain. + +If your app is listening on (container) port 3000, however, you'll enter `http://example.com:3000` in the relevant service. The port here only tells Coolify where to send traffic within the container; the proxy will make this service available on the normal port (`http://example.com` port 80, in this case.) + +If you want to customize this domain-based routing further, see [Coolify's magic environment variables](#coolify-s-magic-environment-variables) below. + +### Service Port Mapping + +If you want to make your service accessible via it's port on the host, add the [ports attribute](https://docs.docker.com/reference/compose-file/services/#ports) in your compose file. For example, to map container port `3000` directly to the host machine: + +```yaml +services: + backend: + image: your-backend:latest + ports: + - "3000:3000" +``` + +Be aware that if you do this, **your service will be available on your server at port 3000, outside the control of any proxy configuration.** This may not be what you want! If you use the same Docker Compose file for development and deployment, this may expose the ports of private services that you did not intend. + +Optionally, you can pass an IP address to bind the port to a specific interface on the host machine: + +```yaml +services: + backend: + image: your-backend:latest + ports: + - "127.0.0.1:3000:3000" +``` + +This will make your service only available on `localhost:3000` of your server. + +### Private or Internal Services + +If you don't map a service port or assign a domain, Coolify will not expose your service outside the private network. At that point, you can refer to it as normal for Docker Compose. + +For example, if you have two services with these names: + +```yaml +services: + backend: + image: your-backend:latest + auth: + image: your-auth:latest +``` + +Then you can connect from `backend` to `auth` by referring to it as `http://auth:1234` (or whatever port.) Likewise, `auth` can connect to `backend` by referring to `http://backend:3000` (or whatever port.) + +For further details, please refer to the [Docker Networking in Compose](https://docs.docker.com/compose/how-tos/networking/) docs. + +## Defining Environment Variables + +Coolify automatically detects environment variables mentioned in your compose file and displays them in the UI. For example: + +```yaml +services: + myservice: + environment: + - SOME_HARDCODED_VALUE=hello # Gets passed to the container but will not be visible in Coolify's UI + - SOME_VARIABLE=${SOME_VARIABLE_IN_COOLIFY_UI} # Creates an uninitialized environment variable editable in Coolify's UI + - SOME_DEFAULT_VARIABLE=${OTHER_NAME_IN_COOLIFY:-hello} # Creates an environment variable of value "hello" editable in Coolify's UI +``` + + + +### Required Environment Variables + +Coolify supports marking environment variables as required using Docker Compose's built-in syntax. This feature improves the deployment experience by validating critical configuration before starting services. +You can mark environment variables as required using the `:?` syntax. Required variables must be set before deployment and will be highlighted in Coolify's UI with a red border if empty. + +```yaml +services: + myapp: + environment: + # Required variables - deployment will fail if not set + - DATABASE_URL=${DATABASE_URL:?} + - API_KEY=${API_KEY:?} + + # Required variables with default values - prefilled in UI but can be changed + - PORT=${PORT:?3000} + - LOG_LEVEL=${LOG_LEVEL:?info} + + # Optional variables - standard behavior + - DEBUG=${DEBUG:-false} + - CACHE_TTL=${CACHE_TTL:-3600} +``` + +**Key behaviors:** + +- **Required variables** (`${VAR:?}`) appear first in the environment variables list and show a red border when empty +- **Required with defaults** (`${VAR:?default}`) are prefilled with the default value but remain editable +- **Optional variables** (`${VAR:-default}`) use standard Docker Compose behavior + +If a required variable is not set during deployment: + +- Coolify will highlight the missing variable in the UI +- The deployment will be prevented until all required variables are provided +- Clear error messages guide users to fix the configuration + +This validation happens before container creation, preventing partial deployments and runtime failures. + +### Shared Environment Variables + +Coolify doesn't directly detect **shared** environment variables in the compose file, but are able to be referenced using with an additional step. + +1. Create your shared variable following the [shared variables documentation](/knowledge-base/environment-variables#shared-variables). + +2. Define your variables in your Docker Compose file, for example; + +```yaml +services: + myservice: + environment: + - HARD_CODED=dev # Passed to the container, but not visible in Coolify's UI. + - SOME_OPTIONAL_VARIABLE=${SOME_VARIABLE_IN_COOLIFY_UI} # Creates an editable, uninitialized variable in the UI. + volumes: + - data-persist:/var/data + volumes: + data-persist: + device: /mnt/serverstorage/${SOME_VARIABLE_IN_COOLIFY_UI} # Re-uses the variable +``` + +3. Define the variable explicitly in the applications Environment Variables referencing your shared variable created in step 1; + + + + + +If in developer view, you can enter it like so; + +``` +SOME_VARIABLE_IN_COOLIFY_UI={{environment.SOME_SHARED_VARIABLE}} +``` + +Or in the normal view, the Name is what's referenced in the Docker Compose file `SOME_VARIABLE_IN_COOLIFY_UI` with the Value being the referenced environment variable `{{environment.SOME_SHARED_VARIABLE}}` as seen below. Once saved if correct, you'll see there's a third text box, if you reveal this, you should be able to see the true value, in this case `SOME_VALUE`. + + + + + + + +### Coolify's Magic Environment Variables + +Coolify can generate dynamic environment variables for you using the following syntax: `SERVICE__`. For a quick reference of all types and their output, see the [Magic Environment Variables table](/knowledge-base/environment-variables#magic-environment-variables-docker-compose). The type may be one of: + +- **URL**: This will [generate](/knowledge-base/server/introduction#wildcard-domain) an URL for the service. The example below shows how you can add paths and ports. +- **FQDN**: Generates FQDN for the service based on the URL you have defined. The example below shows how you can add paths and ports. +- **USER**: Generates a random string using `Str::random(16)`. You might want to use it as a username in your service. +- **PASSWORD**: Generates a password using `Str::password(symbols: false)`. Use `PASSWORD_64` to generate a 64 bit long password with `Str::password(length: 64, symbols: false)`. +- **BASE64**: Generates a random string using `Str::random(32)`. For longer strings, use `BASE64_64` or `BASE64_128`. + + + + +Identifier with underscores (`_`) cannot use ports in environment variables. Use hyphens (`-`) instead to avoid this limitation. + +``` +SERVICE_URL_APPWRITE_SERVICE_3000 ❌ +SERVICE_URL_APPWRITE-SERVICE_3000 ✅ +``` + + + + + +Every generated variable can be reused and will always have the same value for every service. +All generated variables are displayed in Coolify's UI for environment variables and can be edited there (except FQDN and URl). + +As an example, imagine an application with UUID `vgsco4o` (generated by Coolify on creation). +It uses a compose file deploying Appwrite on the [wildcard](/knowledge-base/server/introduction#wildcard-domain) domain `http://example.com` . + +This will do the following: + +```yaml +services: + appwrite: + environment: + # http://appwrite-vgsco4o.example.com + - SERVICE_URL_APPWRITE + # http://appwrite-vgsco4o.example.com/v1/realtime + - SERVICE_URL_APPWRITE=/v1/realtime + # _APP_URL will have the FQDN because SERVICE_URL_APPWRITE is just a simple environment variable + - _APP_URL=$SERVICE_URL_APPWRITE + # http://appwrite-vgsco4o.example.com/ will be proxied to port 3000 + - SERVICE_URL_APPWRITE_3000 + # DOMAIN_URL will have the FQDN (appwrite-vgsco4o.example.com) because SERVICE_FQDN_APPWRITE generates the full FQDN. No need to add 3000 at the end of the variable + - DOMAIN_NAME=${SERVICE_FQDN_APPWRITE} + # http://api-vgsco4o.example.com/api will be proxied to port 2000 + - SERVICE_URL_API_2000=/api + # Coolify generates password and injects it as SERVICE_SPECIFIC_PASSWORD into the container + - SERVICE_SPECIFIC_PASSWORD=${SERVICE_PASSWORD_APPWRITE} + not-appwrite: + environment: + # Reuses the password from the Appwrite service. + - APPWRITE_PASSWORD=${SERVICE_PASSWORD_APPWRITE} + # As SERVICE_URL_API is not the same as SERVICE_URL_APPWRITE + # Coolify will generate a new URL + # http://not-appwrite-vgsco4o.example.com/api + - SERVICE_URL_API=/api +``` + + + + +Support for Magic Environment Variables in Compose files based on Git sources requires Coolify v4.0.0-beta.411 and above. + + + + +## Storage + +You can predefine storage normally in your compose file, but there are a few extra options that you can set to tell Coolify what to do with the storage. + +### Create an empty directory + +```yaml +# Predefine directories with host binding +services: + filebrowser: + image: filebrowser/filebrowser:latest + volumes: + - type: bind + source: ./srv + target: /srv + is_directory: true # This will tell Coolify to create the directory (this is not available in a normal docker-compose) +``` + +### Create a file with content + +Here you can see how to add a file with content and a dynamic value that is coming from an environment variable. + +```yaml +services: + filebrowser: + image: filebrowser/firebrowser:latest + environment: + - POSTGRES_PASSWORD=password + volumes: + - type: bind + source: ./srv/99-roles.sql + target: /docker-entrypoint-initdb.d/init-scripts/99-roles.sql + content: | # This will tell Coolify to create the file (this is not available in a normal docker-compose) + -- NOTE: change to your own passwords for production environments + \set pgpass `echo "$POSTGRES_PASSWORD"` + + ALTER USER authenticator WITH PASSWORD :'pgpass'; + ALTER USER pgbouncer WITH PASSWORD :'pgpass'; +``` + +Alternatively config files can be created using the [configs](https://docs.docker.com/reference/compose-file/configs/) top level element in Docker Compose. + +```yaml +services: + filebrowser: + image: filebrowser/filebrowser:latest + environment: + - POSTGRES_PASSWORD=password + configs: + - source: roles + target: /docker-entrypoint-initdb.d/init-scripts/99-roles.sql + +configs: + roles: + content: | + -- NOTE: change to your own passwords for production environments + \set pgpass `echo "$POSTGRES_PASSWORD"` + + ALTER USER authenticator WITH PASSWORD :'pgpass'; + ALTER USER pgbouncer WITH PASSWORD :'pgpass'; +``` + +## Exclude from healthchecks + +If you have a service that you do not want to be part of your overall healthchecks, you can exclude it from the healthchecks by setting the `exclude_from_hc` option to `true`. + + + + +This is useful for example if you have a migration service that runs only once and then the container stops. + + + + +```yaml +services: + some-service: + exclude_from_hc: true + ... +``` + +## Connect to Predefined Networks + +By default, each compose stack is deployed to a separate network, with the name of your resource uuid. This will allow to each service in your stack to communicate with each other. + +But in some cases, you would like to communicate with other resources in your account. For example, you would like to connect your application to a database, which is deployed in another stack. + +To do this you need to enable `Connect to Predefined Network` option on your `Service Stack` page, but this will make the internal Docker DNS not work as expected. + +Here is an example. You have a stack with a `postgres` database and a `laravel` application. Coolify will rename your `postgres` stack to `postgres-` and your `laravel` stack to `laravel-` to prevent name collisions. + +If you set `Connect to Predefined Network` option on your `laravel` stack, your `laravel` application will be able to connect to your `postgres` database, but you need to use the `postgres-` as your database host. + +## Raw Docker Compose Deployment + +You can set up your project to use docker compose build pack to deploy your compose file directly without most of Coolify's magic. It is called `Raw Compose Deployment`. + + + + +This is for advanced users. If you are not familiar with Docker Compose, we do not recommend this method. + + + + +### Labels + +Coolify will still add the following labels (if they are not set) to your application: + +```yaml +labels: + - coolify.managed=true + - coolify.applicationId=5 + - coolify.type=application +``` + +To use Coolify's Proxy (Traefik), you need to set the following labels to your application: + +```yaml +labels: + - traefik.enable=true + - "traefik.http.routers..rule=Host(`coolify.io`) && PathPrefix(`/`)" + - traefik.http.routers..entryPoints=http +``` diff --git a/content/docs/knowledge-base/docker/custom-commands.mdx b/content/docs/knowledge-base/docker/custom-commands.mdx new file mode 100644 index 00000000..72bd4142 --- /dev/null +++ b/content/docs/knowledge-base/docker/custom-commands.mdx @@ -0,0 +1,100 @@ +--- +title: "Custom Commands" +description: "Add custom Docker run options to Coolify deployments including custom entrypoints, GPU support, security options, system controls, devices, and resource limits." +--- + +# Custom Commands +For deploying your resources, you can add custom options to the final docker command, which is used to run your container. + + + + + Some of the docker native options are not supported, because it could break the Coolify's functionality. If you need any of the unsupported options, please [contact us](/get-started/support) + + + + +## Supported Options + +- `--ip` +- `--ip6` +- `--shm-size` +- `--cap-add` +- `--cap-drop` +- `--security-opt` +- `--sysctl` +- `--device` +- `--ulimit` +- `--init` +- `--ulimit` +- `--privileged` +- `--gpus` +- `--entrypoint` + +## Usage + +You can simply add the options to the `Custom Docker Options` field on the `General` tab of your resource. + +Example: `--cap-add SYS_ADMIN --privileged` + +## Custom Entrypoint + +The `--entrypoint` option allows you to override the default entrypoint of a Docker image without building a custom image. + +### Syntax + +Coolify supports three entrypoint syntax variations: + +1. **Simple entrypoint**: + ```bash + --entrypoint /bin/sh + ``` + +2. **Quoted command with arguments**: + ```bash + --entrypoint "sh -c 'npm start'" + ``` + +3. **Assignment syntax**: + ```bash + --entrypoint=/usr/local/bin/custom-script + ``` + +### Use Cases + +#### Multiple Service Types from Single Image + +Some Docker images, like ServerSideUp PHP, provide multiple entrypoints for different service types: +- Worker processes +- Queue schedulers +- Background jobs +- Web servers + +Example for running a Laravel Horizon worker: +```bash +--entrypoint php --entrypoint artisan --entrypoint horizon +``` + +#### Custom Initialization Scripts + +Override the default entrypoint to run custom initialization: +```bash +--entrypoint "/app/custom-init.sh" +``` + +### Usage in Coolify + +1. Navigate to your resource's **General** tab +2. Locate the **Custom Docker Options** field +3. Add your entrypoint option along with any other custom options: + ```bash + --entrypoint /bin/sh --cap-add SYS_ADMIN + ``` +4. Save and redeploy your application + + + + +The entrypoint option is converted to Docker Compose format during deployment, supporting both Dockerfile and Docker Compose build packs. + + diff --git a/content/docs/knowledge-base/docker/meta.json b/content/docs/knowledge-base/docker/meta.json new file mode 100644 index 00000000..c880e08b --- /dev/null +++ b/content/docs/knowledge-base/docker/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Docker", + "pages": [ + "compose", + "custom-commands", + "registry", + "swarm" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/docker/registry.mdx b/content/docs/knowledge-base/docker/registry.mdx new file mode 100644 index 00000000..80bb28e5 --- /dev/null +++ b/content/docs/knowledge-base/docker/registry.mdx @@ -0,0 +1,73 @@ +--- +title: "Docker Registry" +description: "Push built Docker images to any registry with Coolify including custom tags, authentication setup, Swarm mode support, and self-hosted registry configuration." +--- + + +# Docker Registry + +You can easily push your built docker images to any docker registries with Coolify. + +You just need to fill the `Docker Registry` fields in your service `General` configurations. + +## Configuration + +### Docker Image + +If this field is set, Coolify will automatically push your built docker image to the specified docker registry. + +> If the image is empty, Coolify won't push your built image. + +### Docker Image Tag + +If this field is set, Coolify will automatically push your built docker image with the specified tag to the specified docker registry + the git commit sha tag. + +> If the tag is empty, Coolify only push your built image with the git commit sha tag. + +## Docker Credentials + +Docker credentials (from v4.0.0-beta.88) are used to authenticate with Docker registries to pull/push images. + +If you want to authenticate Coolify with a Docker Registry: + + +1. Login to your server + Login on the server through SSH with the same user that configured for your server. + +2. Authenticate to Docker Registry + Login to the Docker Registry, normally execute `docker login` command. + + > You will be prompted to enter your Docker registry username and password/token - this can be varied depending on the Docker registry you are using. + +Once you logged in, Coolify will automatically detect your credentials and use them. + +## Swarm Mode + +If you are deploying to a Swarm cluster, you need to make sure that your Docker Registry is accessible from all nodes in the cluster, workers and managers. + +## Host your own registry + +You can easily host your own registry, however, it will consume a lot of storages as by default it stores images locally on the server. + +More info on how to set other storage drivers can be found in the [official documentation](https://distribution.github.io/distribution/storage-drivers/). + +You can find the one-click service in Coolify. + +### Setup + +You need to generate an user / password for the registry. + +You can generate one with the [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) command: + +```bash +htpasswd -nbB test test +``` + +Then go to `Storages` menu, and in the `/auth/registry.password` file, simply add the generated user / password. One line per user. + + + + +Do not forget to restart the registry service. + + diff --git a/content/docs/knowledge-base/docker/swarm.mdx b/content/docs/knowledge-base/docker/swarm.mdx new file mode 100644 index 00000000..3bf01c9e --- /dev/null +++ b/content/docs/knowledge-base/docker/swarm.mdx @@ -0,0 +1,139 @@ +--- +title: "Docker Swarm" +description: "Deploy Coolify resources across Docker Swarm clusters with external registry requirements, manager and worker setup, and persistent storage configuration." +--- + +# Docker Swarm + + + + +***This is an experimental feature.*** + + + + +## Setup in Coolify + +If you would like to use a Swarm to deploy your resources, you need to add the `Swarm Manager` to Coolify. + +Optionally, you can add the `Swarm Workers` to Coolify. This will allow Coolify to do cleanups and other stuff on the `Swarm Workers`. + +### Docker Registry + +You need to have an external Docker Registry available to use a Swarm, as all workers need to be able to pull the images you built with Coolify. + +- The Swarm Manager needs to push the image to the Docker Registry. +- The Swarm Workers need to pull the image from the Docker Registry. + +So set your docker login credentials accordingly. More information [here](/knowledge-base/docker/registry). + +## Install Swarm Cluster + +> WIP +> This is just a brief guide to install a simple Docker Swarm cluster. For more information, please refer to the [official documentation](https://docs.docker.com/engine/swarm/). + +### Prerequisites + +- I will use [Hetzner](https://coolify.io/hetzner) (referral link) for this guide. You can use any other provider. +- You need at least 3 servers to create a Docker Swarm cluster with the same architecture (ARM or AMD64). +- 1 server for the manager node. +- 2 servers for the worker nodes (you can add more worker nodes if you want). +- Add private networking to all servers if possible. + +### Install Docker + +Install Docker on all servers. You can follow the [official documentation](https://docs.docker.com/engine/install/) or: + +1. Install with Rancher script + +```bash +curl https://releases.rancher.com/install-docker/24.0.sh | sh +``` + +2. Install with Docker script + +```bash +curl https://get.docker.com | sh -s -- --version 24.0 +``` + +> You only need to use one of the above commands. + +### Configure Docker + +On `all servers`, run the following command to start Docker. + +```bash +systemctl start docker +systemctl enable docker +``` + + + + +Hetzner specific configuration. Hetnzer servers use a MTU of 1450. You need to configure Docker to use the same MTU. + +On the `manager`, run the following command to configure Docker. + +```bash +mkdir -p /etc/docker +cat < /etc/docker/daemon.json +{ + "default-network-opts": { + "overlay": { + "com.docker.network.driver.mtu": "1450" + } + } +} +EOF +systemctl restart docker +``` + + + + + +### Create a Swarm cluster + +`On the manager node`, run the following command to create a new cluster. + +```bash +# MANAGER_IP = IP of the manager node. If you have private networking, use the private IP, like 10.0.0.x. +docker swarm init --advertise-addr + +``` + +This command will output a command to join the cluster on the `worker nodes`. + +It should look like something like this: + +```bash +# DO NOT RUN THIS COMMAND, IT IS JUST AN EXAMPLE, HELLO! +docker swarm join --token SWMTKN-1-24zvxeydjarchy7z68mdawichvf684qvf8zalx3rmwfgi6pzm3-4ftqn9n8v98kx3phfqjimtkzx 10.0.0.2:2377 +``` + +### Verify the cluster + +Run the following command on the manager node to verify the cluster. + +```bash +docker node ls +``` + +You should see something like this: + +```bash +ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION +ua38ijktbid70em257ymxufif * swarm-manager Ready Active Leader 24.0.2 +7rss9rvaqpe9fddt5ol1xucmu swarm-worker Ready Active 24.0.2 +12239rvaqp43gddtgfsdxucm2 swarm-worker Ready Active 24.0.2 + +``` + +## Deploy with persistent storage + +To be able to deploy a service with persistent storage, you need to have a shared volume on the `swarm-workers`. So the Swarm service could move the resources between the `swarm-workers`. + +You can always use services like AWS EFS, NFS, GlusterFS, etc. + +> WIP diff --git a/content/docs/knowledge-base/domains.mdx b/content/docs/knowledge-base/domains.mdx new file mode 100644 index 00000000..6330e6e4 --- /dev/null +++ b/content/docs/knowledge-base/domains.mdx @@ -0,0 +1,116 @@ +--- +title: Domains +description: "Add custom domains to Coolify with FQDN format, multiple domain support, port mapping, path-based routing, wildcard domains, and custom DNS server validation." +--- + +# Domains + +You can easily add your own domains to your applications and services in Coolify. Databases do not support domain configuration. + +All domain fields are capable to generate your proxy configurations based on the following rules: + +1. You need to use FQDN (Fully Qualified Domain Name) format: `https://coolify.io` +2. You can give multiple domains, separated by comma: `https://coolify.io,https://www.coolify.io` +3. You can also add a port to the domain, so the proxy will know which port you would like to map to the domain: `https://coolify.io:8080,http://api.coolify.io:3000` + +## HTTPS & SSL Certificates + +Coolify automatically handles SSL/TLS certificates for your applications. When you enter a domain with the `https://` protocol, everything is configured for you behind the scenes. + +### How Automatic HTTPS Works + +When you enter a domain using the `https://` protocol (for example, `https://example.com`): + +1. **Automatic Proxy Configuration** - Coolify automatically applies the necessary configuration to your reverse proxy (Traefik or Caddy) to serve your application over HTTPS. + +2. **Certificate Issuance** - The proxy automatically starts the process to request and install SSL certificates from [Let's Encrypt](https://letsencrypt.org?utm_source=coolify.io). + +3. **Automatic Renewal** - Certificates are automatically renewed before they expire. Let's Encrypt certificates are valid for 90 days and Coolify handles renewals seamlessly. + + + + +You don't need to do anything special to enable HTTPS. Simply use `https://` when entering your domain, and Coolify takes care of the rest. + + + + +### Self-Signed Certificates + +If automatic certificate issuance from [Let's Encrypt](https://letsencrypt.org?utm_source=coolify.io) fails, the Coolify Proxy will provide a self-signed certificate to keep your application accessible. This means your application will still be reachable, but browsers will show a security warning. + + + + +If you see a certificate warning in your browser or your application shows a self-signed certificate, see the [Let's Encrypt Not Working](/troubleshoot/dns-and-domains/lets-encrypt-not-working) troubleshooting guide for detailed solutions. + + + + +## Path-Based Routing + +You can route traffic to different applications and services based on URL paths by appending a path to your domain. This allows multiple applications to share the same domain while being accessible at different paths. + +**Format**: `https://domain.com/path` or with a custom port: `https://domain.com:3000/path` + + + + +When using both a port and a path, the port must come **after** the domain but **before** the path. + +- Correct: `https://coolify.io:3000/api` +- Incorrect: `https://coolify.io/api:3000` + + + + +### How Path Priority Works + +Coolify automatically applies priority rules to path-based routing. More specific paths take precedence over less specific ones: + +- `/api/v2/users` → highest priority +- `/api/v2` → medium priority +- `/api` → lower priority +- `/` → lowest priority (root/fallback) + +This means you can safely deploy multiple applications on the same domain without worrying about routing conflicts. + +### Health Requirements + +For path-based routing to function correctly, the application serving a specific path must be **running and healthy**. If an application becomes unhealthy or stops responding, traffic to that path will fall back to the application serving the root domain (`/`). + + + + +If you have: +- App A serving `https://coolify.io/` (root) +- App B serving `https://coolify.io/api` + +And App B becomes unhealthy, requests to `/api` will be routed to App A instead. + + + + +Read more about how Coolifys proxies read and intepret the health of your resources in our [Health Checks page](/knowledge-base/health-checks). + +## Catch Multiple Domains + +Multitenancy is supported with Coolify. When using [Traefik](/knowledge-base/proxy/traefik), you can automatically catch multiple domains, by editing the `Container Labels` of your Application or Service and define a [`HostRegexp`](https://doc.traefik.io/traefik/reference/routing-configuration/http/routing/rules-and-priority/#host-and-hostregexp) rule. + + + + +The Coolify Proxy won't be able to issue SSL certificates for catch-all domains. For subdomains of a specific domain, you have the option to generate a [Wildcard SSL certificate](/knowledge-base/proxy/traefik/wildcard-certs). + + + + +## Wildcard Domain + +You can set a wildcard domain (`example: http://example.com`) to your server, so you can easily assign generated domains to all the resources connected to this server. [More details](/knowledge-base/server/introduction#wildcard-domain) + +## DNS Validation + +Since version `beta.191`, Coolify will validates DNS records for your domains with `1.1.1.1` Cloudflare DNS server. + +If you want to use different DNS server, go to your `Settings > Advanced` page and change the `Custom DNS Servers` field (comma separated list). diff --git a/content/docs/knowledge-base/drain-logs.mdx b/content/docs/knowledge-base/drain-logs.mdx new file mode 100644 index 00000000..888fec77 --- /dev/null +++ b/content/docs/knowledge-base/drain-logs.mdx @@ -0,0 +1,58 @@ +--- +title: Drain Logs +description: "Stream Coolify application logs to Axiom, New Relic, or custom FluentBit destinations for centralized monitoring and log analysis." +--- + +# Drain Logs +You can drain logs of your deployed services to a third-party applications like [Axiom](https://axiom.co/) or [New Relic](https://newrelic.com). + +> We will support more services in the future, like Signoz, HyperDX, etc. + +## How to enable? + +1. Enable on your Server. + - First, you need to enable it on your `Server` settings. + - Go to your `Server` where you want to enable the `Drain Logs` and click on the `Log Drains` tab. + +2. Enable on your Resource. + - Go to your resource, `Advanced` tab and enable the `Drain Logs` for the resource. + + + + + Once you enabled at least one of the `Drain Logs`, you need to `Restart` your + service to apply the changes. + + + + +## How to configure? +### Axiom + +You need to have a `Dataset` and an `API key` from Axiom. + +More information [here](https://axiom.co/docs). + +### New Relic + +You need to have an `License key` from New Relic. + +More information [here](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#ingest-license-key). + +#### Identify logs by application (per-service names) + +If you run multiple services (e.g. web, worker, db) and want to split logs by service in New Relic, add a stable app name to every log event. + +##### How to enable + +1. Go to your **resource -> Configuration -> Environment Variables** and add +`COOLIFY_APP_NAME=web` +(use any short identifier like web, worker, db, etc.).  + +2. **Restart** the resource for the change to take effect. (Log drains & env changes apply on restart.) + +When COOLIFY_APP_NAME is present, New Relic will receive a coolify.app_name attribute which you can use to filter logs by service in New Relic. + +## Custom FluentBit configuration + +If you know how to configure FluentBit, you can use the `Custom FluentBit configuration` to configure the drain logs. diff --git a/content/docs/knowledge-base/environment-variables.mdx b/content/docs/knowledge-base/environment-variables.mdx new file mode 100644 index 00000000..3f60989a --- /dev/null +++ b/content/docs/knowledge-base/environment-variables.mdx @@ -0,0 +1,254 @@ +--- +title: "Environment Variables" +description: "Manage build-time and runtime environment variables in Coolify with team, project, and environment-based shared variables plus predefined system values." +--- + +# Environment Variables + +You can define environment variables for your resources, and they will be available in your application. + +> Preview Deployments could have different environment variables, so you can test your application as a staging environment for example. + +## Normal View vs Developer View + +Coolify provides two ways to manage environment variables: **Normal view** and **Developer view**. You can switch between them using the button at the top of the environment variables section. + +### Normal View + +The default view displays each environment variable as an individual form card. Each card includes editable key and value fields, along with checkboxes for options like `Build Variable`, `Multiline`, and `Literal`. + +This view is best when you need to configure individual variables with specific options, or when working with multiline values and locked secrets. + +### Developer View + + + +The Developer view provides a plain-text editor where all environment variables are displayed in `.env` file format (`KEY=VALUE`, one per line). This is useful for bulk editing or pasting variables from an existing `.env` file. + +When saving, Coolify parses the text and creates, updates, or removes variables accordingly. The order of variables in the text editor is preserved. + + + + +Lines starting with `#` are treated as comments and ignored when saving. + + + + + + + +- **Locked secrets** are displayed as `KEY=(Locked Secret, delete and add again to change)` and cannot be edited in Developer view. You must delete and re-add them. +- **Multiline variables** are displayed as `KEY=(Multiline environment variable, edit in normal view)` and must be edited in Normal view. + + + + +## Build Time vs Runtime Variables + +Every environment variable has two independent flags that control **when** it is available: **Build Variable** and **Runtime Variable**. Both are enabled by default, so new variables are available in both phases unless you change this. + +| Configuration | Build phase | Running container | +|---|---|---| +| Build + Runtime (default) | Available | Available | +| Build only | Available | Not available | +| Runtime only | Not available | Available | + +You can toggle these checkboxes independently in the [Normal view](#normal-view). + +### Build Variables + +Build variables are injected during the image build process. For **Dockerfile** deployments, they are added as `ARG` instructions. For **Docker Compose** and **Nixpacks/Buildpack** deployments, they are passed via `--env-file`. + +Build-time variables are stored in a separate file (`/artifacts/build-time.env`) outside the Docker build context, so they are not included in the final image. + +### Runtime Variables + +Runtime variables are available inside the running container. After the build completes, Coolify writes a `.env` file containing all runtime-enabled variables, which is loaded by Docker Compose via the `env_file` directive at container start. + + + + +If you only need a variable at runtime (e.g., an API key your application reads on startup), disable `Build Variable` to keep it out of the build phase entirely. + + + + +### Docker Build Secrets + +By default, build variables are passed as `--build-arg` values. These values get recorded in the image metadata — anyone with access to the image can reveal them. For sensitive values like private registry tokens or API keys, you can enable **Use Docker Build Secrets** in your application's environment variable settings. This uses Docker [BuildKit](https://docs.docker.com/build/buildkit/?utm_source=coolify.io) (requires Docker 18.09+) to temporarily mount secrets into build steps instead of embedding them in image layers, so they leave no trace in the final image. + +When enabled, Coolify automatically rewrites your Dockerfile's `RUN` instructions to use `--mount=type=secret` — you do not need to modify your Dockerfile manually. For Docker Compose builds, Coolify adds a native `secrets:` section to the compose file instead. + +When enabled, Coolify: + +1. Passes build variables via `--secret id=KEY,env=KEY` instead of `--build-arg`. +2. Automatically adds a `# syntax=docker/dockerfile:1` directive to your Dockerfile if missing. +3. Injects `--mount=type=secret` into every `RUN` instruction, making secrets available as environment variables during that step. +4. Secrets are **never** embedded in image layers and are not visible in `docker history`. + +For **Docker Compose** builds, Coolify adds a native `secrets:` section to the compose file instead. + +| | Build Args (default) | Build Secrets | +|---|---|---| +| Docker flag | `--build-arg KEY=value` | `--secret id=KEY,env=KEY` | +| Visible in `docker history` | Yes | No | +| Stored in image layers | Yes | No | +| Requires BuildKit | No | Yes (Docker 18.09+) | + + + + +Coolify generates a `COOLIFY_BUILD_SECRETS_HASH` from all secret values. Docker build cache is preserved when your secrets haven't changed, and automatically invalidated when they have. + + + + + + + +If BuildKit is not available on the build server, Coolify falls back to traditional `--build-arg` behavior even when this setting is enabled. + + + + +## Multiline Variables + +The `Multiline` checkbox in [Normal view](#normal-view) preserves line breaks and special characters in your variable's value. Enable this when your value spans multiple lines, such as: + +- SSH private keys +- TLS/SSL certificates +- Multi-line configuration files or scripts + +Multiline values are wrapped in single quotes during deployment, which prevents any shell interpretation. During Docker builds, multiline build variables are passed using `ARG KEY` without inline value assignment to avoid breaking Dockerfile syntax — the actual value is supplied separately via `--build-arg`. + + + + +Multiline variables can only be edited in [Normal view](#normal-view). In [Developer view](#developer-view), they appear as `KEY=(Multiline environment variable, edit in normal view)`. + + + + +## Literal Variables + +The `Literal` checkbox in [Normal view](#normal-view) prevents variable interpolation. By default, Coolify expands references like `$OTHER_VAR` inside your value. Enabling `Literal` treats the entire value as plain text — dollar signs and other shell-special characters are preserved as-is. + +Use this when your value contains `$` characters that should **not** be interpreted as variable references: + +- Passwords containing `$` (e.g., `P@ss$word123`) +- Regex patterns (e.g., `^user\d+$`) +- Templating syntax or literal shell expressions + + + + +The `Literal` checkbox is hidden when `Multiline` is already enabled, since multiline values are always treated literally. + + + + +## Shared Variables + +You could have 3 types of shared variables: + +1. Team Based +2. Project Based +3. Environment Based (production, staging, etc.) + +You can set shared variables on their respective pages. + +Then you can use these variables anywhere. For example: You defined `NODE_ENV` to `production`. + +### Team Based + +You can set them on the `Team` page and use it with {{team.NODE_ENV}}. Do not replace "team" with your actual team name. + +### Project Based + +You can set them on the `Projects` page, under the gear icon and use it with {{project.NODE_ENV}}. Do not replace "project" with your actual project name. + +### Environment Based + +You can set them on the `Environments` page (select a `Project`), under the gear icon and use it with {{environment.NODE_ENV}} Do not replace "environment" with your actual environment name. + +### Using Environment and Shared Variables in Docker Compose + +Within Coolify you can configure these easily following the details found in the [Knowledge Base for Docker Compose](/knowledge-base/docker/compose#shared-environment-variables). + +## Predefined Variables + +Coolify predefines some variables for you, so you can use them in your application or service. All you need to do is to add an environment variable like this to your application or service. + +```bash +# For example, you can use this variable in your application +MY_VARIABLE=$SOURCE_COMMIT +# You will have the commit hash of the source code in your application as an environment variable in MY_VARIABLE +``` + +### Application Variables + +#### `COOLIFY_FQDN` + +Fully qualified domain name(s) of the application. + +#### `COOLIFY_URL` + +URL(s) of the application. + +#### `COOLIFY_BRANCH` + +Branch name of the source code. + +#### `COOLIFY_RESOURCE_UUID` + +Unique resource identifier generated by Coolify. + +#### `COOLIFY_CONTAINER_NAME` + +Name of the container generated by Coolify. + +#### `SOURCE_COMMIT` + +Commit hash of the source code. + + + + +By default, `SOURCE_COMMIT` is not included in Docker builds to preserve cache. Enable "Include Source Commit in Build" in your application's General settings if your build process needs this value. + + + + +#### `PORT` + +If not set: it is set to the `Port Exposes`'s first port. + +#### `HOST` + +If not set: it is set to `0.0.0.0` + +### Service Stack Variables + +#### `SERVICE_NAME_` + +The service name of a given service in the stack. For example, if you have a service named `web`, you can access it with `SERVICE_NAME_WEB`. Useful for preview deployments where service names will vary. + +## Magic Environment Variables + +For Docker Compose / Service Stack deployments, Coolify can auto-generate dynamic values using the `SERVICE__` syntax. These let you generate URLs, FQDNs, passwords, and random strings that stay consistent across all services in a stack. + +| Type | What it generates | Example output | +|---|---|-------------------------------------------| +| `SERVICE_URL_` | A URL based on your wildcard domain | `http://app-vgsco4o.example.com` | +| `SERVICE_URL__3000` | URL with proxy routing to a specific port | `http://app-vgsco4o.example.com:3000` | +| `SERVICE_URL_=/api` | URL with a path appended | `http://app-vgsco4o.example.com/api` | +| `SERVICE_URL__3000=/api` | URL with both port routing and path | `http://app-vgsco4o.example.com:3000/api` | +| `SERVICE_FQDN_` | The FQDN portion of the generated URL | `app-vgsco4o.example.com` | +| `SERVICE_FQDN__3000` | FQDN with proxy routing to a specific port | `app-vgsco4o.example.com:3000` | +| `SERVICE_FQDN_=/api` | FQDN with a path appended | `app-vgsco4o.example.com/api` | +| `SERVICE_USER_` | A random username string | `a8Kd3fR2mNpQ1xYz` | +| `SERVICE_PASSWORD_` | A random password (`PASSWORD_64` for 64 characters) | `G7hkL9mpQ2rT4vXw` | +| `SERVICE_BASE64_` | A random base64 string (`BASE64_64`, `BASE64_128` for longer) | `x9Yf2KqLm4NpR7TdWb8ZcA1eG3hJ5kM` | + +Generated values are reusable across services and persist between deployments. For full usage examples in a compose file, see [Magic Environment Variables in Docker Compose](/knowledge-base/docker/compose#coolify-s-magic-environment-variables). diff --git a/content/docs/knowledge-base/faq.mdx b/content/docs/knowledge-base/faq.mdx new file mode 100644 index 00000000..c79f2b81 --- /dev/null +++ b/content/docs/knowledge-base/faq.mdx @@ -0,0 +1,88 @@ +--- +title: FAQ +description: "Common Coolify questions answered including SSH permissions, custom ports, Cloudflare SSL, concurrent builds, and application port mapping troubleshooting." +--- + +# Frequently Asked Questions (FAQ) + +## Coolify + +### Coolify is not updating to the newest version. + +When a new version is released and a new GitHub release is created, it doesn't immediately become available for your instance. Read more about [Coolifys Release Cycle](https://github.com/coollabsio/coolify/blob/v4.x/RELEASE.md) on GitHub. + +## Server + +### Permission denied (publickey). + + + + +Error: `Server is not reachable. Reason: root@host.docker.internal: Permission denied (publickey).` + + + + + +Your Coolify instance cannot reach the server it is running on. During installation, a public key is generated to `/data/coolify/ssh/keys/id.root@host.docker.internal.pub` and automatically added to `~/.ssh/authorized_keys`. + +If it is not added, you can add it manually by running the following command on your server: + +```bash + cat /data/coolify/ssh/keys/id.root@host.docker.internal.pub >> ~/.ssh/authorized_keys +``` + +### Custom SSH Port + +If you would like to use a custom SSH port, you can set it in the `Server` tab of your server. + +If you are self-hosting Coolify, you can simply set it after you installed Coolify on the `localhost` server. + +### Increase Concurrent Builds + +If you would like to increase the number of concurrent builds, you can set it in the `Server` tab of your server. + +### Coolify Cloud Public IPs + +If you need the public facing IPs to allow inbound connections to your servers, here is an up-to-date list of IPs that you can use to whitelist: + +- https://coolify.io/ipv4.txt +- https://coolify.io/ipv6.txt + +## Cloudflare + +### Configured but application is not reachable. + +You need to set your SSL/TLS configuration to at least `Full` in your Cloudflare dashboard. + +Documentation: https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full/ + +### Too many redirections. + +You need to set your SSL/TLS configuration to at least `Full` in your Cloudflare dashboard. + +Documentation: https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full/ + +## Applications + +### How to map a port the server? + +If you want to map a port the host system (server), you need to use [Ports Mappings](/applications/#port-mappings) feature. + +## SSL & HTTPS + +### How do I enable HTTPS/SSL for my application? + +HTTPS is automatically enabled when you enter a domain using the `https://` protocol (for example, `https://example.com`). Coolify will automatically configure your reverse proxy and request SSL certificates from Let's Encrypt. You don't need to do any additional setup. + +For more details, see the [Domains documentation](/knowledge-base/domains#https-ssl-certificates). + +### My application is showing a certificate warning in the browser. What should I do? + +If your browser shows a certificate warning or indicates a self-signed certificate, it means the automatic certificate issuance from Let's Encrypt failed. This is usually due to DNS configuration issues, firewall problems, or port accessibility. + +See the [Let's Encrypt Not Working](/troubleshoot/dns-and-domains/lets-encrypt-not-working) troubleshooting guide for detailed solutions. + +### Do SSL certificates renew automatically? + +Yes. Coolify automatically renews SSL certificates from Let's Encrypt before they expire. Let's Encrypt certificates are valid for 90 days, and Coolify handles all renewals seamlessly in the background. diff --git a/content/docs/knowledge-base/health-checks.mdx b/content/docs/knowledge-base/health-checks.mdx new file mode 100644 index 00000000..1307b4c2 --- /dev/null +++ b/content/docs/knowledge-base/health-checks.mdx @@ -0,0 +1,61 @@ +--- +title: Health checks +description: "Configure application health checks in Coolify with Dockerfile or UI settings for Traefik routing, rolling updates, and troubleshooting 404 errors." +keywords: ["Healthchecks", "Not Found", "No available server", "404", "503"] +--- + +# Health checks + +Health checks are a way to ensure that your applications and services are running correctly. They allow Coolify to monitor the health of your resources and ensure that traffic is only routed to healthy instances. This is, for example, important for [Rolling Updates](/knowledge-base/rolling-updates) to work correctly. + +## Traefik + +When using Traefik as the reverse proxy, health checks are an integral part of how it routes traffic to your resources. + +### Enabled + +If your resource has health checks _enabled_, Traefik will only route traffic to it if the health check passes. If the health check fails, Traefik will not route traffic to the resource. + +**It will cause the resource to return a `404 Not Found` or `No available server` error.** + + + + +If you're experiencing "No available server" errors, check our comprehensive [troubleshooting guide](/troubleshoot/applications/no-available-server) which covers the most common causes and solutions. + + + + +### Disabled + +If your resource has health checks _disabled_, Traefik will route traffic to it regardless of the health check status. + +## Configure Health checks + +### Applications + +There are two ways to configure health checks for your applications: + + + +1. **Using the UI**: You can set up health checks directly in the Coolify UI when creating or editing an application. You can specify the path to check, the expected response code, and the interval for checking. It will be required that the container has either `curl` or `wget` installed to perform the health checks. + +2. **Using the Dockerfile**: You can also define health checks in your Dockerfile using the [HEALTHCHECK](https://docs.docker.com/reference/dockerfile/#healthcheck) instruction. This allows you to specify how the health check should be performed, including the command to run and the expected response. + +If there are healthchecks both in the UI and in the Dockerfile defined and enabled, the Dockerfile will take precedence. + +### Service Stacks + +Services or Applications that use the [Docker Compose Build Pack](/applications/build-packs/docker-compose) require their health checks to be defined in the `Dockerfile` of each service, or in their `docker-compose.y[a]ml` file using the [healthcheck](https://docs.docker.com/reference/compose-file/services/#healthcheck) attribute. + + + + +It is recommended to enable health checks for all your resources. This way, you can ensure that only healthy resources are receiving traffic. + +But if you cannot set up health checks for some reason, you can disable them. + +Just be aware that if the resource is unhealthy, it will still receive traffic. + + + diff --git a/content/docs/knowledge-base/how-to/backup-restore-coolify.mdx b/content/docs/knowledge-base/how-to/backup-restore-coolify.mdx new file mode 100644 index 00000000..01bf88cf --- /dev/null +++ b/content/docs/knowledge-base/how-to/backup-restore-coolify.mdx @@ -0,0 +1,223 @@ +--- +title: Backup and Restore Coolify +description: "Backup and restore your Coolify instance with S3 or manual methods including database migration, SSH key transfer, and APP_KEY configuration." +--- + +# Backup and Restore Your Coolify Instance + +This guide will show you how to back up your Coolify instance and restore it on a new server. + +There are two methods to create backups: + +- **S3 Backup:** Use S3-compatible storage to automatically save backups. +- **Manual Backup:** Trigger a backup manually from the Coolify dashboard. + +If you use S3-compatible storage, simply download the backup file from your S3 provider and transfer it to your new server. + +The rest of this guide will focus on the manual backup method, which is ideal for most users. + + + + +This only backs up and restores the Coolify instance itself — not your application data. + +All settings from your Coolify dashboard will be restored, but application data (such as volume mounts) must be backed up and restored manually. + +For details, refer to the [Application Migration Guide](https://coolify.io/docs/knowledge-base/how-to/migrate-apps-different-host). + + + + +## 1. Create a Manual Backup + +1. **Go to Backup Page on Dashboard:** + In your Coolify dashboard, click on **Settings** and select the **Backup** tab to view your database and backup settings. + + +2. **Trigger a Backup:** + Click on the **Backup Now** button. This will start the backup process in the background. + + +3. **Download or Copy Backup Location:** + Once the backup is complete, you will see a **Download** button and a location path in the UI. + + - **Download:** Saves the backup file to your local computer. + - **Copy Path:** You can use this path with a tool like SCP to transfer the backup file directly to your new server. + + + + +If you are using S3-compatible storage for backups, download the backup file from your S3 provider instead + + + + +## 2. Retrieve Your `APP_KEY` + +Before you restore the backup, you need to obtain the `APP_KEY` from your current Coolify instance. This key is used to decrypt your data during restoration. + +1. **Open the Terminal in Coolify:** + Access the **Terminal** tab in the dashboard and connect to the server where Coolify is running. This server is named as `localhost` by default. + +2. **View the Environment File** + Run the following command to display the contents of the `.env` file: + ```bash + cat /data/coolify/source/.env + ``` + Copy the value of `APP_KEY` and save it securely. This key is important for the restoration process. + + + + +Save this `APP_KEY` safely. Without it, you cannot restore your backup. + + + + +## 3. Back Up Your Coolify SSH Private and Public Key + +Coolify generates one (or more) SSH key files under `/data/coolify/ssh/keys`. If you restore Coolify onto a new machine, you must bring those key files along so your managed servers remain reachable. + +1. **Locate the SSH Key on the Old Host:** + + ```bash + ls -l /data/coolify/ssh/keys + ``` + + You should see one or more files named like: + + ```bash + ssh_key@ + ssh_key@ + ssh_key@ + ``` + + Each `ssh_key@…` entry represents an ED25519 key that Coolify uses to SSH into your servers. + +2. **Copy all these SSH key files to your new host server and store them in a secure location (we will need this later on this guide).** + +3. **Retrieve public keys:** + + Retrieve the public keys from your old server's `~/.ssh/authorized_keys` file and append them to the new server's `~/.ssh/authorized_keys` file (do not replace existing entries). + +## 4. Prepare Your New Server + +Set up your new server where you will restore your Coolify instance. + +1. **Install a Fresh Coolify Instance:** + Follow the [installation instructions](/get-started/installation) to install Coolify on your new server. + + Be sure to include the correct version number (example: `-s 4.0.0-beta.400`) at the end of the installation script to ensure you're installing the same Coolify version as before. + + For example, to install version `4.0.0-beta.400`, use this command: + + ```bash + curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.0.0-beta.400 + ``` + + Remember to replace `4.0.0-beta.400` with the desired version number. + +2. **Verify the Installation:** + Access your new Coolify instance on your browser. A fresh installation will show the registration page, indicating that no data exists yet. + +## 5. Transfer and Restore the Backup + +1. **Transfer the Backup File:** + Copy the backup file and SSH keys to the new server. You can do this via SCP, FTP, or any other secure file transfer method. +2. **Stop Coolify:** + + ```bash + docker stop coolify coolify-redis coolify-realtime coolify-proxy + ``` + +3. **Run the Restore Command:** + Use the PostgreSQL restore tool to import your backup into the database container. + + ```bash + cat /path/to/your_backup_file \ + | docker exec -i coolify-db \ + pg_restore --verbose --clean --no-acl --no-owner -U coolify -d coolify + ``` + + You have to replace `/path/to/your_backup_file` with the path of your backup file on the server. + + + + + Some warnings about existing foreign keys or sequences might appear, these can usually be ignored if the base structure remains intact. + + + + +## 6. Replace the Auto-Generated SSH Key + +Replace the key files under `/data/coolify/ssh/keys`. + +1. **Remove any auto-generated keys:** + +```bash +rm -f /data/coolify/ssh/keys/* +``` + +2. **Move your old key files into** `/data/coolify/ssh/keys/` + + These are the files you copied to the new host server on [step 3](#_3-back-up-your-coolify-ssh-private-and-public-key) + +## 7. Update Environment Settings for Restoration + +After restoring the backup, update your environment configuration to allow the new instance to use the old data. + +1. **Edit the Environment File:** + Open the `.env` file with your preferred text editor: + + ```bash + nano /data/coolify/source/.env + ``` + +2. **Add the Previous APP Key:** + Add a new environment variable called `APP_PREVIOUS_KEYS` and paste the value of `APP_KEY` you saved earlier. If you have migrated multiple times, you can list multiple keys separated by a comma (ensure there are no spaces between them): + + ```yaml + # Single key example: + APP_PREVIOUS_KEYS=your_previous_app_key_here + ``` + + ```yaml + # Multiple keys example + APP_PREVIOUS_KEYS=app_key_1,app_key_2,app_key_3 + ``` + + Save and exit the editor. + +## 8. Restart Coolify + +To apply the restored backup and updated environment settings, restart your Coolify instance using the install script. + +1. **Run the Installation Script:** + Re-run the Coolify installation command: + + ```bash + curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash -s 4.0.0-beta.400 + ``` + + Remember to replace `4.0.0-beta.400` with the desired version number. + +2. **Verify the Restoration:** + Visit your Coolify dashboard URL and log in with the same credentials from your previous instance. Your projects, deployments, and settings should now be restored. + +## Troubleshooting + +- **500 Error on Login or Project Access:** + Double-check that the `APP_PREVIOUS_KEYS` variable is correctly set in your `.env` file. + +- **Permission Denied Errors:** + If you encounter permission issues while accessing directories, change the ownership of the `/data/coolify` directory. Since Coolify uses the root user account, ensure that the ownership is set to **root**: + ```bash + sudo chown -R root:root /data/coolify + ``` +- **Server is not reachable (Permission denied):** + If Coolify cannot SSH into your servers because it doesn’t have the same key files. + + Make sure you copied all of `/data/coolify/ssh/keys/` from the old host, and then placed them under `/data/coolify/ssh/keys/` on the new host. If those files do not exactly match what was on the old server, you will see this error. + + Also, ensure that the corresponding public key from the old host's `authorized_keys` file is added to the new host's `~/.ssh/authorized_keys`. diff --git a/content/docs/knowledge-base/how-to/hetzner-loadbalancing.mdx b/content/docs/knowledge-base/how-to/hetzner-loadbalancing.mdx new file mode 100644 index 00000000..dbeef188 --- /dev/null +++ b/content/docs/knowledge-base/how-to/hetzner-loadbalancing.mdx @@ -0,0 +1,166 @@ +--- +title: "Load Balancing on Hetzner" +description: "Deploy scalable load-balanced applications on Hetzner Cloud with Coolify including TLS termination, health checks, database setup, and firewall configuration." +--- + +# Load Balancing on Hetzner +Hetzner Cloud is a cloud hosting provider that offers a wide range of services. In this guide, we will show you how to deploy a load-balanced application with Coolify on Hetzner Cloud. + +## Introduction + +Your application is growing, and you need to scale it. One of the most common ways to scale an application is to use a load balancer. A load balancer distributes incoming traffic across multiple servers, ensuring that no single server is overwhelmed. This can help improve the performance and reliability of your application. + +In this guide, we will show you how to deploy a load-balanced application with Coolify on Hetzner Cloud. We will use two (or more) servers to host our application and a load balancer to distribute incoming traffic. We will also show you how to set up a database server if you need one. + + + + +The whole infrastructure costs around ~15€ per month. + + + + +## Requirements + +- A domain name managed by Hetzner Cloud +- 2 (or more) servers on Hetzner Cloud +- A load balancer on Hetzner Cloud +- Firewall rules to restrict access to your servers +- Optional: A database server on Hetzner Cloud + + +## Steps + +1. ### Buy Servers + + First, you need to buy two (or more) servers on Hetzner Cloud. You can choose the server type and location based on your requirements. Make sure to choose servers with enough resources to run your application. + + + + + Make sure you create and attach a private network to your servers. This will allow your servers to communicate with each other using a private network. + + + + + If you don't have an account on Hetzner Cloud, you can sign up with this [referral link](https://coolify.io/hetzner). + +2. ### Add & validate them in Coolify + + Once you have bought the servers, you need to add them to Coolify. You can do this by clicking on the `Add Server` button in the Coolify dashboard and following the instructions. + + Coolify will automatically install the necessary software on your servers. + +3. ### Optional: Deploy your database + + It is preferable to have a separate database server for your application. Not just for performance reasons, but also for security reasons. Also in this way you can connect your applications to a centralized database server. + + Skip this step if you don't need a database server or if you already have one hosted elsewhere. + + Once you have bought the database server, and added it to Coolify, deploy your preferable database type (MySQL, PostgreSQL, etc.) on it. + + + + + We won't use a reverse proxy in this guide. We will bind the database to the public IP address of the server. We will use a firewall to restrict access to the database server. + + You can stop them on the `Server` tab and switch to a `None` proxy type. + + + + + Make sure you set the `Ports Mappings` correctly to allow your application servers to connect to the database server. + + - PostgreSQL: `5432:5432` + - MySQL: `3306:3306` + - MariaDB: `3306:3306` + - MongoDB: `27017:27017` + +4. ### Deploy your applications + + Now it's time to deploy your application on the app servers. Details of deploying your application will depend on the type of application you are deploying. + + With Coolify, you can attach more than one server to the same application. This will allow you to deploy your application on multiple servers. + + + + + We won't use a reverse proxy in this guide. We will bind the application to the public IP address of the server, as the load balancer will handle the routing. + + You can stop them on the `Server` tab and switch to a `None` proxy type. + + + + + Make sure you set the `Ports Mappings` correctly to forward your application ports to the public IP address of the server. + + If your application uses a database, make sure you update the database connection string to point to the database server. + + + + Hetzner Cloud has a private network feature that allows you to connect your servers using a private network. This can help improve the security and performance of your application. + + Make sure you enable the private network feature on your servers and use it in the database connection string. + + + + + Test if your application is working correctly by accessing the public IP address and port of the server in your browser. + +5. ### Add & configure the loadbalancer + + Now it's time to add a load balancer to distribute incoming traffic across your servers. + + This loadbalancer will do the following: + - Distribute incoming traffic across your servers + - Terminates TLS connections (makes your application secure with HTTPS and forwards the traffic to your servers over HTTP) + - Health checks your servers and routes traffic to healthy servers + + Your application is running on `port 8000` on both servers and you have a domain name `example.com`. + + 1. Go to the Hetzner Cloud Console and click on `Load Balancers` in the left sidebar. + 2. Click on the `Create Load Balancer` button. + 3. Select a region where your servers are located. + 4. Select the private network that you have created for your servers. + 5. Select all servers in the targets section. **Important: `(use the private network)`.** + 6. In the services, delete the default service and add a `TLS Termination` predefined service. + 7. As `Destination Port` enter `8000` (source port should be `443`). + 8. Add a certificate for your domain name. It will generate a certificate for your domain name using Let's Encrypt. + 9. In the `health check` section, configure the health check endpoint to your application health check endpoint. (just an endpoint that returns `200 OK`). + 10. Optional: Sticky sessions can be enabled, which will make sure that a user is always routed to the same server for a time period, otherwise, the load balancer will distribute the traffic randomly across your servers. + 11. Choose an algorithm. + 12. And finally name your load balancer and click on `Create & Buy now`. + + Wait for the load balancer to be created and healthy. Once it's healthy, you can check if your application is accessible via the loadbalancer's IP address. + +6. ### Setup DNS + + Now it's time to point your domain name to the `load balancer's IP address`. You can do this by adding an `A` record to your domain name provider's DNS settings. + + 1. Go to your DNS settings. + 2. Add an `A` record with the domain name and the value of the load balancer's IP address. + 3. Save the changes and wait for the DNS changes to propagate. + + Once the DNS changes have propagated, you should be able to access your application using your domain name. + +7. ### Setup Firewall + + Hetzner Cloud offers a firewall feature that allows you to restrict access to your servers. We will use this feature to restrict access to your servers. + + As the load balancer communicates with your servers over the private network, we only need to add rules for the public IP addresses. + + The `Inbound` rules includes everything that is allowed. Everything else is blocked by default. + + 1. Go to the Hetzner Cloud Console and click on `Firewalls` in the left sidebar. + 2. Click on the `Create Firewall` button. + 3. Add SSH access rule for your IP address to the `Inbound` rules. + 4. Add your servers to the `Apply rule` section. + 5. Name your firewall and click on `Create Firewall`. + + + + + Optional: You can add more rules to allow access to specific ports or IP addresses if needed. + + + diff --git a/content/docs/knowledge-base/how-to/macos-colima.mdx b/content/docs/knowledge-base/how-to/macos-colima.mdx new file mode 100644 index 00000000..5cb6bfde --- /dev/null +++ b/content/docs/knowledge-base/how-to/macos-colima.mdx @@ -0,0 +1,168 @@ +--- +title: "macOS using Colima Setup Guide" +description: "Install Coolify on macOS using a Colima virtual machine with Docker, covering VM creation, networking, and SSH configuration." +--- + +# macOS using Colima Setup Guide + +This guide walks you through setting up Coolify on macOS using [Colima](https://github.com/abiosoft/colima?utm_source=coolify.io), a lightweight container runtime for macOS. + +## Prerequisites + +- A Mac (Intel or Apple Silicon) +- [Homebrew](https://brew.sh/?utm_source=coolify.io) installed +- Remote Login enabled on your Mac — see [Apple's guide to allow remote access](https://support.apple.com/guide/mac-help/mchlp1066/mac?utm_source=coolify.io) to enable SSH in **System Settings > General > Sharing > Remote Login** +- An SSH key without a passphrase + + + + +The SSH key used for Coolify must not have a passphrase or 2FA enabled, otherwise you will not be able to complete the onboarding process. + + + + +## Install Colima + +1. Install Colima and Docker using Homebrew: + + ```bash + brew install colima docker + ``` + +2. Verify the installation: + + ```bash + colima version + ``` + +## Create the Virtual Machine + +1. Start a new Colima VM with the minimum resources: + + ```bash + colima start -c 2 -m 2 -d 30 --ssh-port 2222 --network-address --network-mode bridged --save-config + ``` + + This creates a VM with: + - **2 CPU cores** (`-c 2`) + - **2 GB of memory** (`-m 2`) + - **30 GB of disk space** (`-d 30`) + - **SSH on port 2222** (`--ssh-port 2222`) + - **Bridged networking** (`--network-address --network-mode bridged`) — the VM gets its own IP from your router + - **Save configuration** (`--save-config`) — persists these settings so future `colima start` commands use the same configuration + + + + + You can adjust these values based on your needs. These are recommended minimums for running Coolify along with a few services. + + + + +2. Verify the VM is running: + + ```bash + colima status + ``` + +## Networking + +Colima supports two network modes: **bridged** (recommended) and **shared**. + +### Bridged Mode (Default in This Guide) + +The command above uses `--network-address --network-mode bridged`, which assigns the VM an IP address directly from your router's DHCP server. This makes the VM behave like a separate device on your network, allowing other devices on your LAN to reach Coolify. + + + + +By default, bridged mode uses the `en0` interface. If your Mac uses a different network interface, specify it with `--network-interface `. + + + + +You can find the VM's IP address with: + +```bash +colima list +``` + +### Shared Mode + +If you don't need Coolify to be accessible from other devices on your network — for example, if you plan to use [Tailscale](https://tailscale.com/?utm_source=coolify.io) or only need to access Coolify from your Mac — you can omit the network flags: + +```bash +colima start -c 2 -m 2 -d 30 --ssh-port 2222 --save-config +``` + +In shared mode, the VM gets an IP on a private subnet that is only reachable from the host Mac. + +## SSH Configuration + +Coolify connects to servers via SSH. Since we specified `--ssh-port 2222` when creating the VM, the SSH port is fixed and won't change between restarts. + +You can verify the SSH configuration at any time with: + +```bash +colima ssh-config +``` + +This outputs the full SSH config, including the **hostname**, **port**, **user**, and **identity file** the VM is configured with. + +Use the hostname and port from the output when adding the server in Coolify's onboarding or server settings. + + + + +If you omit `--ssh-port` when creating the VM, Colima assigns a random free port that may change on restart. Use `colima ssh-config` to check the current port. + + + + +## Install Coolify + +1. SSH into the Colima VM: + + ```bash + colima ssh + ``` + +2. Inside the VM, proceed with the [Coolify installation](/get-started/installation#quick-installation-recommended). + +3. Once the installation completes, access the Coolify web interface depending on your network mode: + + - **Bridged mode**: Open `http://:8000` from any device on your network. + - **Shared mode**: Open `http://:8000` from your Mac only (the VM is not reachable from other devices). + + Find the VM's IP address with `colima list`. + +4. In the Coolify web interface, go to your server settings and set the **SSH port** to the port you specified when creating the VM (e.g., `2222`). Coolify uses this port to manage the server via SSH. + +## Starting Fresh + +If something goes wrong and you want to start over, you can delete the VM and recreate it. + +- Delete the VM but keep its disk data: + + ```bash + colima delete + ``` + +- Delete the VM and all its data: + + ```bash + colima delete --data + ``` + +After deleting, go back to [Create the Virtual Machine](#create-the-virtual-machine) to set up a new VM. + +## Post-Install Steps + +### Start Colima Automatically on Boot + +To have Colima start automatically when your Mac boots: + +```bash +brew services start colima +``` \ No newline at end of file diff --git a/content/docs/knowledge-base/how-to/meta.json b/content/docs/knowledge-base/how-to/meta.json new file mode 100644 index 00000000..cf576fbd --- /dev/null +++ b/content/docs/knowledge-base/how-to/meta.json @@ -0,0 +1,14 @@ +{ + "title": "How-Tos", + "pages": [ + "migrate-apps-different-host", + "backup-restore-coolify", + "hetzner-loadbalancing", + "wordpress-multisite", + "raspberry-pi-os", + "macos-colima", + "private-npm-registry", + "ollama-with-gpu", + "webstudio-with-hetzner" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/how-to/migrate-apps-different-host.mdx b/content/docs/knowledge-base/how-to/migrate-apps-different-host.mdx new file mode 100644 index 00000000..141e3a58 --- /dev/null +++ b/content/docs/knowledge-base/how-to/migrate-apps-different-host.mdx @@ -0,0 +1,500 @@ +--- +title: Migrate Applications +description: Step-by-step guide to migrate applications, databases, and Docker volumes from one Coolify server to another with backup and restore scripts +--- + +# Migrate Applications to Another Coolify Host + +Coolify does not have a built-in option to migrate applications from one server to another. + +You have to manually deploy your app on the new server and copy over your databases and volumes. This guide walks you through that process step by step. + + + + + We assume you already have Coolify installed on your destination server and are ready to migrate your app. + + + + + +## 1. Understand Data Persistence +When using Coolify, application data lives in one of two places: + + + +### Bind mounts + - When using bind mounts, a host directory or file is mapped into the container. + - Any changes made to the directory or file on the host will immediately reflect inside the container. + - To back up data, simply copy the host directory or file to the new server and update the bind-mount path in your application’s configuration. + +### Volume mounts + - With volume mounts, a Docker volume is created (Coolify usually creates the volume, but you can also set it up yourself.) and used to store application data. + - The volume is stored in Docker’s volume directory, typically under `/var/lib/docker/volumes/` + - You can’t just copy that directory directly, instead Docker provides a safe backup-and-restore method using a temporary container. + + + + + Since bind mounts are simple to migrate by copying files directly, this guide will focus primarily on volume backups. + + + + + +## 2. Backup and Restore Overview +The [Docker-recommended process](https://docs.docker.com/engine/storage/volumes/#back-up-restore-or-migrate-data-volumes) for volume migration looks like this: + + + +1. **Mount** your volume into a temporary container. +2. **Archive** the volume’s contents into a tarball. +3. **Copy** the tarball from the container to your host and then delete the temporary container. +4. **Transfer** the tarball to the new server. +5. **Create** a fresh volume on the destination. +6. **Mount** the transferred tarball into a temporary container. +7. **Extract** the archive into the new volume. + +This series of steps ensures a consistent, safe backup and restore. Below, we’ll provide ready-to-use scripts and detailed instructions. + +--- + + + + + The steps below include scripts to help you back up, transfer, and restore volumes easily and interactively. + + They also include checks to ensure volumes and backups exist, to prevent mistakes like restoring to the wrong volume. + + + + +## 3. Backup the Volume + +1. **SSH into your server** where you have the Docker volume. +2. **Create a script** named `backup.sh`: + ```bash + touch backup.sh && chmod +x backup.sh + ``` +3. **Open** `backup.sh` in your editor and paste the following: + + ```bash + #!/bin/bash + + # === INPUT PROMPTS === + # Prompt for the Docker volume name and set the variable + read -p "[ Backup Agent ] [ INPUT ] Please enter the Docker volume name to back up: " VOLUME_NAME + + # Inform the user of the set volume name + echo "[ Backup Agent ] [ INFO ] Backup Volume is set to $VOLUME_NAME" + + # Check if the entered volume exists + if ! docker volume ls --quiet | grep -q "^$VOLUME_NAME$"; then + echo "[ Backup Agent ] [ ERROR ] Volume '$VOLUME_NAME' doesn't exist, aborting backup." + echo "[ Backup Agent ] [ ERROR ] Backup Failed!" + exit 1 # Exit if volume doesn't exist + else + echo "[ Backup Agent ] [ INFO ] Volume '$VOLUME_NAME' exists, continuing backup..." + fi + + # Prompt for the directory to save the backup + read -p "[ Backup Agent ] [ INPUT ] Please enter the directory to save the backup (Optional: press enter to use ./volume-backup): " BACKUP_DIR + # If no directory is entered, default to './volume-backup' + BACKUP_DIR=${BACKUP_DIR:-./volume-backup} + + # Inform the user of the backup location + echo "[ Backup Agent ] [ INFO ] Backup location is set to $BACKUP_DIR" + + # Set the backup file name based on the volume name + BACKUP_FILE="${VOLUME_NAME}-backup.tar.gz" + + # Inform the user of the backup file name + echo "[ Backup Agent ] [ INFO ] Backup file name is set to $BACKUP_FILE" + + # === SCRIPT START === + # Check if the backup directory exists + if [ -d "$BACKUP_DIR" ]; then + echo "[ Backup Agent ] [ INFO ] Directory '$BACKUP_DIR' already exists, skipping directory creation." + else + echo "[ Backup Agent ] [ INFO ] Directory '$BACKUP_DIR' does not exist, creating directory." + # Create the backup directory, exit if creation fails + mkdir -p "$BACKUP_DIR" || { + echo "[ Backup Agent ] [ ERROR ] Failed to create directory '$BACKUP_DIR', aborting backup." + echo "[ Backup Agent ] [ ERROR ] Backup Failed!" + exit 1 + } + fi + + # Perform the backup operation + echo "[ Backup Agent ] [ INFO ] Backing up volume: $VOLUME_NAME to $BACKUP_DIR/$BACKUP_FILE" + + # Run the Docker container to create the backup + docker run --rm \ + -v "$VOLUME_NAME":/volume \ + -v "$(pwd)/$BACKUP_DIR":/backup \ + busybox \ + tar czf /backup/"$BACKUP_FILE" -C /volume . || { + # If the backup fails, print an error message and exit + echo "[ Backup Agent ] [ ERROR ] Backup process failed, aborting." + echo "[ Backup Agent ] [ ERROR ] Backup Failed!" + exit 1 + } + + # If everything succeeds, notify the user + echo "[ Backup Agent ] [ SUCCESS ] Backup completed!" + ``` + +4. **Find the volume name** by running: + + ```bash + docker volume ls + ``` + + Or from Coolify’s **Persistent Storage** page (see below). + + +5. **Stop your application** to perform a clean backup. +6. **Run** the script: + + ```bash + ./backup.sh + ``` + + * When prompted, paste the volume name. + * Press **Enter** to accept the default backup directory (`./volume-backup`), or type a custom path. +7. **Verify** that you now have a directory (e.g., `volume-backup`) containing `-backup.tar.gz`. + +--- + +## 4. Transfer the Backup to the New Server + + + + If you already know how to manually transfer the backup file, feel free to move on to the next step. + + + + +1. **Create** a second script named `transfer.sh`: + ```bash + touch transfer.sh && chmod +x transfer.sh + ``` + +2. **Open** `transfer.sh` in your editor and paste the following: + + ```bash + #!/bin/bash + + # =============== CONFIG VARIABLES =============== + SSH_PORT=22 + SSH_USER="root" + SSH_IP="192.168.1.222" + SSH_KEY="$HOME/.ssh/local-vm" + SOURCE_PATH="./volume-backup" + DESTINATION_PATH="/root/backups/volume-backup" + MAX_RETRIES=3 # Max number of password attempts + + echo "[ Transfer Agent ] [ INFO ] Starting transfer..." + echo "[ Transfer Agent ] [ INFO ] Trying SSH key: $SSH_KEY" + echo "[ Transfer Agent ] [ INFO ] Transfer from: $SOURCE_PATH" + echo "[ Transfer Agent ] [ INFO ] Transfer to: $SSH_USER@$SSH_IP:$DESTINATION_PATH" + + # If SSH key file doesn’t exist, fall back to password mode + if [ ! -f "$SSH_KEY" ]; then + echo "[ Transfer Agent ] [ WARN ] SSH key '$SSH_KEY' not found. Falling back to password authentication." + SSH_KEY="" + fi + + # If we need password-based auth, ensure Expect is installed + if [ -z "$SSH_KEY" ] && ! command -v expect >/dev/null 2>&1; then + echo "[ Transfer Agent ] [ ERROR ] The package expect is required for password authentication but not installed (Install it manually using sudo apt install expect and try again). Aborting." + exit 1 + fi + + # --------------------------------------------- + # Helper: test whether $1 (the password) is valid by doing “ssh … exit” + # Returns 0 if OK, 1 if “Permission denied” (or any other failure) + test_password_with_expect() { + local PW="$1" + + expect -c " + log_user 0 + set timeout 15 + spawn ssh -o StrictHostKeyChecking=no -p $SSH_PORT $SSH_USER@$SSH_IP exit + expect { + \"*?assword:\" { + send -- \"$PW\r\" + expect { + \"Permission denied\" { exit 1 } + eof { exit [lindex [wait] 3] } + } + } + eof { + exit [lindex [wait] 3] + } + } + " >/dev/null 2>&1 + + return $? + } + + # Prompt up to $MAX_RETRIES times for a correct password + get_password() { + local retries=0 + while [ $retries -lt $MAX_RETRIES ]; do + read -s -p "[ Transfer Agent ] [ INPUT ] Please enter the SSH password for $SSH_USER@$SSH_IP: " SSHPASS + echo "" + test_password_with_expect "$SSHPASS" + if [ $? -eq 0 ]; then + # Password is correct + return 0 + else + echo "[ Transfer Agent ] [ ERROR ] Invalid password. Please try again." + retries=$((retries + 1)) + fi + done + + echo "[ Transfer Agent ] [ ERROR ] Maximum retries reached. Aborting." + exit 1 + } + + # --------------------------------------------- + # STEP 0: Attempt SSH-key authentication (if a key is set) + if [ -n "$SSH_KEY" ]; then + # Use BatchMode to prevent falling back to password prompt + ssh -i "$SSH_KEY" -o BatchMode=yes -o StrictHostKeyChecking=no -p "$SSH_PORT" \ + "$SSH_USER@$SSH_IP" exit >/dev/null 2>&1 + RC=$? + if [ $RC -eq 0 ]; then + echo "[ Transfer Agent ] [ INFO ] SSH key is valid!" + USING_KEY=true + else + echo "[ Transfer Agent ] [ WARN ] SSH key authentication failed. Falling back to password authentication." + SSH_KEY="" + USING_KEY=false + fi + else + USING_KEY=false + fi + + # If key auth failed (or no key), prompt for password + if [ "$USING_KEY" = false ]; then + get_password + echo "[ Transfer Agent ] [ INFO ] Password is valid!" + fi + + # --------------------------------------------- + # STEP 1: Ensure the full DESTINATION_PATH exists on the remote side. + echo "[ Transfer Agent ] [ INFO ] Ensuring remote directory '$DESTINATION_PATH' exists..." + if [ -n "$SSH_KEY" ]; then + ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no -p "$SSH_PORT" \ + "$SSH_USER@$SSH_IP" "mkdir -p $DESTINATION_PATH" >/dev/null 2>&1 + MKRC=$? + else + expect -c " + log_user 0 + set timeout 5 + spawn ssh -o StrictHostKeyChecking=no -p $SSH_PORT $SSH_USER@$SSH_IP mkdir -p $DESTINATION_PATH + expect { + \"*?assword:\" { + send -- \"$SSHPASS\r\" + exp_continue + } + eof { + exit [lindex [wait] 3] + } + } + " >/dev/null 2>&1 + MKRC=$? + fi + + if [ $MKRC -ne 0 ]; then + echo "[ Transfer Agent ] [ ERROR ] Failed to create remote directory. Aborting." + exit 1 + fi + + # --------------------------------------------- + # STEP 2: Copy only the contents of local “volume-backup” into that folder. + echo "[ Transfer Agent ] [ INFO ] Initiating file transfer..." + + # Capture any SCP stderr in a temp file so we can surface it if something goes wrong + SCP_LOG="$(mktemp)" + if [ -n "$SSH_KEY" ]; then + # Suppress stdout, capture only stderr + scp -i "$SSH_KEY" -o StrictHostKeyChecking=no -P "$SSH_PORT" -r \ + "$SOURCE_PATH"/. "$SSH_USER@$SSH_IP:$DESTINATION_PATH" > /dev/null 2> "$SCP_LOG" + SCP_RC=$? + else + expect -c " + log_user 0 + set timeout -1 + spawn scp -o StrictHostKeyChecking=no -P $SSH_PORT -r $SOURCE_PATH/. $SSH_USER@$SSH_IP:$DESTINATION_PATH + expect { + \"*?assword:\" { + send -- \"$SSHPASS\r\" + exp_continue + } + eof { + exit [lindex [wait] 3] + } + } + " 2> "$SCP_LOG" + SCP_RC=$? + fi + + if [ $SCP_RC -eq 0 ]; then + echo "[ Transfer Agent ] [ SUCCESS ] Transfer completed." + rm -f "$SCP_LOG" + exit 0 + else + echo "[ Transfer Agent ] [ ERROR ] Transfer failed." + while IFS= read -r line; do + echo "[ Transfer Agent ] $line" + done < "$SCP_LOG" + rm -f "$SCP_LOG" + exit 1 + fi + ``` + +3. **Adjust** the variables at the top (`SSH_IP`, `SSH_USER`, `SSH_KEY`, `DESTINATION_PATH`) to match your new server. +4. **Run** the transfer: + + ```bash + ./transfer.sh + ``` + + * If key-based authentication succeeds, the backup folder copies over via SCP. + * Otherwise, you’ll be prompted for the SSH password. + +--- + +## 5. Restore the Backup on the New Server + + + + + In this example, we’ll use [Umami Analytics](https://umami.is/?utm_source=coolify.io) (PostgreSQL) to show how you restore a database-backed app. Adjust paths and volume names for your own database. + + + + +1. **Deploy your application** on the new server with Coolify, then **stop it** so volumes will be created but won't be in use. +2. **SSH into** the new server and **create** a script called `restore.sh`: + + ```bash + touch restore.sh && chmod +x restore.sh + ``` +3. **Paste** the following into `restore.sh`: + ```bash + #!/bin/bash + + # === VOLUME NAME INPUT === + # Prompt for the target Docker volume name to restore into + read -p "[ Restore Agent ] [ INPUT ] Enter the target Docker volume name to restore into: " TARGET_VOLUME + + # === VOLUME CHECK === + # Check if the target volume exists + if ! docker volume ls --quiet | grep -q "^$TARGET_VOLUME$"; then + echo "[ Restore Agent ] [ ERROR ] Volume '$TARGET_VOLUME' doesn't exist." + + # Ask if the user wants to create the volume + read -p "[ Restore Agent ] [ INPUT ] Do you want to create a new volume with the name '$TARGET_VOLUME'? (y/N): " create_volume + if [[ "$create_volume" == "y" ]]; then + echo "[ Restore Agent ] [ INFO ] Creating volume '$TARGET_VOLUME'..." + docker volume create "$TARGET_VOLUME" || { + echo "[ Restore Agent ] [ ERROR ] Failed to create volume '$TARGET_VOLUME', aborting restore." + echo "[ Restore Agent ] [ ERROR ] Restore Failed!" + exit 1 + } + echo "[ Restore Agent ] [ INFO ] Volume '$TARGET_VOLUME' created successfully." + else + echo "[ Restore Agent ] [ INFO ] Volume '$TARGET_VOLUME' doesn't exist and user opted not to create it. Aborting restore." + echo "[ Restore Agent ] [ ERROR ] Restore Failed!" + exit 1 + fi + else + echo "[ Restore Agent ] [ INFO ] Volume '$TARGET_VOLUME' exists, continuing..." + fi + + # === BACKUP DIRECTORY INPUT === + # Prompt for the backup directory (default: ./volume-backup) + read -p "[ Restore Agent ] [ INPUT ] Enter the backup directory (default: ./volume-backup): " BACKUP_DIR + BACKUP_DIR=${BACKUP_DIR:-./volume-backup} + + # === BACKUP DIRECTORY CHECK === + # Check if the backup directory exists + if [[ ! -d "$BACKUP_DIR" ]]; then + echo "[ Restore Agent ] [ ERROR ] Backup directory not found: $BACKUP_DIR" + echo "[ Restore Agent ] [ ERROR ] Restore Failed!" + exit 1 + fi + echo "[ Restore Agent ] [ INFO ] Backup directory '$BACKUP_DIR' found, continuing..." + + # === BACKUP FILE INPUT === + # Prompt for the backup file name + read -p "[ Restore Agent ] [ INPUT ] Enter the backup file name (e.g., abc123_postgresql.tar.gz): " BACKUP_FILE + + # === BACKUP FILE CHECK === + # Check if the backup file exists + if [[ ! -f "$BACKUP_DIR/$BACKUP_FILE" ]]; then + echo "[ Restore Agent ] [ ERROR ] Backup file not found: $BACKUP_DIR/$BACKUP_FILE" + echo "[ Restore Agent ] [ ERROR ] Restore Failed!" + exit 1 + fi + echo "[ Restore Agent ] [ INFO ] Backup file '$BACKUP_FILE' found, continuing..." + + # === SAFETY CONFIRMATION === + echo "[ Restore Agent ] [ INFO ] Make sure containers using '$TARGET_VOLUME' are stopped!" + read -p "[ Restore Agent ] [ INPUT ] Proceed with restore? (y/N): " confirm + if [[ "$confirm" != "y" ]]; then + echo "[ Restore Agent ] [ ERROR ] Restore Failed: cancelled by user." + exit 1 + fi + + # === RESTORE START === + # Inform the user that restore is starting + echo "[ Restore Agent ] [ INFO ] Restoring $BACKUP_FILE into volume: $TARGET_VOLUME" + + # Run the Docker container to restore the backup + docker run --rm \ + -v "$TARGET_VOLUME":/volume \ + -v "$(pwd)/$BACKUP_DIR":/backup \ + busybox \ + sh -c "cd /volume && tar xzf /backup/$BACKUP_FILE" || { + # If the restore process fails, print an error message and exit + echo "[ Restore Agent ] [ ERROR ] Docker restore process failed, aborting." + echo "[ Restore Agent ] [ ERROR ] Restore Failed!" + exit 1 + } + + # If everything succeeds, notify the user + echo "[ Restore Agent ] [ SUCCESS ] Restore completed!" + ``` + +4. **Run** the script: + + ```bash + ./restore.sh + ``` + + * Enter the **volume name** (from `docker volume ls` command or Coolify's Persistent Storage page). + * Press **Enter** to accept `./volume-backup`, or type a custom backup path. + * Enter the backup filename (e.g., `umami_postgresql-backup.tar.gz`). + * Confirm you want to proceed by typing `y`. + +--- + +## 6. Start Your Application +Once the restore finishes, go to Coolify’s dashboard and click **Deploy**. + +Your application should now use the migrated data. If it does not, or if logs show errors then repeat the restore step to ensure all files copied correctly. + + + + + If the database credentials (username, database name or password) are different on the new server, update them in Coolify’s dashboard to match those from the old server. + + + + + diff --git a/content/docs/knowledge-base/how-to/ollama-with-gpu.mdx b/content/docs/knowledge-base/how-to/ollama-with-gpu.mdx new file mode 100644 index 00000000..cc9f7483 --- /dev/null +++ b/content/docs/knowledge-base/how-to/ollama-with-gpu.mdx @@ -0,0 +1,30 @@ +--- +title: "Ollama with GPU" +description: "Self-host Ollama LLM with NVIDIA GPU acceleration on Coolify including hardware requirements, Docker configuration, and model management setup." +--- + +# Ollama with GPU +Based on the detailed guide from [geek.sg](https://geek.sg/blog/how-i-self-hosted-llama-32-with-coolify-on-my-home-server-a-step-by-step-guide?ref=coolify.io): + +1. **Hardware Requirements** + - A server with NVIDIA GPU (tested with RTX 3060 12GB) + - Minimum 32GB RAM recommended + - Sufficient storage space for models + +2. **Software Setup** + - Install NVIDIA drivers + - Install NVIDIA Container Toolkit + - Configure Docker to use NVIDIA runtime + +3. **Coolify Configuration** + - Deploy Ollama through Coolify's one-click installer + - Modify the Docker compose configuration to include GPU support + - Add required environment variables for GPU acceleration + +4. **Model Management** + - Pull and manage your preferred LLM models + - Monitor GPU usage and performance + - Adjust model parameters as needed + +For the complete detailed guide, visit the [original article](https://geek.sg/blog/how-i-self-hosted-llama-32-with-coolify-on-my-home-server-a-step-by-step-guide?ref=coolify.io). + diff --git a/content/docs/knowledge-base/how-to/private-npm-registry.mdx b/content/docs/knowledge-base/how-to/private-npm-registry.mdx new file mode 100644 index 00000000..a21c5e63 --- /dev/null +++ b/content/docs/knowledge-base/how-to/private-npm-registry.mdx @@ -0,0 +1,22 @@ +--- +title: "Private NPM Registry" +description: "Use private NPM registries with Coolify deployments by configuring .npmrc authentication tokens and build environment variables." +--- + +# Private NPM Registry +If you would like to use a private NPM registry with Coolify, you can do so by following the steps below. + + +1. Add `.npmrc` file to your project root with the following content: + +```bash +//registry.npmjs.org/:_authToken=${NPM_TOKEN} +``` + +2. Add the following environment variables to your project as a `build` variable: + +```bash +NPM_TOKEN=your_npm_token +``` + +3. Deploy your application. diff --git a/content/docs/knowledge-base/how-to/raspberry-pi-os.mdx b/content/docs/knowledge-base/how-to/raspberry-pi-os.mdx new file mode 100644 index 00000000..695e7641 --- /dev/null +++ b/content/docs/knowledge-base/how-to/raspberry-pi-os.mdx @@ -0,0 +1,69 @@ +--- +title: "Raspberry Pi OS Setup Guide" +description: "Install Coolify on Raspberry Pi with 64-bit OS setup guide covering Pi Zero 2 W, Pi 3, 4, and 5 models with SSH configuration." +--- + +# Raspberry Pi OS Setup Guide +## Prerequisites + +To run Coolify on a Raspberry Pi, you will need one of the following Raspberry Pi models: + - Raspberry Pi Zero 2 W + - Raspberry Pi 400 + - Raspberry Pi 3 (all models) + - Raspberry Pi 4 (all models) + - Raspberry Pi 5 (all models) + +## Installation + +1. Download and install the [Raspberry Pi Imager](https://www.raspberrypi.com/software/) on your computer. + +2. Insert your microSD card into your computer's card reader. + +3. Open Raspberry Pi Imager and select your device: + - Click `Choose Device` + - Select your Raspberry Pi model + +4. Select the Operating System: + - Click `Choose OS` + - Navigate to `Raspberry Pi OS (other)` + - Select `Raspberry Pi OS Lite (64-bit)` + + + + + You must select one of the 64-bit OS versions as Coolify is not compatible with 32-bit versions. + + + + + + + + While you can use the full desktop version `Raspberry Pi OS (64-bit)`/`Raspberry Pi OS Full (64-bit)` or even `Ubuntu`, we recommend the `Raspberry Pi OS Lite` version as it uses fewer resources. + + + + +5. Choose your Storage: + - Click `Choose Storage` + - Select your microSD card + - Double-check you've selected the correct drive to avoid data loss + +6. Click `Next` and select `Edit settings` for OS Customization. + - Navigate to `Services` and enable SSH with a public key. + + + + + The SSH key must not have a passphrase or 2FA enabled, otherwise you will not be able to complete the onboarding process. + + + + + - Configure other options as needed + +7. Finish the installation onto the SD card. + +8. Once complete, insert the microSD card into your Raspberry Pi and power it on. + +9. After your Raspberry Pi boots up, proceed with the [Coolify installation](/get-started/installation#quick-installation-recommended). diff --git a/content/docs/knowledge-base/how-to/webstudio-with-hetzner.mdx b/content/docs/knowledge-base/how-to/webstudio-with-hetzner.mdx new file mode 100644 index 00000000..d2bb2e9b --- /dev/null +++ b/content/docs/knowledge-base/how-to/webstudio-with-hetzner.mdx @@ -0,0 +1,143 @@ +--- +title: Deploy Webstudio Projects to Hetzner with Coolify +description: Complete guide to deploying Webstudio projects with Coolify on Hetzner servers using Docker, GitHub integration, and automated deployment. +--- + +# Deploy Webstudio Projects using Coolify + +Coolify makes deploying your Webstudio projects to Hetzner as simple as it is powerful. + +In this guide, you’ll learn how to set up your project, deploy it on a Hetzner server, and keep your infrastructure fully under your control, all with a few straightforward steps. + + + + +In this guide, we are using servers from Hetzner. + +However, if you're using a different hosting provider, you can still follow this guide with their servers as well. + +If you prefer watching a video instead of reading, you can check out the [tutorial video](https://youtu.be/OnHLO2Plt2E?si=yDM77oK7Xd5UsRSP) + + + + +## What You’ll Need + +Before you start, make sure you have: + +- A [GitHub account](https://github.com?utm_source=coolify.io) to host your code. +- A [Hetzner account](https://coolify.io/hetzner) to provision your server (or an account with any other hosting provider). +- The [Webstudio CLI](https://docs.webstudio.is/university/self-hosting/cli?utm_source=coolify.io) installed locally to manage your project exports. + +## 1. Create Your GitHub Repository + +Start by [creating a new repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository) on GitHub where you’ll store your Webstudio project code. + +Once the repository is created, [clone the repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) to your local machine to start developing locally. + +## 2. Export Your Webstudio Project + +Using the Webstudio [CLI](https://docs.webstudio.is/university/self-hosting/cli), export your project and select the "**Docker**" option. + +This prepares your project for deployment via Coolify without the need for additional dependency installations. + +## 3. Push Your Code to GitHub + +With your project exported locally, [push your code](https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository) to the GitHub repository you created. This makes your project accessible for deployment. + +## 4. Set Up Your Hetzner Server + + + + +If you already have a server, you don't need to purchase a new one. + +**Webstudio recommends** that your server should have at least **1 CPU and 2GB of RAM** for smooth operation. + +Skip to [Step 6](#_6-configure-your-project-on-coolify) if your server is already connected to Coolify. + + + +Follow these steps to prepare your Hetzner server: + +1. **Create a New Server:** Log into [Hetzner Cloud Dashboard ↗](https://console.hetzner.cloud/) and create a new server. + + +1. **Choose Your Region:** Select the region that best suits your needs. + + +1. **Select Ubuntu:** Pick an Ubuntu image (make sure it’s a Docker-supported version, check the [Docker Ubuntu requirements](https://docs.docker.com/engine/install/ubuntu/#os-requirements)). + + +1. **Configure Resources:** A shared CPU with at least 2 GB RAM is recommended. + + +1. **Allocate an IPv4 Address:** Make sure your server has a dedicated IPv4 address. + + + +1. **Finalize Setup:** Click **Create and Buy Now** and wait until your server is provisioned. + +1. **Save the IP:** Copy your server’s IPv4 address, it will be needed shortly. + +## 5. Connect Coolify to Your Server + + + + +If your server is already connected to Coolify, skip to the [next step](#_6-configure-your-project-on-coolify). + + + + +1. **Add Private Key:** Login to your Coolify account (or create one if you’re new) and Add a new private key + +
+ + +2. **Add a Server:** Navigate to the **Servers** tab and add a new server by entering your Hetzner server’s IPv4 address. + +
+ + +3. **Validate Server:** Click **Validate Server & Install Docker Engine**. Coolify will automatically install all necessary components on your server. + + +4. **Check Status:** Once finished, you should see a green **Proxy Running** status indicating everything is set up. + + +## 6. Configure Your Project on Coolify +1. **Create a New Project:** Head to the **Projects** section and create a new project. + +2. **Add a Resource:** Add a new resource, selecting your GitHub repository as the source. + +3. **Connect Your Repository:** Use the GitHub app integration to grant access to your repository. + + +4. **Select Build Pack:** Change the Build Pack to **Dockerfile** and click on continue button. + + +5. **Configure Domains & Deploy:** Enter your domain in the domains field and Click **Deploy** and wait as Coolify builds and deploys your project. + + +6. **Successful Deployment:** When deployment is complete, you’ll see a “Deployment is Finished” message. + +7. **Access Your Site:** Use the **links** button at the top of the project dashboard to visit your live site. + + +8. **Optional – Third-Party Domains:** If your project loads images from external sources, add those domains as a comma-separated list under the environment variable `DOMAINS`. (make sure to restart the application after adding the variable) + + +## 7. Update Your Webstudio Site + +To publish updates and keep your site up to date, follow these steps: + +1. **Publish Changes:** In the Webstudio builder, click **Publish** to generate the latest build data. +2. **Sync and Build:** Run the following commands in your terminal: + ```bash + webstudio sync + webstudio build --template docker + ``` +3. **Push Updates:** Commit and push your changes to GitHub. Coolify will detect the update and automatically trigger a new deployment. + +Now you’re all set! diff --git a/content/docs/knowledge-base/how-to/wordpress-multisite.mdx b/content/docs/knowledge-base/how-to/wordpress-multisite.mdx new file mode 100644 index 00000000..034edb43 --- /dev/null +++ b/content/docs/knowledge-base/how-to/wordpress-multisite.mdx @@ -0,0 +1,38 @@ +--- +title: "Using WordPress Multisite with Coolify" +description: "Configure WordPress Multisite in Coolify with subdomain or subdirectory setup, persistent storage, and network configuration" +--- + + +# Using WordPress Multisite with Coolify + +1. Add WordPress with one-click installation + Add a WordPress service with the one-click installation feature in Coolify. + +2. Persist WordPress files on the host machine + Change the following lines in your `docker-compose.yml` file from the UI to persist the WordPress files on the host machine: + ```yaml + volumes: + - "wordpress-files:/var/www/html" + ``` + to: + ```yaml + volumes: + - "./wordpress:/var/www/html" + ``` + This will mount the `wordpress` directory in the default configuration directory (`/data/coolify/services//`) to the `/var/www/html` directory in the container. This way, you can edit the files on your host machine and see the changes reflected in the container. + +3. Configure WordPress + Start the Wordpress service and configure it as you wish. + +4. Disable all plugins + - Go to your WordPress admin panel. + - Go to `Plugins` -> `Installed Plugins`. + - Select all plugins and choose `Deactivate` from the dropdown menu. + +5. Enable Multisite + Open your `wp-config.php` file on the server and add the following lines: + ```php + define( 'WP_ALLOW_MULTISITE', true ); + ``` + Refresh your WordPress panel in your browser. You should now see a new menu item called `Network Setup` under the `Tools` menu. \ No newline at end of file diff --git a/content/docs/knowledge-base/index.mdx b/content/docs/knowledge-base/index.mdx new file mode 100644 index 00000000..c34068d3 --- /dev/null +++ b/content/docs/knowledge-base/index.mdx @@ -0,0 +1,17 @@ +--- +title: Overview +description: "Comprehensive Coolify knowledge base covering deployment guides, server setup, Git integration, proxy configuration, and troubleshooting resources." +--- + +# Overview + + + + + + **This Knowledge Base sections is in active development, some contents may not be up to date. They will be updated soon.** + + **Browse through the pages on the sidebar on this knowledge base section for more information.** + + + diff --git a/content/docs/knowledge-base/internal/meta.json b/content/docs/knowledge-base/internal/meta.json new file mode 100644 index 00000000..0aa80187 --- /dev/null +++ b/content/docs/knowledge-base/internal/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Internal", + "pages": [ + "scalability", + "terminal" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/internal/scalability.mdx b/content/docs/knowledge-base/internal/scalability.mdx new file mode 100644 index 00000000..e9005434 --- /dev/null +++ b/content/docs/knowledge-base/internal/scalability.mdx @@ -0,0 +1,91 @@ +--- +title: "Scalability" +description: "Scale Coolify applications with traditional horizontal scaling across multiple servers using load balancers or Docker Swarm for high availability deployments." +--- + +# Scalability + +If your application needs load balancing or high availability here are the options you have in Coolify: + +- [Traditional Horizontal Scaling](#traditional-horizontal-scaling) +- [Docker Swarm](#docker-swarm) + + + + + You don’t need to scale your app if you have 0 users. Start simple and scale as your user base grows! + + + + +## Traditional Horizontal Scaling + +With traditional horizontal scaling, you can deploy your applications on multiple servers, and then use a load balancer to distribute the traffic across them. + +This is the most common type of scaling, and it is easy to understand and implement. + +### Coolify requirements +1. **Add servers** + - You need to add and validate the servers in Coolify. +2. **Set a Docker Registry** for your application + - **Why?** As several servers will need to access the same built image, it needs to be stored in a shared location. + +### Infrastructure requirements +1. **Load balancer** +2. **Firewall** - optional, but recommended + +### Examples + +Which one is the best? + +It depends on your needs, but we recommend the `one domain across multiple servers`. + + + + +We also recommend to use [Hetzner](https://coolify.io/hetzner) (referral link) for the servers. + +**(The cloud version of Coolify - and all of our other services - is also using Hetzner)** + + + + +#### One domain across multiple servers (Recommended) + + + +- **Pros**: + - Easy to understand and implement. + - Easy to manage. + - Easy to scale. + - No proxy required on the servers. + - Healthcheck are available for the application, not for the server - see the other option's cons. +- **Cons**: + - You need a firewall on each server to prevent the servers from being accessed directly - most VPS providers has software firewalls. + +#### Multiple domains across multiple servers (Recommended, but more complex) + + + +- **Pros**: + - Easy to understand and implement. + - Easy to manage. + - Easy to scale. + - Requires a proxy on the servers - Coolify automatically configures the proxy for you, but it is +1 component that can fail. + - "Less expensive" (as one server can host multiple applications). +- **Cons**: + - As a plus proxy is added, there is a small performance hit as the proxy needs to be initialized on each server - not noticeable for most use cases. + - You need bigger servers to host more applications, as more applications will be running on the same server. + - Healthcheck are not available for each application, only for the server. + + + +## Docker Swarm + +Coolify supports Docker Swarm (experimental). You can read more about it [here](/knowledge-base/docker/swarm). + + +## Kubernetes (planned) + +It is just planned, but not in the roadmap yet, so no ETA. +Coolify will eventually support Kubernetes. This will allow you to use the full power of Kubernetes, with the added benefit of having a web interface to manage your applications. \ No newline at end of file diff --git a/content/docs/knowledge-base/internal/terminal.mdx b/content/docs/knowledge-base/internal/terminal.mdx new file mode 100644 index 00000000..1a9bc0e6 --- /dev/null +++ b/content/docs/knowledge-base/internal/terminal.mdx @@ -0,0 +1,34 @@ +--- +title: "Terminal" +description: "Access Coolify resources through built-in web terminal with xterm.js, secure SSH connections, and Websocket communication for all containers and servers." +--- + +# Terminal + +**Coolify** provides a powerful **built-in web terminal** that offers seamless access to all your resources directly from your browser. This feature enhances your ability to manage and interact with your infrastructure efficiently. + +Key features: + +1. **Universal Access**: Available for all resources **managed by Coolify**. Any containers or servers. +2. **Supports colors, text editing, and more**: Uses [xterm.js](https://xtermjs.org/) under the hood, so you get a fully featured terminal experience. +3. **Eliminates the need for external SSH clients**: This integrated terminal eliminates the need for external SSH clients or complex connection setups, streamlining your workflow and improving productivity. + +#### Is it secure? + +Yes, it is. The terminal commands are executed within the Coolify environment and through a secure SSH connection, so you can be sure that your commands are executed securely. + +#### How to access? + +You can access the terminal from the sidebar. + +#### How does it works **exactly**? + +The terminal is a web-based interface that allows you to interact with your resources using a terminal emulator and the web-to-terminal communication is passed through a Websocket connection. + +After that, it creates a new process on the Terminal server (inside Coolify's realtime container) and connects to your main Coolify instance container, via SSH. + +But the connection is not direct, it goes first through a Websocket connection, requiring an authentication to do so, after that, the connection is established inside Coolify's main Instance (host server), to make sure that we have the permissions to access the resources. + +And then, the process inside the Coolify's main Instance container, establishes a new SSH connection to the target resource (container or server). Lets see a diagram explaining it better: + + \ No newline at end of file diff --git a/content/docs/knowledge-base/meta.json b/content/docs/knowledge-base/meta.json new file mode 100644 index 00000000..3aa1b4e6 --- /dev/null +++ b/content/docs/knowledge-base/meta.json @@ -0,0 +1,37 @@ +{ + "title": "Knowledge Base", + "pages": [ + "internal", + "---Self-hosted Instance---", + "monitoring", + "notifications", + "webhook-payloads", + "self-update", + "commands", + "delete-user", + "oauth", + "create-root-user-with-env", + "define-custom-docker-network-with-env", + "custom-docker-registry", + "custom-compose-overrides", + "change-localhost-key", + "---DNS & Domains---", + "dns-configuration", + "domains", + "destinations", + "---Resources---", + "environment-variables", + "persistent-storage", + "drain-logs", + "rolling-updates", + "health-checks", + "nodejs-multi-core-scaling", + "cron-syntax", + "how-to", + "server", + "s3", + "docker", + "proxy", + "faq" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/monitoring.mdx b/content/docs/knowledge-base/monitoring.mdx new file mode 100644 index 00000000..cc57ca9c --- /dev/null +++ b/content/docs/knowledge-base/monitoring.mdx @@ -0,0 +1,14 @@ +--- +title: Monitoring +description: "Monitor Coolify resources with built-in disk usage tracking, automatic cleanup, container status monitoring, and backup status notifications." +--- + +# Monitoring +Coolify has a built-in monitoring system, which can be used to monitor your resources and send notifications to your team if something goes wrong. + +Currently Coolify monitors the following resources: + +- Disk usage - If your disk usage is above the configured threshold, it does an automatic cleanup. +- If any of your containers are stopped or restarted. +- Backup status. + diff --git a/content/docs/knowledge-base/nodejs-multi-core-scaling.mdx b/content/docs/knowledge-base/nodejs-multi-core-scaling.mdx new file mode 100644 index 00000000..472829a1 --- /dev/null +++ b/content/docs/knowledge-base/nodejs-multi-core-scaling.mdx @@ -0,0 +1,207 @@ +--- +title: Node.js Multi-Core Scaling +description: Scale a Node.js, Bun, or Deno application across all available CPU cores using PM2 cluster mode or SO_REUSEPORT, with Dockerfile and Nixpacks examples for Coolify. +--- + +# Node.js Multi-Core Scaling + +## The Problem + +JavaScript runtimes execute their event loop on a **single thread per process**. One `node app.js` (or `bun`/`deno`) process saturates **one CPU core**, regardless of host capacity — whether it's serving HTTP, processing queues, running cron jobs, or doing CPU-bound work. + +This applies to every major JS runtime: + +| Runtime | Engine | Single-threaded event loop | +| --- | --- | --- | +| Node.js | V8 | Yes | +| Bun | JavaScriptCore | Yes | +| Deno | V8 | Yes | + +It's a runtime characteristic, not a platform limit — the same constraint applies on bare metal, Docker, Kubernetes, or any PaaS. + + + + +By default, Coolify does not limit container CPU, so all host cores are available — you only need to tell your runtime to use them. + + + + +## The Fix + +Run **multiple worker processes** inside the container. Each runtime has its preferred mechanism: + +| Runtime | Approach | Code Change | Notes | +| --- | --- | --- | --- | +| Node.js | **PM2 cluster mode** | None | Easiest; wraps your existing start command | +| Node.js | `node:cluster` module | App-level | Built-in, no extra dependency | +| Bun | `Bun.serve({ reusePort: true })` | One-line app change | Kernel load-balances via `SO_REUSEPORT` | +| Deno | `Deno.serve({ reusePort: true })` | One-line app change | Same kernel mechanism as Bun | + +This guide covers **PM2 cluster mode** (Node.js) and **`reusePort`** (Bun, Deno), with examples for the [Dockerfile](/applications/build-packs/dockerfile) and [Nixpacks](/applications/build-packs/nixpacks) build packs. + +## Technical Background + +- V8's (and JavaScriptCore's) event loop is single-threaded **per process**. +- libuv's thread pool (4 threads by default in Node) offloads some I/O work, but your JavaScript still runs on a single core. +- To use more than one core you need either multiple processes inside the container, or a runtime that supports multi-process listeners (Bun and Deno via `reusePort`). + +## Dockerfile Example (PM2 Cluster Mode) + +Use this when your app is built with the [Dockerfile build pack](/applications/build-packs/dockerfile). + +```dockerfile +FROM node:lts-alpine + +WORKDIR /app +COPY package*.json ./ +RUN npm ci --omit=dev && npm install -g pm2 + +COPY . . + +EXPOSE 3000 +CMD ["pm2-runtime", "-i", "max", "dist/index.js"] +``` + +Key points: + +- `pm2-runtime -i max` forks one worker per available CPU core and keeps PM2 in the foreground (required because Docker's PID 1 must not exit). +- Replace `dist/index.js` with your actual entry file. +- Expose the port your app listens on (`3000` here) in your platform's networking settings — in Coolify, this is the **Ports Exposes** field. + +## Nixpacks Example + +Use this when your app is built with the [Nixpacks build pack](/applications/build-packs/nixpacks). + +### Option A — Set `NIXPACKS_START_CMD` as an Environment Variable + +Set the following environment variable on your application (in Coolify: open your application → **Environment Variables**): + +``` +NIXPACKS_START_CMD=pm2-runtime -i max dist/index.js +``` + +Then add `pm2` to the `dependencies` section of `package.json` so Nixpacks installs it during the build. + +### Option B — `nixpacks.toml` in the Repo Root + +```toml +[phases.setup] +nixPkgs = ["nodejs", "pm2"] + +[start] +cmd = "pm2-runtime -i max dist/index.js" +``` + +This keeps the multi-core configuration in version control and works across local and remote builds. + +## Bun Alternative (One-Line Multi-Core) + +Bun's HTTP server can bind the same port across multiple processes using `SO_REUSEPORT`. Run N Bun processes and the kernel load-balances incoming connections between them. + +### App Code + +```js +Bun.serve({ + port: 3000, + reusePort: true, + fetch(req) { + return new Response("Hello from Bun"); + }, +}); +``` + +### Dockerfile + +```dockerfile +FROM oven/bun:alpine + +WORKDIR /app +COPY package.json bun.lock ./ +RUN bun install --production + +COPY . . + +EXPOSE 3000 +# Spawn one Bun process per available core. +CMD ["sh", "-c", "for i in $(seq 1 $(nproc)); do bun run server.js & done; wait"] +``` + +### Nixpacks (`nixpacks.toml`) + +```toml +[phases.setup] +nixPkgs = ["bun"] + +[start] +cmd = "sh -c 'for i in $(seq 1 $(nproc)); do bun run server.js & done; wait'" +``` + +Notes: + +- `reusePort: true` requires Linux kernel ≥ 3.9 (all modern distros). +- Each Bun process is independent — there's no primary/worker IPC, so use Redis or a database for shared state. +- Simpler than PM2 but has no built-in auto-restart per worker; pair with Docker's `restart: unless-stopped` (Coolify's default) for crash recovery of the parent shell. + +## Deno Alternative (One-Line Multi-Core) + +Deno's `Deno.serve` accepts the same `reusePort` flag, so you can spawn N processes that all bind the same port and let the kernel distribute connections. + +### App Code + +```ts +Deno.serve({ port: 3000, reusePort: true }, (_req) => { + return new Response("Hello from Deno"); +}); +``` + +### Dockerfile + +```dockerfile +FROM denoland/deno:alpine + +WORKDIR /app +COPY . . +RUN deno cache server.ts + +EXPOSE 3000 +# Spawn one Deno process per available core. +CMD ["sh", "-c", "for i in $(seq 1 $(nproc)); do deno run --allow-net server.ts & done; wait"] +``` + +### Nixpacks (`nixpacks.toml`) + +```toml +[phases.setup] +nixPkgs = ["deno"] + +[start] +cmd = "sh -c 'for i in $(seq 1 $(nproc)); do deno run --allow-net server.ts & done; wait'" +``` + +Same caveats as Bun apply: no IPC between processes, no built-in per-worker restart. + +## Caveats + + + + +Workers do **not** share in-process memory. Sessions, in-memory caches, rate-limit counters, and WebSocket connection maps must move to Redis or another external store. + + + + +- **WebSockets:** connections are split across workers. Use sticky sessions at the proxy layer, or move pub/sub to Redis so any worker can deliver messages. +- **Graceful shutdown:** honor `SIGTERM` in each worker. PM2 does this automatically. +- **Memory:** scales roughly linearly — N workers ≈ N × single-process RSS. Size the server accordingly. +- **Log output:** PM2 merges logs across workers; with Bun's `reusePort` approach each process writes independently, which may interleave. Prefer structured JSON logs. + +## Verifying Multi-Core Use + +After deploying, SSH to the host running the container and inspect the processes: + +```bash +docker exec -it top +``` + +You should see multiple `node`, `bun`, or `deno` processes. Hit the app under load (for example with `autocannon -c 200 http://:3000/`) and confirm that `htop`/`top` shows load spread across all host cores, not pegged on one. diff --git a/content/docs/knowledge-base/notifications.mdx b/content/docs/knowledge-base/notifications.mdx new file mode 100644 index 00000000..9fb42c43 --- /dev/null +++ b/content/docs/knowledge-base/notifications.mdx @@ -0,0 +1,297 @@ +--- +title: "Notifications" +description: "Configure multi-channel notifications in Coolify with Email, Telegram, Discord, Slack, Mattermost, Pushover, and Webhooks for deployments, backups, and server monitoring alerts." +--- + +# Notifications + +Coolify provides a robust notification system that supports multiple channels. You can configure notifications in the **Notifications** tab of your Coolify dashboard. + +## Notification Providers + +Below are guides for setting up supported notification providers in Coolify. + +### Email + + + + +Email notifications can be configured using either SMTP or Resend. + + + + +1. Navigate to **Notifications** → **Email** + +2. Choose your email provider: + - Use system wide (transactional) email settings (if you self-host Coolify, you can set this up in the Instance Settings - If you use Coolify Cloud, this is set up for you). + - SMTP Server + - Resend + +3. Configure your chosen provider: + +#### System-Wide Email Settings + +- Enable the `Use system wide (transactional) email settings` checkbox +- If you're setting this up yourself, please refer to the [SMTP Server Configuration](#smtp-server-configuration) section below for detailed settings. + +#### SMTP Server Configuration + +- Fill in the following fields: + - `From Name` - Display name for the sender + - `From Address` - Email address notifications will come from + - `Host` - SMTP server hostname (e.g., smtp.mail.com) + - `Port` - SMTP port: + - Port 587 - StartTLS port (most widely supported) + - Port 465 - TLS/SSL port (recommended for highest security) + - `Username` - SMTP authentication username + - `Password` - SMTP authentication password + - `Encryption` - Choose your encryption method: + - StartTLS - Starts unencrypted then upgrades to TLS via StartTLS (typically used with port 587) + - TLS/SSL - Uses TLS encryption from the start (typically used with port 465 - automatically puts `ssl://` in front of the host) + - None - No encryption (NOT recommended as it is highly insecure) + - `Timeout` - Connection timeout in seconds +- Enable the SMTP Server via the `Enabled` checkbox + + + + + We recommend using TLS/SSL encryption with port 465 for the most secure connection. This provides encryption from the start of the connection. + + + + + + + + Some hosting providers have specific port restrictions. For example, Hetzner blocks port 465 by default. Check with your hosting provider about port availability and any required configuration changes. + + + + +#### Resend Configuration + +- Enter your `Resend API Key` +- Enable the `Resend` checkbox + +1. Click `Send Test Email` to verify your setup + +### Telegram + +1. Initial Setup (Setup only possible on phone) + - Create a Telegram account using your phone number + - Open the Telegram app on your phone + - Go to **Settings** → **Profile** + - Set up a username (recommended) + +2. Create Your Bot + - Message [@BotFather](https://t.me/botfather) + - Send the `/newbot` command + - Follow BotFather's instructions to create your bot + - Copy the `Bot Token` when displayed + + + + + After copying your bot token, delete the message containing it from Telegram. Store the token securely as anyone with access to it can control your bot. + + + + +1. Create and add your bot to a group + - Create a new group in Telegram + - Add your bot to the group (you can add it by using the bot name chosen while creating the bot) + +2. Make the bot an admin of the group + - Click on the group name + - Locate the members list + - Click on the bot name + - Click on **Add to group or channel** + - Choose the group + - Enable the `admin` toggle + - Click on **Add bot as admin** + +3. Enable Topics (Optional, Setup only possible on phone) + - Open the group on your phone + - Tap the group name + - Tap the pencil icon (edit) + - Find and enable **Topics** (this enables threads for the group) + - You can now create topics using the 3-dot menu in the group (also works on desktop) + +4. Get Required IDs + - Visit: `https://api.telegram.org/bot{YOUR_BOT_TOKEN}/getUpdates` (Replace `{YOUR_BOT_TOKEN}` with your actual bot token) + - Send a test message in your group or thread/topic + - Find these values in the response: + - `Chat ID`: Look for `"chat": {"id": -100XXXXXXXXX,` (for groups/channels, the chat ID usually starts with `-100`) + - `Thread/Topic ID` (if using threads): Look for `"message_thread_id":XXXXX,` + +5. Configure Coolify + - Go to **Notifications** → **Telegram** + - Enter your `bot token` (from step 2) + - Enter the `chat ID` (include the `-` minus sign if present) + - Enter the `thread/topic ID` (only if you are using threads) + - Save settings + - Enable the Telegram channel + - Send a `Test notification` + + + + + Common issues: + +- Make sure the bot is an admin in the group/channel +- Include the minus sign (-) in the chat ID if present +- If `getUpdates` returns an empty response, send another message and try again +- if you can not access `getUpdates` make sure you have the correct bot token and you have replace the `{YOUR_BOT_TOKEN}` with your actual bot token (replace everything including the quotes) + + + + +### Discord + +1. Create a Discord Server and Channel + - Create a new server or use an existing one + - Create a new text channel for Coolify notifications + +2. Create a webhook + - Open Discord server settings + - Go to **Integrations** → **Webhooks** + - Click **New Webhook** + - Choose the channel you created for Coolify notifications + - Copy the `webhook URL` + +3. Configure in Coolify: + - Go to **Notifications** → **Discord** + - Paste the `webhook URL` in the Webhook URL field + - Save the settings + - Enable the Discord channel + - Send a `Test notification` + + + + + See [Discord's Webhook Guide](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks) for more detailed setup instructions. + + + + +### Slack / Mattermost + +#### Using Slack + +1. Create a Slack App + - Visit [Slack API](https://api.slack.com/apps) + - Click **Create New App** → **From scratch** + - Choose your workspace + +2. Enable webhooks: + - Go to **Incoming Webhooks** + - Toggle **Activate Incoming Webhooks** + - Click **Add New Webhook to Workspace** + - Choose a channel for Coolify notifications + - Copy the `webhook URL` + +3. Configure in Coolify: + - Go to **Notifications** → **Slack** + - Paste the `webhook URL` in the Webhook URL field + - Save the settings + - Enable the Slack channel + - Send a `Test notification` + +#### Using Slack notifications with Mattermost + +Slack webhooks in Coolify are fully compatible with Mattermost. + +1. Create an Incoming Webhook in Mattermost: + - Go to **Product Menu** → **Integrations** → **Incoming Webhooks** + - Click **Add Incoming Webhook** + - Configure the webhook (name, channel, etc.) and save + - Copy the generated webhook URL (format: `https://your-mattermost-server.com/hooks/xxx-key-xxx`) + +2. Configure in Coolify: + - Go to **Notifications** → **Slack** + - Paste the Mattermost `webhook URL` in the Webhook URL field + - Save the settings + - Enable the Slack channel + - Send a `Test notification` + +### Pushover (Push Notifications) + +1. Get User Key + - Log in or sign up at [Pushover](https://pushover.net) + - Copy your `User Key` from the top right of the page + +2. Create an Application + - Visit [Create Application](https://pushover.net/apps/build) + - Fill in application details + - Create the application + - Copy the `API Token/Key` from the top left of the page + +3. Configure in Coolify: + - Go to **Notifications** → **Pushover** + - Enter your `User Key` (from step 1) + - Enter the `API Key` from your created application (from step 2) + - Save the settings + - Enable the Pushover channel + - Send a `Test notification` + + + + + Pushover allows you to receive notifications on multiple devices including iOS, Android, and desktop. + + + + +### Webhook + +Webhook notifications allow you to send notifications to any custom endpoint that accepts HTTP requests. + +1. Configure in Coolify: + - Go to **Notifications** → **Webhook** + - Enter a `HTTP` or `HTTPS` URL in the Webhook URL field + - Save the settings + - Enable the Webhook channel + - Send a `Test notification` + +Coolify will send `POST` requests to your specified endpoint when events occur. You can use this to integrate with custom applications, automation tools, or any service that accepts webhooks. + +For the full JSON payload structure of each event, see the [Webhook Payloads](/knowledge-base/webhook-payloads) reference. + +## Notification Events + +You can configure which events trigger notifications in your notification settings: + +### Deployments + +- Deployment Success +- Deployment Failure +- Container Status Changes + +### Backups + +- Backup Success +- Backup Failure + +### Scheduled Tasks + +- Scheduled Task Success +- Scheduled Task Failure + +### Server + +- Docker Cleanup Success +- Docker Cleanup Failure +- Server Disk Usage +- Server Reachable +- Server Unreachable +- Server Patching +- Traefik Proxy Outdated + + + + + You can configure different events for each notification channel. For example, you can send deployment failure notifications to Email and successes to Slack. + + + diff --git a/content/docs/knowledge-base/oauth.mdx b/content/docs/knowledge-base/oauth.mdx new file mode 100644 index 00000000..c965a5f8 --- /dev/null +++ b/content/docs/knowledge-base/oauth.mdx @@ -0,0 +1,21 @@ +--- +title: "OAuth" +description: "Set up OAuth authentication with GitHub, GitLab, Google, Azure, or Bitbucket for secure single sign-on access to your Coolify instance." +--- + +# OAuth +You can login to coolify with email/password, or with OAuth. +Using OAuth, you can delegate authorization to get a user's email address to an external IDP provider. This lets coolify know that the user owns a specific email address associated with an existing coolify user. This is an alternative to forcing the user to provide a password to coolify to prove they own that same email address. Authorization servers supported by coolify include Azure, BitBucket, Github, Gitlab, and Google. + +## Setup OAuth + +To setup OAuth for a given IDP, you need to get a client id and a client secret from the authorization server to put into **YOUR_COOLIFY_DASHBOARD**/settings/oauth. +You'll also need to set a Redirect URI for the authorization server to send the user's data back to once they have authorized coolify to access their email address. +The Redirect URI to provide to the IDP should be in the format of **YOUR_COOLIFY_DASHBOARD**/auth/*PROVIDER*/callback for example.com : https://coolify.example.com/auth/google/callback + +- [Google OAuth](https://support.google.com/cloud/answer/6158849?hl=en) + - Authorized JavaScript origins should be **YOUR_COOLIFY_DASHBOARD** + - Authorized redirect URIs should be the redirect uri you set in **YOUR_COOLIFY_DASHBOARD**/settings/oauth for google. for example.com : https://coolify.example.com/auth/google/callback +- [Github OAuth](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) + - Homepage URL should be **YOUR_COOLIFY_DASHBOARD** + - Authorization callback URL should be the redirect uri you set in **YOUR_COOLIFY_DASHBOARD**/settings/oauth for github. for example.com : https://coolify.example.com/auth/github/callback \ No newline at end of file diff --git a/content/docs/knowledge-base/persistent-storage.mdx b/content/docs/knowledge-base/persistent-storage.mdx new file mode 100644 index 00000000..b2481555 --- /dev/null +++ b/content/docs/knowledge-base/persistent-storage.mdx @@ -0,0 +1,66 @@ +--- +title: "Persistent Storage" +description: "Configure persistent Docker volumes and bind mounts for Coolify resources to preserve data between deployments with proper path mapping and sharing options." +--- + +# Persistent Storage +You could add persistent storage to your resources, so you can preserve your data between deployments. + +This persistent storage could be different in different types of Destinations. + +## Docker Engine + +If you are using Docker Engine, persistent storage could be a `volume` or a `bind mount` (a file/directory from the host system - your server). + +### Volume + +To create a volume, you need to define: + +- `Name` of the volume. +- `Destination Path` where the volume will be mounted inside the container. + + + + + The base directory inside the container is `/app`. So if you need to store + your files under `storage` directory, you need to define `/app/storage` as the + destination path. + + + + + + + + To prevent storage overlapping between resources, Coolify automatically adds + the resource's UUID to the volume name. + + + + +### Bind Mount + +To create a bind mount, you need to define: + +- `Name` of the volume, which will be used as a reference. +- `Source Path` from the host system. **No docker volume created in this case.** +- `Destination Path` where the volume will be mounted inside the container. + + + + + The base directory inside the container is `/app`. So if you need to store + your files under `storage` directory, you need to define `/app/storage` as the + destination path. + + + + + + + + Share file between more than one container? **NOT RECOMMENDED.** + + If you mount the same file to more than one container, you will need to make sure that the proper file locking mechanism is implemented in your resources. + + diff --git a/content/docs/knowledge-base/proxy/caddy/basic-auth.mdx b/content/docs/knowledge-base/proxy/caddy/basic-auth.mdx new file mode 100644 index 00000000..dd555c7b --- /dev/null +++ b/content/docs/knowledge-base/proxy/caddy/basic-auth.mdx @@ -0,0 +1,67 @@ +--- +title: Caddy Basic Auth +description: "Add password protection to Coolify applications with Caddy basic authentication using hash-password CLI for secure credential management." +--- + +# Caddy Basic Auth + +Basic authentication provides an extra layer of security for your applications by requiring a username and password to access protected resources. + +With Coolify, you can easily integrate basic auth into your Caddy web server configuration. + +## Why Use Basic Auth with Caddy? + +1. **Enhanced Security:** Adds an extra barrier to prevent unauthorized access. +2. **Simplicity:** Straightforward configuration that integrates directly into your Caddy setup. +3. **Flexibility:** Configure different credentials for different services as needed. + +## 1. Generate a Hashed Password + +For Caddy to validate credentials securely, your password must be hashed using Caddy's built-in tool. The basic auth credential is set as: + +```bash +caddy_0.basicauth.="" +``` + +The `` **must be generated with the Caddy CLI** using the `caddy hash-password` command. + +### How to Generate a Hashed Password + +1. Open your terminal. +2. Run the following command: + + ```bash + caddy hash-password --plaintext "your_plaintext_password" + ``` + + Replace `"your_plaintext_password"` with your actual password. + +3. The output will be a hashed password that you can use directly in your Caddy configuration. + +For more details and advanced options (like choosing a different algorithm), refer to the [Caddy CLI documentation](https://caddyserver.com/docs/command-line#caddy-hash-password?utm_source=coolify.io). + +## 2. Configure Basic Auth in Coolify + +Once you have your hashed password, integrate it into your Coolify configuration. + +1. **Add the Basic Auth Entry:** + + - Add the following line to the Caddyfile of the application where you want to enable basic authentication: + ```bash + caddy_0.basicauth.="" + ``` + - Replace `` with your desired username and `` with the output from the `caddy hash-password` command: + +2. **Apply the Configuration:** + - Save your configuration changes. + - Restart your application to apply the new settings. + + + + +Make sure that your hashed password is generated **only** using the Caddy CLI. + +Using an unrecognized hash method may result in authentication failures. + + + diff --git a/content/docs/knowledge-base/proxy/caddy/dns-challenge.mdx b/content/docs/knowledge-base/proxy/caddy/dns-challenge.mdx new file mode 100644 index 00000000..adfeb4b6 --- /dev/null +++ b/content/docs/knowledge-base/proxy/caddy/dns-challenge.mdx @@ -0,0 +1,190 @@ +--- +title: "DNS Challenge" +description: "Switch Caddy from HTTP challenge to DNS challenge for ACME (Let's Encrypt) certificates — required for wildcard certs or servers without a public port 80." +--- + +# Switch Caddy to DNS Challenge + +By default, Coolify configures Caddy to obtain SSL certificates using the **HTTP challenge**, which requires port 80 to be publicly reachable. There are two common reasons to switch to the **DNS challenge** instead: + +- You want [wildcard SSL certificates](https://caddyserver.com/docs/automatic-https#wildcard-certificates) (e.g., `*.example.com`) — these *require* DNS challenge. +- Your server does not have a public port 80 (e.g., internal network, behind a firewall, or a Tailscale-only node). + +## How It Works + +Instead of proving domain ownership over HTTP, Caddy asks your DNS provider to create a temporary `TXT` record under `_acme-challenge.`. Let's Encrypt reads that record to confirm ownership, then issues the certificate. + +Unlike Traefik, **Caddy DNS provider support must be compiled into the binary**. The default `lucaslorentz/caddy-docker-proxy` image does not include any DNS provider modules, so the configuration below uses a `dockerfile_inline` build to produce the correct binary automatically — no separate build step or registry required. + +## Prerequisites + +- A domain managed by a [supported DNS provider](https://github.com/orgs/caddy-dns/repositories?utm_source=coolify.io). +- An API token / key for that provider with permission to create and delete DNS records. + +## Configuration + +Go to **Servers → your server → Proxy** and apply the changes shown below to your existing Caddy configuration. + + + + + +```bash +name: coolify-proxy +networks: + coolify: + external: true +services: + caddy: + container_name: coolify-proxy + image: 'lucaslorentz/caddy-docker-proxy:2.8-alpine' # [!code --][!code focus] + build: # [!code ++][!code focus] + dockerfile_inline: | # [!code ++][!code focus] + FROM caddy:2.9-builder AS builder # [!code ++][!code focus] + RUN xcaddy build --with github.com/lucaslorentz/caddy-docker-proxy/v2 --with github.com/caddy-dns/hetzner # [!code ++][!code focus] + FROM caddy:2.9-alpine # [!code ++][!code focus] + COPY --from=builder /usr/bin/caddy /usr/bin/caddy # [!code ++][!code focus] + CMD ["caddy", "docker-proxy"] # [!code ++][!code focus] + restart: unless-stopped + extra_hosts: + - 'host.docker.internal:host-gateway' + environment: + - CADDY_DOCKER_POLLING_INTERVAL=5s + - CADDY_DOCKER_CADDYFILE_PATH=/dynamic/Caddyfile + - HETZNER_API_TOKEN= # [!code ++][!code focus] + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + labels: + - coolify.managed=true + - coolify.proxy=true + - caddy.acme_dns=hetzner {env.HETZNER_API_TOKEN} # [!code ++][!code focus] + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/caddy/dynamic:/dynamic' + - '/data/coolify/proxy/caddy/config:/config' + - '/data/coolify/proxy/caddy/data:/data' +``` + +```bash +name: coolify-proxy +networks: + coolify: + external: true +services: + caddy: + container_name: coolify-proxy + image: 'lucaslorentz/caddy-docker-proxy:2.8-alpine' # [!code --][!code focus] + build: # [!code ++][!code focus] + dockerfile_inline: | # [!code ++][!code focus] + FROM caddy:2.9-builder AS builder # [!code ++][!code focus] + RUN xcaddy build --with github.com/lucaslorentz/caddy-docker-proxy/v2 --with github.com/caddy-dns/cloudflare # [!code ++][!code focus] + FROM caddy:2.9-alpine # [!code ++][!code focus] + COPY --from=builder /usr/bin/caddy /usr/bin/caddy # [!code ++][!code focus] + CMD ["caddy", "docker-proxy"] # [!code ++][!code focus] + restart: unless-stopped + extra_hosts: + - 'host.docker.internal:host-gateway' + environment: + - CADDY_DOCKER_POLLING_INTERVAL=5s + - CADDY_DOCKER_CADDYFILE_PATH=/dynamic/Caddyfile + - CF_API_TOKEN= # [!code ++][!code focus] + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + labels: + - coolify.managed=true + - coolify.proxy=true + - caddy.acme_dns=cloudflare {env.CF_API_TOKEN} # [!code ++][!code focus] + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/caddy/dynamic:/dynamic' + - '/data/coolify/proxy/caddy/config:/config' + - '/data/coolify/proxy/caddy/data:/data' +``` + + +```bash +name: coolify-proxy +networks: + coolify: + external: true +services: + caddy: + container_name: coolify-proxy + image: 'lucaslorentz/caddy-docker-proxy:2.8-alpine' # [!code --][!code focus] + build: # [!code ++][!code focus] + dockerfile_inline: | # [!code ++][!code focus] + FROM caddy:2.9-builder AS builder # [!code ++][!code focus] + RUN xcaddy build --with github.com/lucaslorentz/caddy-docker-proxy/v2 --with github.com/caddy-dns/route53 # [!code ++][!code focus] + FROM caddy:2.9-alpine # [!code ++][!code focus] + COPY --from=builder /usr/bin/caddy /usr/bin/caddy # [!code ++][!code focus] + CMD ["caddy", "docker-proxy"] # [!code ++][!code focus] + restart: unless-stopped + extra_hosts: + - 'host.docker.internal:host-gateway' + environment: + - CADDY_DOCKER_POLLING_INTERVAL=5s + - CADDY_DOCKER_CADDYFILE_PATH=/dynamic/Caddyfile + - AWS_ACCESS_KEY_ID= # [!code ++][!code focus] + - AWS_SECRET_ACCESS_KEY= # [!code ++][!code focus] + - AWS_REGION= # [!code ++][!code focus] + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + labels: + - coolify.managed=true + - coolify.proxy=true + - caddy.acme_dns=route53 # [!code ++][!code focus] + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/caddy/dynamic:/dynamic' + - '/data/coolify/proxy/caddy/config:/config' + - '/data/coolify/proxy/caddy/data:/data' +``` + + + + + +> For other DNS providers, find the module path at [github.com/caddy-dns](https://github.com/orgs/caddy-dns/repositories?utm_source=coolify.io), replace the `--with github.com/caddy-dns/` line in the Dockerfile, and set the appropriate environment variable and `caddy.acme_dns` label. + +Restart the proxy after saving. Caddy will build the image on first start and then use the DNS challenge to obtain and renew SSL certificates. + +## Troubleshooting + +**Certificate not issuing / DNS record not found** + +DNS propagation can be slow. You can add an explicit delay per-site by editing `/data/coolify/proxy/caddy/dynamic/Caddyfile` on your server: + +``` +your.domain.com { + tls { + dns hetzner {env.HETZNER_API_TOKEN} + propagation_delay 30s + } +} +``` + +**Rate limits** + +Let's Encrypt enforces [rate limits](https://letsencrypt.org/docs/rate-limits/?utm_source=coolify.io). While testing, switch to the staging CA to avoid burning your quota. Add this label to the proxy container: + +```yaml +- caddy.acme_ca=https://acme-staging-v02.api.letsencrypt.org/directory +``` + +Remove this label once everything works. + +**Wrong or missing DNS module** + +If Caddy starts but certificates fail with an `unknown provider` error, the DNS module was not included in the image build. Verify the `--with github.com/caddy-dns/` line in the `dockerfile_inline` matches your provider, then restart the proxy to trigger a rebuild. \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/caddy/index.mdx b/content/docs/knowledge-base/proxy/caddy/index.mdx new file mode 100644 index 00000000..67b85913 --- /dev/null +++ b/content/docs/knowledge-base/proxy/caddy/index.mdx @@ -0,0 +1,34 @@ +--- +title: "Caddy Overview" +description: "Use Caddy reverse proxy with Coolify for automatic SSL certificates, simple configuration, and HTTP/2 support as an alternative to Traefik." +--- + +# Caddy Proxy + +[Caddy](https://caddyserver.com/) is an easy-to-use, open-source web server and reverse proxy that automatically manages SSL/TLS certificates. It's known for its simplicity and automation, especially when it comes to securing your websites. + +While [Traefik](https://traefik.io/) is the default reverse proxy used in Coolify, Caddy is another option you can explore if you prefer its simplicity or unique features. + +## Why Use Caddy? + +- Caddy automatically generates and renews SSL certificates for your sites, making it extremely easy to secure your applications. +- Caddy uses a simple, declarative configuration file (Caddyfile), making it beginner-friendly. +- Caddy comes with features like reverse proxying, load balancing, HTTP/2, and more out of the box without needing extra plugins. +- If you’re looking for a proxy that “just works” with minimal configuration, Caddy can be a great choice. + +## When Not to Use Caddy? + +- If you need advanced proxying features like dynamic routing, middleware, or complex load balancing, Traefik might be a better choice. +- Since Coolify primarily uses Traefik, certain configurations in Caddy might require additional manual setup. + +## A Note from the Coolify Team + +While Caddy is a fantastic tool for certain use cases, **we highly recommend** using **Traefik** over Caddy for most Coolify setups. + +The [Core team](/get-started/team) primarily uses Traefik, and it is the default reverse proxy configured within Coolify. + +Only consider using Caddy if you're familiar with it or need specific features that Traefik cannot provide. + +At the moment, we do not have detailed guides for Caddy because it is not our primary reverse proxy, and using it may require more manual configuration. + +If you choose to use Caddy, please make sure you are comfortable with configuring it yourself. diff --git a/content/docs/knowledge-base/proxy/caddy/meta.json b/content/docs/knowledge-base/proxy/caddy/meta.json new file mode 100644 index 00000000..42411f12 --- /dev/null +++ b/content/docs/knowledge-base/proxy/caddy/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Caddy", + "pages": [ + "basic-auth", + "dns-challenge" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/meta.json b/content/docs/knowledge-base/proxy/meta.json new file mode 100644 index 00000000..1cc84797 --- /dev/null +++ b/content/docs/knowledge-base/proxy/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Proxy", + "pages": [ + "traefik", + "caddy" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/traefik/basic-auth.mdx b/content/docs/knowledge-base/proxy/traefik/basic-auth.mdx new file mode 100644 index 00000000..6f2aed12 --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/basic-auth.mdx @@ -0,0 +1,134 @@ +--- +title: "Basic Auth Middleware" +description: "Protect Coolify applications and services with Traefik basic authentication middleware using htpasswd credentials for standard and Docker Compose deployments." +--- + +# Basic Auth Middleware +The configuration is slightly different for [`Standard Applications`](#standard-applications) and [`Docker Compose based applications/one-click services`](#docker-compose-and-services). + +## Standard Applications + +```bash +traefik.http.middlewares..basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG +traefik.http.routers..middlewares= +``` + +In the example above, we are using `test` as username and `test` as password. + + + + +You most likely have a `traefik.http.middlewares` label already set. In that case, you must append the `random_unique_name` middleware to the existing value. +For example: + + ```bash + traefik.http.routers..middlewares=gzip, + ``` + + + + +Note: The `` and `` are placeholders. You need to replace them when you add them to your own labels section. +The `` is a unique name for the middleware and you need to make that up yourself. The `` +is the unique name for the router that Coolify has already generated for you. + +### An nginx Simple Web Container Example + +Let's say you have an nginx simple web container that was generated by Coolify with the following Dockerfile: +```dockerfile +FROM nginx:alpine +COPY . /usr/share/nginx/html +``` + +The `Container Labels` generated by Coolify would look like this: + +```bash +traefik.enable=true +traefik.http.middlewares.gzip.compress=true +traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.entryPoints=http +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.middlewares=redirect-to-https +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.rule=Host(`nginxsite.mysite.com`) && PathPrefix(`/`) +traefik.http.routers.http-0-wc04wo4ow4scokgsw8wow4s8.service=http-0-wc04wo4ow4scokgsw8wow4s8 +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.entryPoints=https +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.middlewares=gzip +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.rule=Host(`nginxsite.mysite.com`) && PathPrefix(`/`) +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.service=https-0-wc04wo4ow4scokgsw8wow4s8 +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.tls.certresolver=letsencrypt +traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.tls=true +traefik.http.services.http-0-wc04wo4ow4scokgsw8wow4s8.loadbalancer.server.port=80 +traefik.http.services.https-0-wc04wo4ow4scokgsw8wow4s8.loadbalancer.server.port=80 +caddy_0.encode=zstd gzip +caddy_0.handle_path.0_reverse_proxy={{upstreams 80}} +caddy_0.handle_path=/* +caddy_0.header=-Server +caddy_0.try_files={path} /index.html /index.php +caddy_0=https://nginxsite.73rdst.com +caddy_ingress_network=coolify +``` + +If you want to add basic authentication to this service, assuming you want to name your auth middleware `mybasicauth`, you could add the following label below the +first line `traefik.enable=true`: + +`traefik.http.middlewares.mybasicauth.basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG` + +Notice that `mybasicauth` has replaced the `` placeholder. In other words, you have named your own auth middleware `mybasicauth`. + +Then you need to add the middleware to the router label, and since one or more middlewares are already set, you need to append the new middleware to the existing value. + +For example you would update the current line + +`traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.middlewares=gzip` + +to: + +`traefik.http.routers.https-0-wc04wo4ow4scokgsw8wow4s8.middlewares=gzip,mybasicauth` + +Notice that in this case `` has been replaced with `https-0-wc04wo4ow4scokgsw8wow4s8` which is the unique name for the router that Coolify has already generated for you. + +Your `nginx` simple web container is protected by basic authentication. + +## Docker Compose And Services + +To add `basicauth` middleware to your service, you need to add the following labels to your `docker-compose.yml` file.: + +```yaml +services: + nginx-simple-web-container:: + image: 'nginx:alpine' + ports: + - '8080:80' + labels: + - 'traefik.http.middlewares..basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG' +``` + +You should replace the placeholders `` with a unique name for the middleware. For example, you might name it `mybasicauth`, and then +replace the placeholder with `mybasicauth`. That label would then look like this: + +```yaml +labels: + - 'traefik.http.middlewares.mybasicauth.basicauth.users=test:$2y$12$ci.4U63YX83CwkyUrjqxAucnmi2xXOIlEF6T/KdP9824f1Rf1iyNG' +``` + +We have now added `basicauth` middleware to the `nginx-simple-web-container` service. + +Your `nginx` simple web container is protected by basic authentication with a username of test and password of test. + +Note: When applying basic authentication labels, special characters like $, @, and , must be escaped to avoid parsing errors. +That is for example, enclose the label values in quotes and use a backslash (\) before special characters if you're using double quotes. + +## How to generate user/password? + +You need to set your username and password in the `basicauth.users` label. + +You can generate one with the [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) command: + +```bash +htpasswd -nbB test test +``` + +This will generate a password hash for the user `test` with the password `test`. +You can then replace `test` with the desired username and password. Then substitute the generated hash in the `basicauth.users` label above. + +Note: the `htpasswd` command is available on most Linux distributions. It is part of the `apache2-utils` package on Debian/Ubuntu and +can be found [here](https://httpd.apache.org/docs/current/programs/htpasswd.html). diff --git a/content/docs/knowledge-base/proxy/traefik/custom-middlewares/index.mdx b/content/docs/knowledge-base/proxy/traefik/custom-middlewares/index.mdx new file mode 100644 index 00000000..ab14afac --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/custom-middlewares/index.mdx @@ -0,0 +1,232 @@ +--- +title: "Custom Middlewares" +description: "Apply custom Traefik middlewares to Coolify applications and Docker Compose services for rate limiting, IP whitelisting, custom headers, and more." +--- + +# Custom Middlewares + +Traefik [middlewares](https://doc.traefik.io/traefik/middlewares/overview/?utm_source=coolify.io) let you tweak requests before they reach your application — adding headers, rate limiting, IP whitelisting, and more. + +How you apply a custom middleware in Coolify depends on your deployment type: + +- **Standard Applications** — edit the Container Labels directly. +- **Docker Compose** — use a Coolify shorthand label or define labels in your `docker-compose.yml`. + +Both approaches can reference middlewares defined **inline** (in Docker labels) or **externally** (in Traefik's [dynamic configuration](/knowledge-base/proxy/traefik/dynamic-config)). + +## Standard Applications + +For standard (non-Docker Compose) applications, you configure middlewares by editing the **Container Labels** in the Coolify UI. + +### Steps + +1. Open your application in Coolify and scroll to the **Container Labels** section. +2. Uncheck **Readonly labels** so the label textarea becomes editable. +3. Add your middleware definition label(s). For example, to add rate limiting: + + ```bash + traefik.http.middlewares.my-ratelimit.ratelimit.average=100 + traefik.http.middlewares.my-ratelimit.ratelimit.period=1m + ``` + +4. Find the existing `traefik.http.routers.https-0-.middlewares=...` line and **append** your middleware name to it: + + ```bash + traefik.http.routers.https-0-.middlewares=gzip,my-ratelimit + ``` + +5. Save and redeploy. + + + + +When you uncheck **Readonly labels**, Coolify stops auto-generating labels on deploy. You are responsible for keeping all routing labels correct. If you break the labels, your application may become unreachable. + +Use the **Reset Labels to Defaults** button to restore auto-generated labels if needed. + + + + +### Full Example + +Given Coolify generated labels like: + +```bash +traefik.enable=true +traefik.http.middlewares.gzip.compress=true +traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https +traefik.http.routers.http-0-abc123.entryPoints=http +traefik.http.routers.http-0-abc123.middlewares=redirect-to-https +traefik.http.routers.http-0-abc123.rule=Host(`app.example.com`) && PathPrefix(`/`) +traefik.http.routers.http-0-abc123.service=http-0-abc123 +traefik.http.routers.https-0-abc123.entryPoints=https +traefik.http.routers.https-0-abc123.middlewares=gzip +traefik.http.routers.https-0-abc123.rule=Host(`app.example.com`) && PathPrefix(`/`) +traefik.http.routers.https-0-abc123.service=https-0-abc123 +traefik.http.routers.https-0-abc123.tls.certresolver=letsencrypt +traefik.http.routers.https-0-abc123.tls=true +traefik.http.services.http-0-abc123.loadbalancer.server.port=3000 +traefik.http.services.https-0-abc123.loadbalancer.server.port=3000 +``` + +To add a custom headers middleware, add a definition and update the router: + +```bash +traefik.http.middlewares.security-headers.headers.browserXssFilter=true +traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true +traefik.http.middlewares.security-headers.headers.frameDeny=true +traefik.http.routers.https-0-abc123.middlewares=gzip,security-headers // [!code focus] +``` + +## Docker Compose Services + +For Docker Compose deployments, Coolify provides a **shorthand label** that automatically injects your middleware into the router chain — no need to manually edit router labels. + +### Using the Coolify Shorthand + +Add `coolify.traefik.middlewares` to your service labels: + +```yaml +services: + myapp: + image: nginx:alpine + labels: + - "traefik.http.middlewares.my-ratelimit.ratelimit.average=100" + - "traefik.http.middlewares.my-ratelimit.ratelimit.period=1m" + - "coolify.traefik.middlewares=my-ratelimit" # [!code focus] +``` + +Coolify reads this label during deployment, extracts the middleware name, and appends it to the router's middleware chain alongside built-in middlewares like `gzip`. + +For multiple middlewares, separate them with commas: + +```yaml +labels: + - "coolify.traefik.middlewares=my-ratelimit,security-headers" +``` + + + + +The `coolify.traefik.middlewares` label is consumed by Coolify during label generation and does not appear on the running container. It is a deployment-time directive, not a Docker label. + + + + +## Using External Middlewares (`@file`) + +If you have a middleware defined in Traefik's [dynamic configuration](/knowledge-base/proxy/traefik/dynamic-config), you can reference it by appending `@file` to its name. This avoids duplicating middleware definitions across multiple applications. + +### 1. Define the Middleware in Dynamic Configuration + +Go to **Server** → **Proxy** → **Dynamic Configurations** and create a new config file: + +```yaml +http: + middlewares: + my-ipallowlist: + ipAllowList: + sourceRange: + - "192.168.1.0/24" + - "10.0.0.0/8" +``` + +### 2. Reference It in Your Application + +**Standard Application** — update the router middlewares line: + +```bash +traefik.http.routers.https-0-abc123.middlewares=gzip,my-ipallowlist@file +``` + +**Docker Compose** — use the shorthand: + +```yaml +labels: + - "coolify.traefik.middlewares=my-ipallowlist@file" +``` + + + + +The `@file` suffix tells Traefik to look for the middleware in its file-based dynamic configuration rather than in Docker labels. This is the standard Traefik [provider namespace syntax](https://doc.traefik.io/traefik/providers/overview/?utm_source=coolify.io#provider-namespace). + + + + +## Common Middleware Examples + +### Rate Limiting + +See [Traefik RateLimit reference](https://doc.traefik.io/traefik/reference/routing-configuration/http/middlewares/ratelimit/?utm_source=coolify.io) for all available options. + +```bash +traefik.http.middlewares.my-ratelimit.ratelimit.average=100 +traefik.http.middlewares.my-ratelimit.ratelimit.period=1m +traefik.http.middlewares.my-ratelimit.ratelimit.burst=50 +``` + +### Custom Headers + +See [Traefik Headers reference](https://doc.traefik.io/traefik/reference/routing-configuration/http/middlewares/headers/?utm_source=coolify.io) for all available options. + +```bash +traefik.http.middlewares.security-headers.headers.browserXssFilter=true +traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true +traefik.http.middlewares.security-headers.headers.frameDeny=true +traefik.http.middlewares.security-headers.headers.stsSeconds=31536000 +traefik.http.middlewares.security-headers.headers.stsIncludeSubdomains=true +``` + +### IP Whitelisting + +See [Traefik IPAllowList reference](https://doc.traefik.io/traefik/reference/routing-configuration/http/middlewares/ipallowlist/?utm_source=coolify.io) for all available options. + +```bash +traefik.http.middlewares.my-ipwhitelist.ipallowlist.sourcerange=192.168.1.0/24,10.0.0.0/8 +``` + +### Redirects + +For www/non-www redirects and domain forwarding, see the dedicated [Redirects](/knowledge-base/proxy/traefik/redirects) guide, which also covers Coolify's built-in Direction setting. + + + + +Find more middleware examples in the official [Traefik documentation](https://doc.traefik.io/traefik/reference/routing-configuration/http/middlewares/overview?utm_source=coolify.io). + + + + +## Label Escaping + +When your middleware labels contain special characters like `$` (common in basic auth hashes), Coolify provides an **Escape special characters in labels** checkbox in the Container Labels section. + +When enabled, `$` characters are escaped to `$$` to prevent Docker from interpreting them as environment variable references. + + + + +If you use dollar signs (`$`) in label values (e.g., bcrypt hashes) and do **not** enable escaping, Docker will attempt to expand them as variables, leading to broken configurations. + + + + +## Troubleshooting + +### Middleware Not Applied + +- **Standard app**: Verify you added the middleware name to the `traefik.http.routers.*.middlewares` label. Defining the middleware alone is not enough — it must be referenced in the router. +- **Docker Compose**: Confirm the `coolify.traefik.middlewares` label is present and the middleware name matches exactly. +- Check Traefik's dashboard (if enabled) to see if the middleware is registered under your router. + +### Application Unreachable After Editing Labels + +- If you edited labels on a standard application and broke routing, use the **Reset Labels to Defaults** button, re-enable **Readonly labels**, and redeploy. +- If using Docker Compose, check your `docker-compose.yml` syntax for quoting issues. + +### `@file` Middleware Not Found + +- Ensure the dynamic config file is saved in the correct location and Traefik has reloaded it. +- Verify the middleware name in the config matches what you reference (case-sensitive). +- Check for YAML syntax errors in the dynamic config. diff --git a/content/docs/knowledge-base/proxy/traefik/custom-middlewares/meta.json b/content/docs/knowledge-base/proxy/traefik/custom-middlewares/meta.json new file mode 100644 index 00000000..c4024add --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/custom-middlewares/meta.json @@ -0,0 +1,5 @@ +{ + "pages": [ + "redirects" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/traefik/custom-ssl-certs.mdx b/content/docs/knowledge-base/proxy/traefik/custom-ssl-certs.mdx new file mode 100644 index 00000000..882ace9f --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/custom-ssl-certs.mdx @@ -0,0 +1,60 @@ +--- +title: "Custom SSL Certificates" +description: "Use custom SSL certificates with Traefik proxy in Coolify including self-signed certificates, Let's Encrypt, and public CA certificates configuration." +--- + +# Custom SSL Certificates +If you want to use custom SSL certificates with Traefik, you can easily do so by following the steps below. + +On each server, `/data/coolify/proxy` is mounted into the Coolify Proxy (Traefik) container. + +You can add your custom SSL certificates in the `/data/coolify/proxy/certs` directory. + +1. **Generate or request an SSL certificate** for your domain. It can be a + self-signed certificate, a certificate from a public CA, or a certificate + from Let's Encrypt. + + Read more [here](https://certbot.eff.org/instructions) about certbot and Let's Encrypt. + +2. **Copy the key and cert files to the server** where your resource that will use the certificate is running. + Use `scp` or any other method to copy the files. + + It should be placed under `/data/coolify/proxy` directory, for example: + + ```bash + scp /path/to/your/domain.cert root@your-server-ip:/data/coolify/proxy/certs/domain.cert + scp /path/to/your/domain.key root@your-server-ip:/data/coolify/proxy/certs/domain.key + ``` + + + + + Make sure the directory `/data/coolify/proxy/certs` exists on the server. + + + + +3. You can **configure Traefik** to use the custom SSL certificates by adding a dynamic configuration file through Coolify's UI or directly adding it to `/data/coolify/proxy/dynamic`: + + ```yaml + tls: + certificates: + - certFile: /traefik/certs/domain.cert + keyFile: /traefik/certs/domain.key + - certFile: /traefik/certs/domain2.cert + keyFile: /traefik/certs/domain2.key + ``` + + + + + `/traefik` is the directory inside `coolify-proxy` container where + `/data/coolify/proxy` is mounted. + + + + + Traefik will automatically use this certificate if it matches the domain of the incoming request and the certificate in any of the provided files. + + +For more information check Traefik's [official documentation](https://doc.traefik.io/traefik/https/tls/). diff --git a/content/docs/knowledge-base/proxy/traefik/dashboard.mdx b/content/docs/knowledge-base/proxy/traefik/dashboard.mdx new file mode 100644 index 00000000..d4551b89 --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/dashboard.mdx @@ -0,0 +1,88 @@ +--- +title: "Enable Dashboard" +description: "Enable and secure Traefik dashboard in Coolify with basic authentication, dynamic configuration, Let's Encrypt SSL, and custom domain access." +--- + +# Traefik Dashboard +By default, the Traefik dashboard is enabled in secure mode, but not configured to be accessible from the internet. + +To enable access from the internet, you need to add a dynamic configuration and secure it with a username and password. + + +## Secure mode (with Dynamic Configuration) + + + + + How to configure Traefik's dynamic configuration? [Read more](/knowledge-base/proxy/traefik/dynamic-config) + + + + + + + + Enabling dashboard will also enable traeifk API which will sit on `/api` path, protected with this `basicAuth`. This is a conflict with Coolify's own api which also sits on `/api` and uses a `Bearer token`. + If you enable the dashboard, you will be unable to use Coolify's API and will always get `401`. Disabling dashboard will help you access the API again. + + + + +You can enable Traefik's dashboard by adding the following dynamic configuration: + +```yaml +http: + middlewares: + auth: + basicAuth: + users: + - ":" + redirect-to-https: + redirectScheme: + scheme: https + + routers: + dashboard-http: + rule: Host(``) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`)) + entryPoints: + - http + service: api@internal + middlewares: + - redirect-to-https + + dashboard-https: + rule: Host(``) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`)) + entryPoints: + - https + service: api@internal + tls: + certResolver: letsencrypt + middlewares: + - auth +``` + +Replace ``, ``, and `` with your own values. + +You can reach the dashboard by visiting `https:///dashboard/#/`. + + +### How to generate user/password? +You can generate one with the [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) command: + +```bash +htpasswd -nbB test test +``` + +Example output: + +```bash +test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/ +``` + + +## Insecure Mode (Not Recommended) +If you want to enable the dashboard in insecure mode (without a password), all you need to do is go to the proxy configurations view and change the `insecure` setting to `true`, then restart the proxy.. + +```yaml +- '--api.insecure=true' +``` diff --git a/content/docs/knowledge-base/proxy/traefik/dns-challenge.mdx b/content/docs/knowledge-base/proxy/traefik/dns-challenge.mdx new file mode 100644 index 00000000..eb722cbc --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/dns-challenge.mdx @@ -0,0 +1,319 @@ +--- +title: "DNS Challenge" +description: "Switch Traefik from HTTP challenge to DNS challenge for ACME (Let's Encrypt) certificates — required for wildcard certs or servers without a public port 80." +--- + +# Switch Traefik to DNS Challenge + +By default, Coolify configures Traefik to obtain SSL certificates using the **HTTP challenge** (`httpChallenge`), which requires port 80 to be publicly reachable. There are two common reasons to switch to the **DNS challenge** (`dnsChallenge`) instead: + +- You want [wildcard SSL certificates](./wildcard-certs) (e.g., `*.example.com`) — these *require* DNS challenge. +- Your server does not have a public port 80 (e.g., internal network, behind a firewall, or a Tailscale-only node). + +## How It Works + +Instead of proving domain ownership over HTTP, Traefik asks your DNS provider to create a temporary `TXT` record under `_acme-challenge.`. Let's Encrypt reads that record to confirm ownership, then issues the certificate. Traefik (via the [Lego](https://go-acme.github.io/lego/) library) handles the whole process automatically. + +## Prerequisites + +- A domain managed by a [supported DNS provider](https://go-acme.github.io/lego/dns/index.html#dns-providers). +- An API token / key for that provider with permission to create and delete DNS records. + + + + +Each provider needs different environment variables. Open the [Lego provider list](https://go-acme.github.io/lego/dns/index.html#dns-providers), click your provider, and note the required env vars listed at the top. + + + + +## Configuration + +Go to **Servers → your server → Proxy** and replace the default Traefik configuration with the one below. + +The highlighted lines show exactly what changes from the default HTTP-challenge setup. + + + + + +```yaml +name: coolify-proxy +networks: + coolify: + external: true +services: + traefik: + container_name: coolify-proxy + image: 'traefik:v3.6' + restart: unless-stopped + environment: # [!code focus] + - HETZNER_API_TOKEN= # [!code ++][!code focus] + extra_hosts: + - 'host.docker.internal:host-gateway' + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + - '8080:8080' + healthcheck: + test: 'wget -qO- http://localhost:80/ping || exit 1' + interval: 4s + timeout: 2s + retries: 5 + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/:/traefik' + command: + - '--ping=true' + - '--ping.entrypoint=http' + - '--api.dashboard=true' + - '--api.insecure=false' + - '--entrypoints.http.address=:80' + - '--entrypoints.https.address=:443' + - '--entrypoints.http.http.encodequerysemicolons=true' + - '--entryPoints.http.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http.encodequerysemicolons=true' + - '--entryPoints.https.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http3' + - '--providers.docker.exposedbydefault=false' + - '--providers.file.directory=/traefik/dynamic/' + - '--providers.file.watch=true' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=hetzner' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json' + - '--providers.docker=true' + labels: + - traefik.enable=true + - traefik.http.routers.traefik.entrypoints=http + - traefik.http.routers.traefik.service=api@internal + - traefik.http.services.traefik.loadbalancer.server.port=8080 + - coolify.managed=true + - coolify.proxy=true +``` + +```yaml +name: coolify-proxy +networks: + coolify: + external: true +services: + traefik: + container_name: coolify-proxy + image: 'traefik:v3.6' + restart: unless-stopped + environment: # [!code focus] + - CF_DNS_API_TOKEN= # [!code ++][!code focus] + extra_hosts: + - 'host.docker.internal:host-gateway' + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + - '8080:8080' + healthcheck: + test: 'wget -qO- http://localhost:80/ping || exit 1' + interval: 4s + timeout: 2s + retries: 5 + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/:/traefik' + command: + - '--ping=true' + - '--ping.entrypoint=http' + - '--api.dashboard=true' + - '--api.insecure=false' + - '--entrypoints.http.address=:80' + - '--entrypoints.https.address=:443' + - '--entrypoints.http.http.encodequerysemicolons=true' + - '--entryPoints.http.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http.encodequerysemicolons=true' + - '--entryPoints.https.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http3' + - '--providers.docker.exposedbydefault=false' + - '--providers.file.directory=/traefik/dynamic/' + - '--providers.file.watch=true' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json' + - '--providers.docker=true' + labels: + - traefik.enable=true + - traefik.http.routers.traefik.entrypoints=http + - traefik.http.routers.traefik.service=api@internal + - traefik.http.services.traefik.loadbalancer.server.port=8080 + - coolify.managed=true + - coolify.proxy=true +``` + +```yaml +name: coolify-proxy +networks: + coolify: + external: true +services: + traefik: + container_name: coolify-proxy + image: 'traefik:v3.6' + restart: unless-stopped + environment: # [!code focus] + - AWS_ACCESS_KEY_ID= # [!code ++][!code focus] + - AWS_SECRET_ACCESS_KEY= # [!code ++][!code focus] + - AWS_REGION= # [!code ++][!code focus] + extra_hosts: + - 'host.docker.internal:host-gateway' + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + - '8080:8080' + healthcheck: + test: 'wget -qO- http://localhost:80/ping || exit 1' + interval: 4s + timeout: 2s + retries: 5 + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/:/traefik' + command: + - '--ping=true' + - '--ping.entrypoint=http' + - '--api.dashboard=true' + - '--api.insecure=false' + - '--entrypoints.http.address=:80' + - '--entrypoints.https.address=:443' + - '--entrypoints.http.http.encodequerysemicolons=true' + - '--entryPoints.http.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http.encodequerysemicolons=true' + - '--entryPoints.https.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http3' + - '--providers.docker.exposedbydefault=false' + - '--providers.file.directory=/traefik/dynamic/' + - '--providers.file.watch=true' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=route53' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json' + - '--providers.docker=true' + labels: + - traefik.enable=true + - traefik.http.routers.traefik.entrypoints=http + - traefik.http.routers.traefik.service=api@internal + - traefik.http.services.traefik.loadbalancer.server.port=8080 + - coolify.managed=true + - coolify.proxy=true +``` + +```yaml +name: coolify-proxy +networks: + coolify: + external: true +services: + traefik: + container_name: coolify-proxy + image: 'traefik:v3.6' + restart: unless-stopped + environment: # [!code focus] + - HOSTINGER_API_TOKEN= # [!code ++][!code focus] + extra_hosts: + - 'host.docker.internal:host-gateway' + networks: + - coolify + ports: + - '80:80' + - '443:443' + - '443:443/udp' + - '8080:8080' + healthcheck: + test: 'wget -qO- http://localhost:80/ping || exit 1' + interval: 4s + timeout: 2s + retries: 5 + volumes: + - '/var/run/docker.sock:/var/run/docker.sock:ro' + - '/data/coolify/proxy/:/traefik' + command: + - '--ping=true' + - '--ping.entrypoint=http' + - '--api.dashboard=true' + - '--api.insecure=false' + - '--entrypoints.http.address=:80' + - '--entrypoints.https.address=:443' + - '--entrypoints.http.http.encodequerysemicolons=true' + - '--entryPoints.http.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http.encodequerysemicolons=true' + - '--entryPoints.https.http2.maxConcurrentStreams=250' + - '--entrypoints.https.http3' + - '--providers.docker.exposedbydefault=false' + - '--providers.file.directory=/traefik/dynamic/' + - '--providers.file.watch=true' + - '--certificatesresolvers.letsencrypt.acme.httpchallenge=true' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http' # [!code --][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=hostinger' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=0' # [!code ++][!code focus] + - '--certificatesresolvers.letsencrypt.acme.storage=/traefik/acme.json' + - '--providers.docker=true' + labels: + - traefik.enable=true + - traefik.http.routers.traefik.entrypoints=http + - traefik.http.routers.traefik.service=api@internal + - traefik.http.services.traefik.loadbalancer.server.port=8080 + - coolify.managed=true + - coolify.proxy=true +``` + + + + + +> You can also use `env_file` instead of `environment` — create a `.env` file on the server and reference it. This is useful for keeping secrets out of the UI. + +> Change `--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=` to match your provider's identifier from the [Lego provider list](https://go-acme.github.io/lego/dns/index.html#dns-providers). + +Restart the proxy after making these changes. Traefik will now use the DNS challenge to obtain and renew SSL certificates. + +## Troubleshooting + +**Certificate not issuing / DNS record not found** + +DNS propagation can be slow. If the challenge fails immediately, increase `delaybeforecheck` to give your provider time to propagate the TXT record: + +``` +- '--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=30' +``` + +**CNAME records interfering with challenge** + +If your domain uses CNAME delegation and challenges fail on renewal, set this environment variable to disable CNAME following: + +```yaml +environment: + - LEGO_DISABLE_CNAME_SUPPORT=true +``` + +**Rate limits** + +Let's Encrypt enforces [rate limits](https://letsencrypt.org/docs/rate-limits/?utm_source=coolify.io). While testing, add the [staging CA](https://letsencrypt.org/docs/staging-environment/) flag to avoid burning your quota: + +``` +- '--certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory' +``` + +Remove this flag once everything works. + +## Next Steps + +Now that Traefik uses the DNS challenge, you can issue [wildcard SSL certificates](./wildcard-certs) that cover all subdomains under your domain with a single certificate. \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/traefik/dynamic-config.mdx b/content/docs/knowledge-base/proxy/traefik/dynamic-config.mdx new file mode 100644 index 00000000..f72869a9 --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/dynamic-config.mdx @@ -0,0 +1,17 @@ +--- +title: "Dynamic Configurations" +description: "Configure Traefik proxy on the fly without restarts using Coolify's dynamic configuration system for real-time middleware and routing updates." +--- + +# Dynamic Configurations +Dynamic configurations are used to configure Traefik on the fly, without restarting it. + +You can add them by going to the `Server/Proxy` view, and select `Dynamic Configurations` from the sidebar. + + + + + Some of the dynamic configurations cannot be deleted, as they required for + Coolify itself. + + diff --git a/content/docs/knowledge-base/proxy/traefik/index.mdx b/content/docs/knowledge-base/proxy/traefik/index.mdx new file mode 100644 index 00000000..2342828f --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/index.mdx @@ -0,0 +1,58 @@ +--- +title: "Traefik Overview" +description: "Configure Traefik reverse proxy in Coolify with dynamic routing, SSL management, load balancing, and dashboard monitoring for containerized applications." +--- + +# Traefik Proxy + +[Traefik](https://traefik.io/) is a modern, open-source reverse proxy and load balancer designed to handle incoming requests and route them to the appropriate services. It’s widely used in the container ecosystem, making it a perfect fit for projects running on Coolify. + +By default, Coolify uses Traefik as its proxy, enabling easy management of routing, SSL certificates, and more, without requiring deep technical expertise. + +## Why Use Traefik? + +- Dynamically manages routing between your apps and the internet. +- Integrates seamlessly with container orchestrators like Docker or Kubernetes. +- Simplifies SSL/TLS certificate management, including support for [Let's Encrypt](https://letsencrypt.org/). +- Offers advanced features like load balancing and middleware for fine-grained control. +- Comes with a built-in dashboard for monitoring routes and configurations. + +## When Not to Use Traefik? + +- If you need complete control over every aspect of your reverse proxy. +- If you prefer using another reverse proxy solution like [NGINX](https://nginx.org/en/). +- If you have highly customized or complex routing rules that Traefik might not fully support. + +## Ways to Use Traefik with Coolify + +Coolify automatically configures Traefik as your proxy. However, you can customize and extend Traefik's functionality based on your needs. + +Below are some of the key features and ways you can use Traefik with Coolify: + +1. [Basic Authentication](/knowledge-base/proxy/traefik/basic-auth) -> Add username and password protection to your applications. + +2. [Custom SSL Certificates](/knowledge-base/proxy/traefik/custom-ssl-certs) -> Use your own SSL certificates instead of automatically generated ones. + +3. [Dashboard](/knowledge-base/proxy/traefik/dashboard) -> Enable Traefik’s built-in dashboard for real-time monitoring and insights. + +4. [Custom Middlewares](/knowledge-base/proxy/traefik/custom-middlewares) -> Apply custom Traefik middlewares like rate limiting, IP whitelisting, redirects, custom headers, and more. + +5. [Dynamic Configuration](/knowledge-base/proxy/traefik/dynamic-config) -> Manage dynamic configuration changes like routing rules or middlewares. + +6. [Health Checks](/knowledge-base/health-checks) -> Configure health checks to ensure your applications are running smoothly. + +7. [Load Balancing](/knowledge-base/proxy/traefik/load-balancing) -> Distribute traffic across multiple app instances for better performance. + +8. [Wildcard Certificates](/knowledge-base/proxy/traefik/wildcard-certs) -> Secure multiple subdomains with a single SSL certificate. + +--- + + + + + **Do not make changes to Traefik's configuration unless you are sure of what you are doing. Incorrect settings can make your entire application inaccessible..** + +**We highly recommend testing any changes in a development environment before applying them to production.** + + + diff --git a/content/docs/knowledge-base/proxy/traefik/load-balancing.mdx b/content/docs/knowledge-base/proxy/traefik/load-balancing.mdx new file mode 100644 index 00000000..e665f81e --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/load-balancing.mdx @@ -0,0 +1,176 @@ +--- +title: "Load-balancing" +description: "Configure Traefik load balancing in Coolify across multiple servers or containers with dynamic configuration, HTTPS support, and health monitoring." +--- + +# Load-balancing +You can easily use Traefik to loadbalance an application between: + +- 2+ servers +- 2+ containers in one server + +## 2+ servers + +### Prerequisites + +1. Make sure you set the right DNS record for your domain. Your loadbalanced domain should point to the server's IP address where you are setting up the loadbalancer. +2. You must deploy your application to more than one servers: read more [here](/knowledge-base/server/multiple-servers). +3. Make sure Traefik is running on all servers. +4. Set your `fqdn` to the fqdn you would like to use to reach your application. +5. After your application is deployed on all servers, you need to make a dynamic configuration for Traefik to loadbalance between your servers in the `/data/coolify/proxy/dynamic` directory. + +### Dynamic Configuration + +On your Coolify's UI, you can go the your Server settings / Proxy tab where you can add the dynamic configuration. + +The following configuration is valid if you would like to use https. + +```yaml +http: + middlewares: + redirect-to-https: + redirectscheme: + scheme: https + gzip: + compress: true + routers: + lb-http: + middlewares: + - redirect-to-https + entryPoints: + - http + service: noop + # Change to your domain, like `example.com` without `https://` + rule: Host(``) + lb-https: + middlewares: + - gzip + entryPoints: + - https + service: lb-https + tls: + certResolver: letsencrypt + # Change to your domain, like `example.com` without `https://` + rule: Host(``) + services: + lb-https: + loadBalancer: + servers: + # Change to your servers IP addresses + - url: 'http://' + - url: 'http://' + # Add any number of servers you want to loadbalance between + noop: + loadBalancer: + servers: + - url: '' +``` + +The following configuration is valid if you would like to use http. + +```yaml +http: + middlewares: + gzip: + compress: true + routers: + lb-http: + middlewares: + - gzip + entryPoints: + - http + service: lb-http + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + services: + lb-http: + loadBalancer: + servers: + # Change to your servers IP addresses + - url: 'http://' + - url: 'http://' + # Add any number of servers you want to loadbalance between +``` + +## 2+ containers in one server + +### Prerequisites + +1. Make sure you set the right DNS record for your domain. Your loadbalanced domain should point to the server's IP address where you are setting up the loadbalancer. +2. You must deploy your application to more than one containers in one server. +3. Make sure Traefik is running on the server. + +### Dynamic Configuration + +The following configuration is valid if you would like to use https. + +```yaml +http: + middlewares: + redirect-to-https: + redirectscheme: + scheme: https + gzip: + compress: true + routers: + lb-https: + tls: + certResolver: letsencrypt + middlewares: + - gzip + entryPoints: + - https + service: lb-https + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + lb-http: + middlewares: + - redirect-to-https + entryPoints: + - http + service: noop + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + services: + lb-https: + loadBalancer: + servers: + # Change : to your containers UUID or host.docker.internal and port + # UUID is when you mapped a port to the host system + # host.docker.internal is when you are not exposed any port to the host system + - url: 'http://:' + - url: 'http://:' + # Add any number of containers you want to loadbalance between + noop: + loadBalancer: + servers: + - url: '' +``` + +The following configuration is valid if you would like to use http. + +```yaml +http: + middlewares: + gzip: + compress: true + routers: + lb-http: + middlewares: + - gzip + entryPoints: + - http + service: lb-http + # Change to your domain, like `example.com` without `http://` + rule: Host(``) + services: + lb-http: + loadBalancer: + servers: + # Change : to your containers UUID or host.docker.internal and port + # UUID is when you mapped a port to the host system + # host.docker.internal is when you are not exposed any port to the host system + - url: 'http://:' + - url: 'http://:' + # Add any number of containers you want to loadbalance between +``` diff --git a/content/docs/knowledge-base/proxy/traefik/meta.json b/content/docs/knowledge-base/proxy/traefik/meta.json new file mode 100644 index 00000000..3b0d2f88 --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/meta.json @@ -0,0 +1,14 @@ +{ + "title": "Traefik", + "pages": [ + "basic-auth", + "custom-ssl-certs", + "dashboard", + "custom-middlewares", + "dynamic-config", + "load-balancing", + "dns-challenge", + "wildcard-certs", + "protect-services-with-authentik" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/traefik/protect-services-with-authentik.mdx b/content/docs/knowledge-base/proxy/traefik/protect-services-with-authentik.mdx new file mode 100644 index 00000000..51e0f75b --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/protect-services-with-authentik.mdx @@ -0,0 +1,68 @@ +--- +title: "Authentik Forward Authentication Middleware" +description: "Secure Coolify services with Authentik SSO forward authentication using Traefik middleware for proxy provider single sign-on protection." +--- + + +# Authentik Forward Authentication Middleware +Traefik enables you to secure your applications with authentication by using a [Proxy Provider](https://docs.goauthentik.io/docs/add-secure-apps/providers/proxy/). +This allows you to protect your services with Single Sign-On (SSO). + +## Configure an Authentik Application and Proxy Provider + +The first step is to deploy the [Authentik service](/services/authentik) and then configure the required components: + +- Create a Proxy Provider with forward authentication. +- Create an application and assign the Proxy Provider you created. +- In the "Cookie Domain" field, add the domain of the services. + +## Create the Traefik Configuration + +The next step is to add the Traefik middleware configuration to your instance's dynamic configuration. + +Replace `AUTHENTIK_SERVER_HOST` with your instance name, e.g., `authentik-server-ncoc0ooog0ckwc0gwgoocgs8`. + +```yaml +http: + middlewares: + authentik-auth: + forwardAuth: + address: 'http://AUTHENTIK_SERVER_HOST:9000/outpost.goauthentik.io/auth/traefik' + trustForwardHeader: true + authResponseHeaders: + - X-authentik-username + - X-authentik-groups + - X-authentik-entitlements + - X-authentik-email + - X-authentik-name + - X-authentik-uid + - X-authentik-jwt + - X-authentik-meta-jwks + - X-authentik-meta-outpost + - X-authentik-meta-provider + - X-authentik-meta-app + - X-authentik-meta-version +``` + +## Protecting Services + +To protect a service, the Traefik middleware label must be added to the container's Docker Compose configuration: + +```yaml +services: + privatebin: + image: privatebin/nginx-fpm-alpine + environment: + - SERVICE_FQDN_PRIVATEBIN_8080 + volumes: + - 'privatebin_data:/srv/data' + healthcheck: + test: + - CMD-SHELL + - 'wget -qO- http://127.0.0.1:8080/' + interval: 5s + timeout: 20s + retries: 10 + labels: + - traefik.http.middlewares.authentik-auth@file +``` \ No newline at end of file diff --git a/content/docs/knowledge-base/proxy/traefik/redirects.mdx b/content/docs/knowledge-base/proxy/traefik/redirects.mdx new file mode 100644 index 00000000..2836ec0e --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/redirects.mdx @@ -0,0 +1,150 @@ +--- +title: "Redirects" +description: "Configure Traefik URL redirects in Coolify including www to non-www, domain forwarding, and HTTPS redirections for applications and services." +--- + +# Redirects with Traefik + +This guide covers how to configure URL redirects in Coolify with Traefik, including the built-in redirect settings and manual middleware configuration. + +## Built-in www / non-www Redirect + +Coolify has a built-in **Direction** setting for www and non-www redirects. When **Readonly labels** is enabled (the default), you can select the redirect behavior from the application settings without editing labels manually. + +The available options are: + +| Direction | Behavior | +|-----------|----------| +| **Allow both** | No redirect. Both `www.` and non-`www.` URLs work. | +| **Redirect to www** | Redirects non-www requests to the `www.` variant. | +| **Redirect to non-www** | Redirects `www.` requests to the non-www variant. | + + + + +To use this setting, make sure both URLs are configured for your application (e.g., `https://coolify.io,https://www.coolify.io`) and **Readonly labels** is enabled. + + + + + + + +When **Readonly labels** is disabled, the Direction field becomes read-only because Coolify can no longer auto-generate the redirect labels. In that case, follow the manual configuration below. + + + + +## Manual Redirect Configuration + +For custom redirects — or when Readonly labels is disabled — you configure redirects using Traefik's `redirectregex` middleware in your Container Labels. + +The setup differs slightly between [Standard Applications](#standard-applications) and [Docker Compose](#docker-compose-and-services) deployments. + +### Standard Applications + +You need to set both URLs for your resource (e.g., `https://coolify.io,https://www.coolify.io`), then add the middleware and reference it in the router. + +#### www -> non-www + +```bash +# Define the redirect middleware +traefik.http.middlewares.example-redirect.redirectregex.regex=^(http|https)://www\.(.+) +traefik.http.middlewares.example-redirect.redirectregex.replacement=${1}://${2} +traefik.http.middlewares.example-redirect.redirectregex.permanent=true + +# Add it to the router (append to existing middlewares) +traefik.http.routers..middlewares=gzip,example-redirect +``` + +#### non-www -> www + +```bash +# Define the redirect middleware +traefik.http.middlewares.example-redirect.redirectregex.regex=^(http|https)://(?:www\.)?(.+) +traefik.http.middlewares.example-redirect.redirectregex.replacement=${1}://www.${2} +traefik.http.middlewares.example-redirect.redirectregex.permanent=true + +# Add it to the router (append to existing middlewares) +traefik.http.routers..middlewares=gzip,example-redirect +``` + + + + +The `` is the router name Coolify generated for you (e.g., `https-0-wc04wo4ow4scokgsw8wow4s8`). Find it in your existing Container Labels. + + + + +#### Domain -> Other Domain + +```bash +traefik.http.middlewares.redirect-otherdomain.redirectregex.regex=^(https?://)?source-domain\.com(.*) +traefik.http.middlewares.redirect-otherdomain.redirectregex.replacement=https://target-domain.com${2} +traefik.http.middlewares.redirect-otherdomain.redirectregex.permanent=true +``` + +If you also need to generate an SSL certificate for the source domain, add a router entry for it: + +```bash +traefik.http.routers.redirect-otherdomain.middlewares=redirect-to-https,redirect-otherdomain +traefik.http.routers.redirect-otherdomain.rule=Host(`source-domain.com`) && PathPrefix(`/`) +traefik.http.routers.redirect-otherdomain.entryPoints=https +traefik.http.routers.redirect-otherdomain.tls.certresolver=letsencrypt +traefik.http.routers.redirect-otherdomain.tls=true +``` + +### Docker Compose and Services + +For Docker Compose deployments, define the middleware labels in your `docker-compose.yml` and use the `coolify.traefik.middlewares` shorthand to attach them to the router automatically. + +Make sure both URLs are set for your resource (e.g., `https://coolify.io,https://www.coolify.io`). + +#### www -> non-www + +```yaml +labels: + - "traefik.http.middlewares.example-redirect.redirectregex.regex=^(http|https)://www\\.(.+)" + - "traefik.http.middlewares.example-redirect.redirectregex.replacement=$${1}://$${2}" + - "traefik.http.middlewares.example-redirect.redirectregex.permanent=true" + - "coolify.traefik.middlewares=example-redirect" +``` + +#### non-www -> www + +```yaml +labels: + - "traefik.http.middlewares.example-redirect.redirectregex.regex=^(http|https)://(?:www\\.)?(.+)" + - "traefik.http.middlewares.example-redirect.redirectregex.replacement=$${1}://www.$${2}" + - "traefik.http.middlewares.example-redirect.redirectregex.permanent=true" + - "coolify.traefik.middlewares=example-redirect" +``` + + + + +In Docker Compose YAML, dollar signs (`$`) must be escaped as `$$` to prevent Docker from interpreting them as environment variable references. + + + + +## Debugging + +Check whether the Traefik labels were correctly applied by inspecting your container: + +```bash +# Find your container ID +docker ps + +# Inspect the container's labels +docker inspect +``` + +You can additionally check the Traefik container logs: + +```bash +docker logs -f coolify-proxy +``` + +For more details on applying custom middlewares, see the [Custom Middlewares](/knowledge-base/proxy/traefik/custom-middlewares) guide. diff --git a/content/docs/knowledge-base/proxy/traefik/wildcard-certs.mdx b/content/docs/knowledge-base/proxy/traefik/wildcard-certs.mdx new file mode 100644 index 00000000..79657a2b --- /dev/null +++ b/content/docs/knowledge-base/proxy/traefik/wildcard-certs.mdx @@ -0,0 +1,102 @@ +--- +title: "Wildcard SSL Certificates" +description: "Issue a single Let's Encrypt wildcard SSL certificate (*.example.com) with Traefik to cover every subdomain without per-resource certificate generation." +--- + +# Setup Wildcard SSL Certificates with Traefik + +A wildcard certificate (e.g. `*.coolify.io`) covers every subdomain under a single domain with one certificate. Because Traefik does not need to request a new cert for each resource, new deployments become reachable over HTTPS immediately instead of waiting for ACME issuance. + +## Prerequisites + +- Traefik must already be using the **DNS challenge** — wildcard certificates cannot be issued via the HTTP challenge. If you haven't switched yet, follow the [DNS challenge guide](./dns-challenge) first. +- A **wildcard DNS `A` record** pointing to your server, e.g. `*.coolify.io` → your server's IP. + +## Configuration + +With the DNS challenge already in place, open **Servers → your server → Proxy** and add the three highlighted labels to the Traefik configuration: + +```yaml +labels: + - traefik.enable=true + - traefik.http.routers.traefik.entrypoints=http + - traefik.http.routers.traefik.service=api@internal + - traefik.http.routers.traefik.tls.certresolver=letsencrypt # [!code ++] + - traefik.http.routers.traefik.tls.domains[0].main=coolify.io # [!code ++] + - traefik.http.routers.traefik.tls.domains[0].sans=*.coolify.io # [!code ++] + - traefik.http.services.traefik.loadbalancer.server.port=8080 + - coolify.managed=true + - coolify.proxy=true +``` + +These labels tell Traefik to request a single certificate whose SAN covers both the apex (`coolify.io`) and the wildcard (`*.coolify.io`). Replace `coolify.io` with your own domain. + +Restart the proxy after saving. Once the certificate is issued, you have two options for applying it to your resources. + +### Normal + +Use this if each resource lives on its own subdomain and you want them all served by the single wildcard certificate. + +- In your application, set the Domain to a subdomain such as `https://example.coolify.io` and press save. + + + + + +Because the wildcard cert already covers `*.coolify.io`, Traefik reuses it for every new resource — no per-deployment ACME round trip. + +### SaaS — route every subdomain to one application + +Use this if one application should respond to *every* subdomain (for example, a multi-tenant SaaS where each tenant gets their own subdomain). + +- Leave the application's Domain field **empty**. +- Add the following custom labels: + + + + + +```bash +traefik.enable=true +traefik.http.routers..entryPoints=http +traefik.http.routers..middlewares=redirect-to-https +traefik.http.routers..rule=HostRegexp(`^.+\.coolify\.io$`) # [!code highlight] +traefik.http.routers..entryPoints=https +traefik.http.routers..middlewares=gzip +traefik.http.routers..rule=HostRegexp(`^.+\.coolify\.io$`) # [!code highlight] +traefik.http.routers..service= +traefik.http.routers..tls.certresolver=letsencrypt +traefik.http.routers..tls=true +traefik.http.services..loadbalancer.server.port=80 +``` + +```bash +traefik.enable=true +traefik.http.routers..entryPoints=http +traefik.http.routers..middlewares=redirect-to-https +traefik.http.routers..rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.coolify.io`) # [!code highlight] +traefik.http.routers..entryPoints=https +traefik.http.routers..middlewares=gzip +traefik.http.routers..rule=HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.coolify.io`) # [!code highlight] +traefik.http.routers..service= +traefik.http.routers..tls.certresolver=letsencrypt +traefik.http.routers..tls=true +traefik.http.services..loadbalancer.server.port=80 +``` + + + + + +> `.tls.certresolver` must match the resolver name in your Traefik proxy configuration — `letsencrypt` by default. + +> `.loadbalancer.server.port` must match the port your application listens on (use `80` for static deployments). + +Read more about the [HostRegexp](https://doc.traefik.io/traefik/routing/routers/#hostregexp) rule in the official Traefik documentation. + + + + +Your application or service needs to restart for domain changes to take effect. + + diff --git a/content/docs/knowledge-base/rolling-updates.mdx b/content/docs/knowledge-base/rolling-updates.mdx new file mode 100644 index 00000000..656b72b5 --- /dev/null +++ b/content/docs/knowledge-base/rolling-updates.mdx @@ -0,0 +1,48 @@ +--- +title: Rolling updates +description: "Deploy zero-downtime application updates with Coolify rolling updates using health checks, default container naming, and graceful container transitions." +--- + +# Coolify Rolling Updates +Rolling updates enable Coolify to seamlessly update your application by starting a new container and gracefully stopping the currently running container. + +This approach minimizes downtime and ensures that your service remains available during updates. + + +## How Rolling Updates Work +When a new update is initiated, Coolify launches a new container instance while the existing container continues running. + +Once the new container is confirmed healthy, the old container is stopped. This process is referred to as a *rolling update* and helps reduce service interruptions. + + +## Conditions for Rolling Updates +For rolling updates to function properly, the following conditions must be met: + +- **Health Check Configuration:** A valid health check must be configured and passing. + - The health check ensures that the new container is fully ready to handle traffic before the old container is terminated. + - Without a proper health check, the rolling update process cannot verify the container’s readiness, leading to potential failures. + +- **Default Container Naming:** Rolling updates require the use of the default container naming convention. + - If you set a custom container name, the update process may not be able to correctly manage container instances, which can prevent the rolling update from executing as expected. + +- **Shouldn’t be Docker Compose:** Rolling updates are not supported on Docker Compose-based deployments. + - Docker Compose deployments uses static container names, the update process may not be able to correctly manage container instances, which can prevent the rolling update from executing as expected. + +- **Port Mapping:** If a port is mapped to the host machine, the new container cannot bind to the same port during the update process. + - This can cause conflicts when trying to route traffic to the new container while the old one is still running, preventing the rolling update from being completed successfully. + + +## Configuring Health Checks +To ensure successful rolling updates, please verify that your application includes a health check endpoint. + +This endpoint should return a successful response (e.g., HTTP 200) when the container is operating normally. For more details on configuring health checks for your application, please refer to our [Health Check Guide](/knowledge-base/health-checks). + + +## Troubleshooting Rolling Updates +If you encounter issues with rolling updates, consider the following steps: + +1. **Verify Health Check Configuration:** Make sure that your health check endpoint is correctly implemented and returns a valid response. A failing or misconfigured health check will halt the update process. + +2. **Review Container Naming:** Confirm that you are using the default container naming convention. If a custom container name is set, rolling updates will not function as intended. + +3. **Check Logs:** Review `coolify-proxy` container or your application container logs for any error messages related to the update process. This may provide additional insights into what might be preventing the rolling update from completing successfully. diff --git a/content/docs/knowledge-base/s3/aws.mdx b/content/docs/knowledge-base/s3/aws.mdx new file mode 100644 index 00000000..ed671295 --- /dev/null +++ b/content/docs/knowledge-base/s3/aws.mdx @@ -0,0 +1,251 @@ +--- +title: Aws S3 Backup Setup +description: "Set up automated Coolify backups with AWS S3 including IAM policy creation, bucket configuration, access key setup, and cost-effective lifecycle rules." +--- + + + + +Coolify offers automated backups of your instance to an AWS S3 bucket, giving you a hands‑off, reliable way to safeguard your configuration and data. + +### Why use AWS S3 with Coolify? +1. **Enterprise‑grade durability & availability:** S3 is designed for 99.999999999% durability and automatic replication across multiple facilities, so your backups are always safe and accessible. + +2. **Cost‑effective, pay as you go pricing:** Only pay for the storage and requests you actually use, with built‑in lifecycle rules (e.g., transition to Glacier) to optimize long‑term costs. + +3. **Seamless integration** – Coolify’s backup scheduler hooks directly into S3’s API, eliminating the need for custom scripts or third‑party tools and ensuring backups run on a schedule. + + +### When to avoid using AWS S3 with Coolify? +1. **Strict data residency or on‑prem requirements:** If your regulations mandate keeping backups entirely within a private data center, S3’s public cloud model may not comply. + +2. **No external network access:** In environments where outbound internet is blocked, Coolify cannot push snapshots to an S3 endpoint. + +--- + + + + + +The following data is used as an example in this guide. Please replace it with your actual data when following the steps: + - **S3 Bucket Name:** envix-coolify-backups-s3 + - **IAM Policy Name:** EnvixCoolifyBackupS3Access + - **IAM Username:** EnvixCoolifyBackupS3User + - **Endpoint:** https://s3.ap-northeast-2.amazonaws.com + + + + +--- + + +
+TLDR (click to view) + +1. Create a bucket in AWS Console +2. Create a custom policy in AWS Console with the following permissions: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:ListBucket", + "s3:GetObject", + "s3:DeleteObject", + "s3:GetObjectAcl", + "s3:PutObjectAcl", + "s3:PutObject" + ], + "Resource": [ + // rewrite your-bucket-name with your bucket name + "arn:aws:s3:::your-bucket-name", + "arn:aws:s3:::your-bucket-name/*" + ] + } + ] +} +``` + +3. Create an IAM user in AWS Console & attach the policy from the previous step. +4. Go to User settings & create an `Access Key` in AWS Console. +5. Add the `Access Key` and `Secret Key` in Coolify when you create a new S3 source. + + + + You need to use the S3 HTTP endpoint without the bucket name, for example,`https://s3.eu-central-1.amazonaws.com`. + + + + + +## 1. Create a S3 Bucket +To create your S3 Bucket, follow these steps: + +Visit https://console.aws.amazon.com/s3 and Click on **Create Bucket** button + + + +You’ll be asked to choose a name, object ownership, and so on. + + + + + + +Leave everything else to default values, only change things if you know what you are doing. + + + + + +
+ +
+ + +Click on **Create Bucket** button + +Once the bucket is created you will be redirected to this page: + + + +## 2. Create IAM Policy +To create your IAM Policy, follow these steps: + +Visit https://console.aws.amazon.com/iam/home#/policies and Click on **Create Policy** button + +
+ + + - Click on **JSON** option and copy paste the following code on the policy editor +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:ListBucket", + "s3:GetObject", + "s3:DeleteObject", + "s3:GetObjectAcl", + "s3:PutObjectAcl", + "s3:PutObject" + ], + "Resource": [ + // replace envix-coolify-backups-s3 with your bucket name on below two lines + "arn:aws:s3:::envix-coolify-backups-s3", + "arn:aws:s3:::envix-coolify-backups-s3/*" + ] + } + ] +} +``` + +Scroll down till the bottom of the page and click on the **Continue** button. + +Then you’ll be asked to choose a name for the policy: + + +Once you have entered the name, scroll down till the bottom of the page and click on the **Continue** button. + +Once the Policy is created you will be redirected to this page: + + + + +You won't see the policy you just created, you have to search for its name on the search box. + + + + + +## 3. Create a IAM User +To create your IAM User, follow these steps: + +Visit https://console.aws.amazon.com/iam/home#/users and Click on **Create user** button + + +You’ll be asked to choose a name for the user: + + - Click on **Next** button after you have entered a name for the user. + + +1. Select Attach policies directly option +2. Select the policy we created on the previous step +3. Click on **Next** button + + + - Click on **Create user** button (you don't have to change anything on this page) + +Once the Policy is created you will be redirected to this page: + + - Click on the username to create an access key. + + +## 4. Create an Access Key +After you have clicked on the username on previous step, you will be redirected to this page: + + - Click on **Create access key** option to setup a new access key. + + + - Choose the **Other** option and click on **Continue** button + + + - Click on **Create access key** button. + + + - Save the Access Key and Secret Access Key somewhere safe and click on **Done** button + + + + You won't able able to see the access key after you click the **Done** button, so make sure to save the keys somewhere safe. + + + + + +## 5. Setup S3 in Coolify +To create your setup S3 in Coolify, follow these steps: + +In your Coolify dashboard: + + +1. Go to the **Storage** section in the sidebar. +2. Click **Add** button + + + +1. Give a name for the S3 storage (this can be any name) +2. Give a short description for the storage (optional) +3. Enter the endpoint without your bucket name: `https://s3.YOUR_REGION_NAME.amazonaws.com` +4. Enter the name of the S3 bucket you created. +5. Enter your S3 bucket's region +6. Enter your Access Key +7. Enter your Secret Access Key +8. Click on **Validate Connection & Continue** button + +Once the Bucket is validated you will be redirected to this page: + + +Then go to **settings** page and click on **Backup** + +
+ + +1. Enable S3 +2. Select your S3 storage +3. Select the frequency of the backup (you can use this [website](https://www.convertloom.com/tools/cron-job-generator) if you are new to cron) +4. Setup Backup Retentions +5. Click on **Backup Now** button (just to check if everything works) + +You can see the backups stored on your S3 from the execution logs: + + +Now you’re done! Your Coolify instance is set up to automatically backup and store them on your Aws S3 bucket safely. + + +
diff --git a/content/docs/knowledge-base/s3/introduction.mdx b/content/docs/knowledge-base/s3/introduction.mdx new file mode 100644 index 00000000..cf6a888c --- /dev/null +++ b/content/docs/knowledge-base/s3/introduction.mdx @@ -0,0 +1,31 @@ +--- +title: "Introduction" +description: "Configure S3-compatible storage for Coolify backups including AWS, DigitalOcean Spaces, MinIO, Cloudflare R2, Supabase Storage, Backblaze B2, and Scaleway Object Storage." +--- + +# S3 Introduction +Currently supported S3 compatible storages are: + +- AWS (see [the AWS guide](/knowledge-base/s3/aws)) +- DigitalOcean Spaces +- MinIO +- Cloudflare's R2 (see the [R2 guide](/knowledge-base/s3/r2)) +- Supabase Storage (see the [Supabase guide](/knowledge-base/s3/supabase)) +- Backblaze B2 +- Scaleway Object Storage +- Hetzner S3 Storage +- Wasabi hot cloud storage +- Vultr +- CloudPe Object Storage + +Other's could work, but not tested yet. If you test it, please let us know. + +## S3 Client + +Coolify uses MinIO's client, called [`mc`](https://min.io/docs/minio/linux/reference/minio-mc.html), to copy the backup files to your S3 compatible storage. + +## Verification + +To be able to use your S3 compatible storage, you need to verify it first. Verification done with `ListObjectsV2` request to your specified bucket. + +So you need to create a bucket first, and then you can verify it. diff --git a/content/docs/knowledge-base/s3/meta.json b/content/docs/knowledge-base/s3/meta.json new file mode 100644 index 00000000..1bea2ee7 --- /dev/null +++ b/content/docs/knowledge-base/s3/meta.json @@ -0,0 +1,9 @@ +{ + "title": "S3", + "pages": [ + "introduction", + "aws", + "r2", + "supabase" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/s3/r2.mdx b/content/docs/knowledge-base/s3/r2.mdx new file mode 100644 index 00000000..1085d43b --- /dev/null +++ b/content/docs/knowledge-base/s3/r2.mdx @@ -0,0 +1,21 @@ +--- +title: "Cloudflare R2" +description: "Configure Cloudflare R2 S3-compatible storage for Coolify backups with bucket creation, API token setup, and access credentials configuration." +--- + +# Cloudflare R2 +Cloudflare R2 is an S3 compatible storage. You can use it with Coolify to store your backups. + +# Configuration + +1. You need to create a bucket first in the Cloudflare R2 dashboard. +2. Then you need to create a R2 API token with `Object Read & Write` permission. +3. You can find the S3 client credentials when the token is created. + + + + You will need the `Access Key ID`, `Secret Access Key` and the `S3 endpoint` from this view. Save them. + + + +4. You can use the details from the previous step to configure Coolify. \ No newline at end of file diff --git a/content/docs/knowledge-base/s3/supabase.mdx b/content/docs/knowledge-base/s3/supabase.mdx new file mode 100644 index 00000000..649b7d8e --- /dev/null +++ b/content/docs/knowledge-base/s3/supabase.mdx @@ -0,0 +1,55 @@ +--- +title: "Supabase Storage" +description: "Configure Supabase Storage as an S3-compatible backup destination for Coolify using your project endpoint, bucket, region, and access keys." +--- + +# Supabase Storage + +Supabase Storage exposes an S3-compatible endpoint that you can use with Coolify backups. + + + + +This guide is for using a Supabase project as a remote S3 storage endpoint for Coolify backups. It is different from self-hosting the [Supabase service](/services/supabase) on Coolify. + + + + +## Configuration + +1. In Supabase, create the bucket you want to use for backups. +2. Open your project and go to **Storage** -> **S3 Configuration**. +3. Create a new access key pair. + + + + Save the `Access Key ID` and `Secret Access Key` somewhere safe. + + + +4. Copy your S3 endpoint. + - Preferred: `https://.storage.supabase.co/storage/v1/s3` + - Fallback: `https://.supabase.co/storage/v1/s3` +5. Note your project region from the Supabase dashboard. +6. In Coolify, go to **Storage** and click **Add**. +7. Fill in the fields with the values from Supabase: + - **Endpoint**: your Supabase S3 endpoint + - **Bucket**: the bucket you created in Supabase + - **Region**: your Supabase project region + - **Access Key**: your `Access Key ID` + - **Secret Key**: your `Secret Access Key` +8. Click **Validate Connection & Continue**. + + + + +Use the endpoint exactly as provided by Supabase and keep the `/storage/v1/s3` suffix. Do not append the bucket name to the endpoint. + + + + +## Verification + +Coolify verifies the connection with a `ListObjectsV2` request, so the bucket must already exist before you validate it. + +Supabase Storage is S3-compatible, but it does not support every AWS S3 feature. For Coolify backups, the endpoint, bucket, region, and access keys above are the important values. diff --git a/content/docs/knowledge-base/self-update.mdx b/content/docs/knowledge-base/self-update.mdx new file mode 100644 index 00000000..672fc427 --- /dev/null +++ b/content/docs/knowledge-base/self-update.mdx @@ -0,0 +1,38 @@ +--- +title: "Coolify Instance Updates - Self-hosted" +description: "Configure automatic Coolify updates with custom cron schedules, manual update options, and service template synchronization for self-hosted instances." +--- + +# Coolify Instance Updates - Self-hosted + +## Update Settings + +You can configure your Coolify instance's update settings on the `Settings` page under the `Update` section. + +There are two main update configurations: + +1. **Update Check Frequency** + - Controls how often Coolify checks for: + - New Coolify versions + - New Service Templates from CDN + - Default: Every hour + - Uses cron syntax + +2. **Auto Update Frequency** + - Controls when Coolify automatically installs updates + - Default: Daily at midnight (00:00) + - Uses cron syntax + +## Auto Update Toggle + +- By default, `Auto Update Enabled` is turned on for self-hosted instances +- You can disable automatic updates which is recommended for production instances. Please note that disabling `Auto Update Enabled` will not disable the update check frequency as updates should be checked periodically. +- If you disable `Auto Update Enabled`, you can still manually update Coolify by clicking the `Update` button once a new version is available. + +## Configuring Update Schedules + +Both update frequencies use cron syntax for scheduling. For detailed information about the supported cron syntax, please see our [cron syntax guide](/knowledge-base/cron-syntax). + +## Version Availability + +For details about the availability and versioning scheme of new versions please read the [RELEASE.md](https://github.com/coollabsio/coolify/blob/main/RELEASE.md) file on GitHub: \ No newline at end of file diff --git a/content/docs/knowledge-base/server/automated-cleanup.mdx b/content/docs/knowledge-base/server/automated-cleanup.mdx new file mode 100644 index 00000000..a50b7699 --- /dev/null +++ b/content/docs/knowledge-base/server/automated-cleanup.mdx @@ -0,0 +1,50 @@ +--- +title: "Automated Docker Cleanup" +description: "Prevent disk space issues with Coolify's automated Docker cleanup removing stopped containers, unused images, build cache, and volumes on schedule or threshold." +--- + +# Automated Docker Cleanup +Coolify includes an automated Docker cleanup feature to prevent servers from running out of disk space. This guide explains how to configure it and what it does. + +## Configuration + +You can configure the automated cleanup under: +`Servers` > `YOUR_SERVER` > `Configuration` > `Advanced` + +### Available Settings + +1. **Docker Cleanup Threshold** + - Sets the disk percentage threshold that triggers the cleanup. + - Example: If set to 80%, cleanup will be triggered when disk usage exceeds 80%. + +2. **Docker Cleanup Frequency** + - Schedule cleanups using [cron expressions](/knowledge-base/cron-syntax) when `Force Docker Cleanup` is enabled. + + + + +- We recommend enabling `Force Docker Cleanup` and scheduling cleanups using cron syntax. +- This provides more reliable cleanup behavior compared to relying on a disk threshold. + + + + +3. **Optional Cleanups** + - Enable unused volumes cleanup (note: this can lead to data loss). + - Enable unused networks cleanup. + +## How It Works + +### Safety Measures +- If there is an ongoing deployment, the cleanup will not be triggered to prevent any issues, like deleting the image that is currently being used. +- Only Coolify-managed resources are affected. + +### Cleanup Process +When triggered (either by schedule or disk threshold), the system performs the following actions: + +- Removes stopped containers managed by Coolify (no data loss as containers are non-persistent). +- Deletes unused Docker images. +- Clears Docker build cache. +- Removes old versions of Coolify helper images. +- Removes unused Docker volumes (if enabled). +- Removes unused Docker networks (if enabled). \ No newline at end of file diff --git a/content/docs/knowledge-base/server/build-server.mdx b/content/docs/knowledge-base/server/build-server.mdx new file mode 100644 index 00000000..e0897383 --- /dev/null +++ b/content/docs/knowledge-base/server/build-server.mdx @@ -0,0 +1,75 @@ +--- +title: Build Server +description: Set up a build server in Coolify to separate your build process from deployment, reduce load, and improve performance. +--- + + + +
+ +A build server allows you to compile your projects separately from the server that hosts your live application. + +This helps to keep the load on your hosting server low and ensures that your application's performance remains unaffected by the build process. + + +## Requirements +Before you set up a build server, make sure that: + +- The final images are pushed to a container registry. +- The build server is authenticated with the container registry. See [this guide](/knowledge-base/docker/registry) for more details. +- The build server has access to your source code. +- Docker Engine is installed on the build server. +- The build server's architecture matches that of your deployment servers. + + + + +If you have multiple build servers, Coolify will select one at random. + + + + + +## How to Use a Build Server +To start using a build server with Coolify, follow these steps: + +1. **Add a New Server to Coolify:** + In your Coolify dashboard, go to the servers page and click the **+ Add** button. + + + + - If you have already connected a server to Coolify, you can skip this step and go to the next one. + +2. **Enable the Build Server Feature:** + In the popup modal, enable the **Build Server** feature. + + + - If you have already connected your server, enable the Build Server feature as shown in the image below. + + + + + +As of **Coolify v4.0.0-beta.408** you cannot deploy any application to a server that is marked as a build server. + +If you want to deploy apps, uncheck the build server option on your server from the servers page in the Coolify dashboard. + + + + + + + +## Configuring a Resource to Use a Build Server +To assign a build server to an existing resource, follow these steps: + +1. **Go to Your Resource:** + In your Coolify dashboard, navigate to the general settings of the application you want to use the build server for. + +2. **Activate the Build Server Option:** + Under the **Build** section, enable the `Use a Build Server ?` option. + + + +3. **Set Up Your Container Registry:** + Make sure that your build server is authenticated with the container registry. See [this guide](/knowledge-base/docker/registry) for more details. diff --git a/content/docs/knowledge-base/server/firewall.mdx b/content/docs/knowledge-base/server/firewall.mdx new file mode 100644 index 00000000..e862b1e1 --- /dev/null +++ b/content/docs/knowledge-base/server/firewall.mdx @@ -0,0 +1,95 @@ +--- +title: "Firewall" +description: "Configure firewall ports for Coolify including SSH, HTTP/HTTPS, dashboard access, and terminal with ufw-docker setup for self-hosted and cloud instances." +--- + +# Firewall +Coolify requires specific network ports to be open in order to function properly across various environments. These ports enable web access, SSH connections, terminal sessions, and real-time communication. + +The required ports may vary slightly depending on whether you're using a self-hosted setup or the managed version ([Coolify Cloud](https://coolify.io/pricing/)). + + +## Coolify Self-hosted +To ensure proper functionality when self-hosting Coolify, the following ports should be opened: + +* **8000** – HTTP access to the Coolify dashboard +* **6001** – Real-time communications +* **6002** – Terminal access (Required for Coolify version 4.0.0-beta.336 and above) +* **22** – SSH access (or your custom SSH port) +* **80** – SSL certificate generation via reverse proxy (Traefik or Caddy) +* **443** – HTTPS traffic + +These ports are required if you're accessing Coolify directly using your server’s IP address (e.g., `http://:8000`). + + + + +If you're using a custom domain with Coolify’s integrated reverse proxy (Traefik or Caddy), you can safely close ports **8000**, **6001**, and **6002** after accessing the dashboard from your custom domain. + + + + + + + + If you are using `Oracle Cloud Free ARM Server`, you need to allow these ports + inside Oracle's Dashboard, otherwise you cannot reach your instance from the + internet after installation. + + + + + +## Coolify Cloud +For Servers connected to Coolify Cloud, the following ports must be open: + +* **22** – SSH access (or your custom SSH port) +* **80** – SSL certificate generation via reverse proxy (Traefik or Caddy) +* **443** – HTTPS traffic + +These are the only required ports, as all other services are managed for you by Coolify Cloud. + + + +## Closing Ports Using a Firewall +Coolify runs on Docker, which uses NAT-based iptables rules that can bypass traditional Linux firewalls like UFW. As a result, blocking ports using UFW alone will not be effective. + +### Recommended Approach +Most cloud providers offer integrated firewalls through their dashboards. If your provider supports this, **it is highly recommended to use their firewall settings** to manage open ports instead of relying on local tools like UFW. + +If your provider does not offer firewall functionality, you can use one of the following advanced methods: + +### Coolify Self-hosted + + + + Modifying firewall settings incorrectly may lead to access issues that are difficult to recover from. + + Proceed with the following steps **only if necessary**, and if you fully understand the implications. + + + + + +#### Use `ufw-docker` +[ufw-docker](https://github.com/chaifeng/ufw-docker) is a community-maintained tool that helps bridge UFW and Docker by allowing you to block specific ports effectively. Refer to the [GitHub repository](https://github.com/chaifeng/ufw-docker) for complete setup instructions + +--- + +### Coolify Cloud +For servers connected to Coolify Cloud, only the SSH port (typically **22**) needs to be open for remote management. + +If you wish to restrict access based on IP address, we have a list of public IPs used by Coolify Cloud: + +* [IPv4 addresses](https://coolify.io/ipv4.txt) +* [IPv6 addresses](https://coolify.io/ipv6.txt) + +Coolify Cloud’s IPs rarely change, but users will be notified by email if updates occur. + + +### GitHub Integration +GitHub uses webhooks to communicate with Coolify. For this to work correctly: +* Ensure **TCP ports 80 and 443** are open. +* (Optional) To restrict webhook access by IP, you can get the current list of GitHub’s outbound IPs from: https://api.github.com/meta (Check the `hooks` section) + +For more details, refer to their [documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-githubs-ip-addresses) diff --git a/content/docs/knowledge-base/server/introduction.mdx b/content/docs/knowledge-base/server/introduction.mdx new file mode 100644 index 00000000..ca50e864 --- /dev/null +++ b/content/docs/knowledge-base/server/introduction.mdx @@ -0,0 +1,109 @@ +--- +title: "Introduction" +description: "Connect localhost and remote Linux servers to Coolify with SSH authentication, Docker Engine, wildcard domains, and Traefik proxy setup." +--- +# Introduction +No matter what type of server you have (localhost or remote), you need the following requirements. +- Connectivity + - SSH connectivity between Coolify and the server with SSH key authentication. + + + + Your public key should be added to **root** user's `~/.ssh/authorized_keys`. + If you do not have an SSH Key, you can generate one through Coolify with a simple button or you can generate one manually. + + + +- Docker Engine (24+) +## Types +- **Localhost**: the server where Coolify is installed. +- **Remote Server**: could be any remote linux server. +## Localhost +To be able to manage the server where Coolify is running on, the docker container of Coolify should reach the host server through SSH. +You can use localhost as a server where all your resources are running, but it is not recommended as high server usage could prevent to use Coolify. + + + + You can use our [Cloud](https://app.coolify.io) version, so you only need a server for your resources. + + You will get a few other things included with the cloud version, like free email notifications, s3 storage, etc based on your subscription plan. + + + +## Remote Server +You can connect any type of servers to Coolify. It could be a VPS, a Raspberry PI or a laptop running Linux. + + + +If you don't have a server or server provider yet, we prefer to use Hetzner. +You can use our [referral link](https://coolify.io/hetzner). It will help us to keep the project alive. + + + +### Cloudflare Tunnels +You can also set to use Cloudflare Tunnels for your servers. + + + +Coolify does not install cloudflared on your server, it needs to be done prior. +All it does is to add the right ProxyCommand (`ProxyCommand access ssh --hostname %h`) to all ssh connections. + + + + +## Multiple Server Configuration +When setting up multiple servers in Coolify, it's important to understand how traffic routing works: + +- **Independent Proxy Handling**: Each server runs its own proxy that handles incoming requests for applications deployed on that server. +- **Direct Traffic Flow**: Traffic for applications deployed on secondary servers goes directly to those servers, not through the main Coolify server. +- **DNS Configuration**: You must point your domain DNS to the IP address of the server where the application is deployed, not to the main Coolify server. + +### Role of the Main Server +The main Coolify server: +- Provides the management UI to control applications on all connected servers +- Performs SSH connections to secondary servers for deployment and management +- Conducts health checks and monitoring +- Does NOT route or proxy traffic to applications on secondary servers + +This architecture reduces latency and improves application performance by eliminating additional network hops. + +## Features +### Disk Cleanup threshold +You can read more about Automated Cleanup and the disk cleanup threshold in the [Automated Cleanup](/knowledge-base/server/automated-cleanup) section. +### Wildcard Domain +You can set a wildcard domain (`example: http://example.com`) to your server, so you can easily assign generated domains to all the resources connected to this server. +Example: Your application UUID is `vgsco4o`. +If you have the example set, you will get the following FQDN: `http://vgsco4o.example.com` +If you do not have any wildcard domain set, Coolify will generate a [sslip.io](https://sslip.io) domain, which is free & magical domain that you can use anywhere. +In this case, it will be: `http://vgsco4o.127.0.0.1.sslip.io`, where `127.0.0.1` is your server's IP. + + + + +When using multiple servers, remember that each application's domain must point to the specific server where that application is deployed. + + + + +## Proxy +- **Traefik**: Automatically configure Traefik(v2) based on your deployed resources. +- **Custom/None**: You will configure a proxy manually (only for advanced users). + + + + Soon we will support Nginx & Caddy with fully automated configuration. + + + +### Traefik +Coolify uses Traefik proxy by default to create a reverse proxy for your resources. + + + + Traefik only starts when you did not select any proxy for your server and you + have a domain configured for a resource or your Coolify instance itself. + + + +#### Dynamic Configuration +You can always add your own configuration to the proxy settings from Coolify's UI (`/server//proxy`). diff --git a/content/docs/knowledge-base/server/meta.json b/content/docs/knowledge-base/server/meta.json new file mode 100644 index 00000000..b51f949f --- /dev/null +++ b/content/docs/knowledge-base/server/meta.json @@ -0,0 +1,17 @@ +{ + "title": "Servers", + "pages": [ + "introduction", + "automated-cleanup", + "build-server", + "firewall", + "multiple-servers", + "sentinel", + "non-root-user", + "openssh", + "oracle-cloud", + "proxies", + "patching", + "terminal-access" + ] +} \ No newline at end of file diff --git a/content/docs/knowledge-base/server/multiple-servers.mdx b/content/docs/knowledge-base/server/multiple-servers.mdx new file mode 100644 index 00000000..3ba6a93e --- /dev/null +++ b/content/docs/knowledge-base/server/multiple-servers.mdx @@ -0,0 +1,59 @@ +--- +title: "Multiple Servers" +description: "Deploy applications across multiple servers with Coolify for high availability using Docker Registry, load balancers, and synchronized deployments." +--- + +# Multiple Servers +With this feature, You could deploy the same application to multiple servers, add a load balancer in front of them and you will get a highly available application. + + + + +**This is an experimental feature.** + + + + + +## Requirements + +- Each server should be added to Coolify, validated and reachable. +- Each server (and the optional build server) should be the same architecture (AMD64, ARM). +- You must push the built image to a Docker Registry. Coolify automates the process, you just need to [login to the registry](/knowledge-base/docker/registry#docker-credentials) on the server. + +## How to use? + +When you configure (or already configured) an application, you selected a server / network where it deploys. This will be your main server. + +Any additional servers must be set in the `Servers` menu, simply by clicking on it. + +Now everytime you redeploy, restart or stop the application, the action will be done on all servers. + +If the deploy needs a build process, it will be executed on the main server (or on the build server if you have one). The deploy process will upload the built image to the Docker Registry and only after all other servers will be notified to pull and deploy this image. + +## How to configure a loadbalancer? + +At the moment, it is not automated. So you have to manually setup a loadbalancer. There are two ways to use. + +### Port mapping to host + +If you set `Ports Mappings` for your application, so one port from the docker container will mapped to a port on the host server, all you need to do is to: + +1. Set all the `IP:PORT` as a destination in your loadbalancer. +2. Remove any domains from the `Domains` field in Coolify. + +In this case, Coolify Proxy is not used as you can reach the application with IP:PORT + + + + + This is super simple and effective. But keep in mind, that you need to only allow incoming connections to the selected `PORT` from the loadbalancer, otherwise everyone can reach your application directly, without the loadbalancer. + + + + +### Using a domain + +In this case, you need to set the **loadbalancer domain with HTTP, (not HTTPS)** in the `Domains` field, and then set the proper configuration for your loadbalancer, with SSL termination. + +With this configuration, you can use several domains with one loadbalancer. \ No newline at end of file diff --git a/content/docs/knowledge-base/server/non-root-user.mdx b/content/docs/knowledge-base/server/non-root-user.mdx new file mode 100644 index 00000000..f2598ad1 --- /dev/null +++ b/content/docs/knowledge-base/server/non-root-user.mdx @@ -0,0 +1,43 @@ +--- +title: "Non-root user" +description: "Configure Coolify servers with non-root users using SSH keys and passwordless sudo permissions for secure resource management." +--- + + +# Non-root user +You could have a server with a non-root user that will manage your resources instead of the root user. + +For this to work, you need to set up the server correctly. + + + + +**This is an experimental feature.** + + + + +## Requirements + +- The non-root user needs to have the SSH key added to the server. +- Sudos permissions for the non-root user. + +## Sudo permissions + +You need to add the following lines to the `/etc/sudoers` file: + +```bash +# Allow the your-non-root-user to run commands as root without a password +your-non-root-user ALL=(ALL) NOPASSWD: ALL +``` + +This will allow the non-root user to any command as root without a password. +Note: you need to replace "your-non-root-user" with your user. + + + + + This is not the most secure way to set up a non-root user, but we will improve + this in the future, by adding more granular permissions on binaries. + + diff --git a/content/docs/knowledge-base/server/openssh.mdx b/content/docs/knowledge-base/server/openssh.mdx new file mode 100644 index 00000000..567f25ff --- /dev/null +++ b/content/docs/knowledge-base/server/openssh.mdx @@ -0,0 +1,296 @@ +--- +title: "OpenSSH" +description: "Configure OpenSSH server for Coolify with key-based authentication, proper permissions, and automated SSH setup across Ubuntu, Debian, CentOS, and Alpine Linux." +--- + +# OpenSSH +Coolify uses SSH to connect to your server and deploy your applications. This is true even when using the `localhost` server where Coolify is running. + +You have to configure SSH properly for Coolify to be able to access your servers. + +## Methods to setup +There are two ways to setup OpenSSH +- [Semi-automatic setup](#semi-automatic-setup) +- [Manual setup](#manual-setup) + + + + + The SSH key must not have a passphrase or 2FA enabled for the user used to run the Coolify installation script or the SSH connection will fail. + + + + + +## Semi-automatic setup +### 1. Install OpenSSH Server + + + + +== Debian / Ubuntu / PopOS + +```bash +apt update && apt install -y openssh-server +systemctl enable --now ssh +``` + +== CentOS / RHEL / Rocky / Fedora + +```bash +dnf install -y openssh-server +systemctl enable --now sshd +``` + +== SLES/openSUSE + +```bash +zypper install -y openssh +systemctl enable --now sshd +``` + +== Arch Linux + +```bash +pacman -Sy --noconfirm openssh +systemctl enable --now sshd +``` + +== Alpine Linux + +```bash +apk add openssh +rc-update add sshd +rc-service sshd start +``` + + + + + +### 2. Configure SSH + +1. Edit SSH config: + +```bash +nano /etc/ssh/sshd_config +``` + +2. Make these settings options: + +```bash +PubkeyAuthentication yes +PermitRootLogin prohibit-password +``` + + + + + The `PermitRootLogin` option can be set to `yes`, `without-password`, or `prohibit-password`. For enhanced security, we recommend using `prohibit-password`. + + + + + + + + Make sure to add your SSH keys to the `~/.ssh/authorized_keys` file before setting `PermitRootLogin` to `prohibit-password`, otherwise you may lock yourself out of the server. + + + + +3. Restart SSH: + + + + +== Debian / Ubuntu / PopOS + +```bash +systemctl restart ssh +```` + +== CentOS / RHEL / Rocky / Fedora / Arch / openSUSE + +```bash +systemctl restart sshd +``` + +== Alpine Linux + +```bash +rc-service sshd restart +``` + + + + + + +## Manual Setup + + + + +The following steps are handled automatically by the Coolify installation script. Manual configuration is only needed if the automatic setup fails. + + + + +### 1. Install OpenSSH Server + + + + +== Debian / Ubuntu / PopOS + +```bash +apt update && apt install -y openssh-server +systemctl enable --now ssh +``` + +== CentOS / RHEL / Rocky / Fedora + +```bash +dnf install -y openssh-server +systemctl enable --now sshd +``` + +== SLES/openSUSE + +```bash +zypper install -y openssh +systemctl enable --now sshd +``` + +== Arch Linux + +```bash +pacman -Sy --noconfirm openssh +systemctl enable --now sshd +``` + +== Alpine Linux + +```bash +apk add openssh +rc-update add sshd +rc-service sshd start +``` + + + + +### 2. Configure SSH + +1. Edit SSH config: + +```bash +nano /etc/ssh/sshd_config +``` + +2. Make these settings options: + +```bash +PubkeyAuthentication yes +PermitRootLogin prohibit-password +``` + + + + + The `PermitRootLogin` option can be set to `yes`, `without-password`, or `prohibit-password`. For enhanced security, we recommend using `prohibit-password`. + + + + + + + + Make sure to add your SSH keys to the `~/.ssh/authorized_keys` file before setting `PermitRootLogin` to `prohibit-password`, otherwise you may lock yourself out of the server. + + + + +3. Restart SSH: + + + + +== Debian / Ubuntu / PopOS + +```bash +systemctl restart ssh +```` + +== CentOS / RHEL / Rocky / Fedora / Arch / openSUSE + +```bash +systemctl restart sshd +``` + +== Alpine Linux + +```bash +rc-service sshd restart +``` + + + + +### 3. Generate SSH Key for Coolify + +Run the following commands **on the server**: +1. Generate SSH Key +```bash +ssh-keygen -t ed25519 -a 100 \ + -f /data/coolify/ssh/keys/id.root@host.docker.internal \ + -q -N "" -C root@coolify +``` + +2. Change ownership: + +```bash +chown 9999 /data/coolify/ssh/keys/id.root@host.docker.internal +``` + +### 4. Authorize the Public Key + +1. Add public key to `authorized_keys` file: +```bash +mkdir -p ~/.ssh +cat /data/coolify/ssh/keys/id.root@host.docker.internal.pub >> ~/.ssh/authorized_keys +``` + +2. Change permissions: +```bash +chmod 700 ~/.ssh +chmod 600 ~/.ssh/authorized_keys +``` + +### 5. Add private key to Coolify + +1. Copy the content of private key: +```bash +# This command will show you the content of the Private key, you have to copy the content manually +cat /data/coolify/ssh/keys/id.root@host.docker.internal +``` + +2. Login to your Coolify dashboard and Add a new private key + + + On private key input field you have to paste the private key you copied on previous step: + + +3. Navigate to the **Servers** tab and click on the `localhost` server + + +4. Navigate to "Private key" page and select the Private key you added in the previous step. + + +### 6. Validate Server +Navigate to "General" page and Click **Validate Server & Install Docker Engine**. + + +Once finished, you should see a green **Proxy Running** status indicating everything is set up. + \ No newline at end of file diff --git a/content/docs/knowledge-base/server/oracle-cloud.mdx b/content/docs/knowledge-base/server/oracle-cloud.mdx new file mode 100644 index 00000000..9584cdae --- /dev/null +++ b/content/docs/knowledge-base/server/oracle-cloud.mdx @@ -0,0 +1,29 @@ +--- +title: "Oracle Cloud" +description: "Configure Oracle Cloud free ARM servers with Coolify including root user setup, SSH configuration, firewall rules, and non-root user permissions." +--- + +# Oracle Cloud +If you are using `Oracle Cloud free ARM server`, you need to do a few extra steps to use it in Coolify, as a `Coolify instance` or just a `remote server`. + +## Normal user +Non-root user is in `experimental` mode and works with `sudo`. +- Make sure the ssh key is added to the user's `~/.ssh/authorized_keys` file. +- All configuration is set for sudo. Details [here](/knowledge-base/server/non-root-user). + +## Setup Root User + +By default, you can't login as root user. You need to do the following steps to enable root user. + +1. Switch to root user `sudo su -` +2. Edit `/etc/ssh/sshd_config` and change `PermitRootLogin` to `without-password`. +3. Restart ssh service `service sshd restart` +4. Add a public key to `/root/.ssh/authorized_keys` file which is also defined in your Coolify instance. + +## Firewall Rules + +This is only required if you self-host Coolify on Oracle ARM server. + +By default, Oracle ARM server has a firewall enabled and you need to allow some ports to use Coolify. + +For more details, check [this](/knowledge-base/server/firewall) page. \ No newline at end of file diff --git a/content/docs/knowledge-base/server/patching.mdx b/content/docs/knowledge-base/server/patching.mdx new file mode 100644 index 00000000..37b79f47 --- /dev/null +++ b/content/docs/knowledge-base/server/patching.mdx @@ -0,0 +1,96 @@ +--- +title: "Server Patching" +description: "Update server packages from Coolify dashboard with APT, DNF, and Zypper support including individual or batch updates and weekly notifications." +--- + + +# Server Patching +The **Server Patching** feature lets you update all packages on your server directly from the Coolify dashboard. + + + + +This feature is introduced in **v4.0.0-beta.419**. To follow this guide, you **must** be using v4.0.0-beta.419 or a higher version. + + + + +## How to Use Server Patching + +1. Go to the **Servers** section in the sidebar. +2. Select your server. +3. Click on the **Security** tab. +4. Open the **Server Patching** section. + +On this page, you'll see a list of all available package updates. + +You can either: + - Update packages **individually** by clicking the **Update** button next to each one. + - Or, click **Update All Packages** to apply all updates at once. + + + + + Coolify **does not** automatically install updates. It only checks for available updates and displays them in the dashboard. + + Updates are applied only when you manually click the **Update** or **Update All Packages** button. + + + + + + + +Some package updates may break existing features. +Docker-related updates will restart Docker, which means all your applications and Coolify itself will be unavailable until Docker is restarted. + +**We highly recommend you to review each package carefully before updating.** + + + + +## Server Patching Notifications +Coolify checks for updates weekly and sends notifications if any are available. + + - Notifications are **enabled by default**. + - You can manage this setting in your **Notification Settings**. + + + + +## Supported Package Managers +As of **v4.0.0-beta.419**, server patching is supported for the following package managers: + +* **APT** +* **DNF** +* **Zypper** + +Support for additional package managers will be added in future updates. + +If you'd like to prioritize support for a specific package manager, feel free to start a discussion here: [Coolify Discussions on GitHub](https://github.com/coollabsio/coolify/discussions) + +## FAQ + + +
+1. Can I change how frequently Coolify checks for updates? + +No, the update check interval is currently fixed. + +However, you can manually trigger a check by clicking the **Check now** button on the Server Patching page. + +This feature was introduced in **v4.0.0-beta.419**, and we’re focusing on improving it based on user feedback. If you'd like to request customizable check intervals, feel free to start a discussion here: [Coolify Discussions on GitHub](https://github.com/coollabsio/coolify/discussions) + +
+ + + +
+2. Does Coolify install updates automatically? + +**No**, Coolify does not install updates automatically. + +Updates are only applied when you manually click the **Update** or **Update all packages** button on the dashboard. + +
+ diff --git a/content/docs/knowledge-base/server/proxies.mdx b/content/docs/knowledge-base/server/proxies.mdx new file mode 100644 index 00000000..8099a446 --- /dev/null +++ b/content/docs/knowledge-base/server/proxies.mdx @@ -0,0 +1,31 @@ +--- +title: "Supported Proxy" +description: "Learn about Traefik and Caddy reverse proxy support in Coolify for routing traffic, SSL certificates, and load balancing with switching guide" +--- + +# Supported Proxy +Coolify supports `Traefik` (default) and `Caddy` (experimental) proxies. + +## Switch between proxies + +Since `beta.237`, we have added support for Caddy and Traefik as proxies. You can switch between them at any time. + +Before you switch proxies and if you have an application that was created before `beta.237`, you need to make sure of the following: + +1. You must have `caddy_*` or `traefik_*` labels on your resources. + + + + + If you don't have `caddy_*` or `traefik_*` labels: + + 1. Automatically: A restart of your resource will add the missing labels. + 2. Manually: + - `For Applications`: click on the `Reset to Coolify Default Labels` button. + + - `For Services`: simply save the service - it will automatically add required labels. + + + + +2. You need to restart your service so that the new labels will be applied. diff --git a/content/docs/knowledge-base/server/sentinel.mdx b/content/docs/knowledge-base/server/sentinel.mdx new file mode 100644 index 00000000..baaffc6f --- /dev/null +++ b/content/docs/knowledge-base/server/sentinel.mdx @@ -0,0 +1,62 @@ +--- +title: "Sentinel and Metrics" +description: "Monitor server and container CPU and RAM usage with Coolify's lightweight Sentinel container providing Linux API and resource metrics collection." +--- + +# Sentinel and Metrics + + + + +**This is an experimental feature.** + + + + +# Sentinel Overview + +[Sentinel](https://github.com/coollabsio/sentinel) is an open-source lightweight container that provides: +- Linux system API +- Server resource monitoring (CPU, RAM usage for now) +- Container resource monitoring (CPU, RAM usage for now) + +## Screenshot + + + +## Configuration + +### Enable Sentinel + +1. Navigate to `Servers` > `` > `Configurations` > `General` +2. Find the `Sentinel` section +3. Toggle `Enable Sentinel` +4. Wait a few moments for the container to be downloaded and start. + +### Enable Metrics (Optional) + +In the same section, you can enable metrics. Once enabled, you will be able to view the following metrics: +- CPU usage +- Memory consumption (RAM Usage) + + + + +Metrics collection is currently NOT available for Docker Compose and Service Template based deployments. + + + + +## Viewing Metrics + +### Server Metrics +Access server-wide metrics at: + +`Servers` > `` > `Configurations` > `Metrics` + +### Container Metrics +View individual container metrics: +1. Navigate to the specific resource +2. Go to the `Configurations` tab +3. Select the `Metrics` tab + diff --git a/content/docs/knowledge-base/server/terminal-access.mdx b/content/docs/knowledge-base/server/terminal-access.mdx new file mode 100644 index 00000000..9bd93ef0 --- /dev/null +++ b/content/docs/knowledge-base/server/terminal-access.mdx @@ -0,0 +1,47 @@ +--- +title: "Terminal Access" +description: "Manage terminal access for servers and containers in Coolify with admin-level controls and security permissions." +--- + +# Terminal Access +The **Terminal Access** feature allows you to enable or disable terminal access for your server and all containers running on it — directly from the Coolify dashboard. + +This feature provides centralized control over terminal access, enhancing security by allowing administrators to quickly restrict access when needed. + + + + + +This feature is introduced in **v4.0.0-beta.419**. To follow this guide, you **must** be using v4.0.0-beta.419 or a higher version. + + + + +## How to use Terminal Access + + +1. Go to the **Servers** section in the sidebar. +2. Select your server from the list. +3. Navigate to the **Security** tab. +4. Locate the **Terminal Access** section. +5. Click **Disable Terminal** button to disable terminal (or click **Enable Terminal** button if currently disabled) + + + + + +Disabling Terminal Access affects all terminals on the server and its containers. Even root and admin users will be blocked. This setting cannot be overridden per container. + + + + +## Terminal Access Permissions +As of **v4.0.0-beta.452**, only the **root user** and **admin users** have permission to modify the Terminal Access setting. + +When terminal access is disabled: +- No users can access terminals for the server +- No users can access terminals for any containers on that server +- This restriction applies even to root and admin users +- The restriction takes effect immediately + +That's it! You now have full control over terminal access for your servers and containers. diff --git a/content/docs/knowledge-base/webhook-payloads.mdx b/content/docs/knowledge-base/webhook-payloads.mdx new file mode 100644 index 00000000..33bcd97e --- /dev/null +++ b/content/docs/knowledge-base/webhook-payloads.mdx @@ -0,0 +1,414 @@ +--- +title: "Webhook Payloads" +description: "Reference for all Coolify webhook notification payloads, including application deployments, database backups, scheduled tasks, Docker cleanup, server events, and container events." +--- + +# Webhook Payloads + +This page documents the JSON payload structure for every event Coolify sends to your [webhook notification endpoint](/knowledge-base/notifications#webhook). + +All events are delivered as `HTTP POST` requests with a `Content-Type: application/json` header. Every payload includes at minimum: + +| Field | Type | Description | +|-------|------|-------------| +| `success` | boolean | `true` for success events, `false` for failure/alert events | +| `event` | string | Machine-readable event identifier | +| `message` | string | Human-readable description of the event | + +--- + +## Application + +### `deployment_success` + +Sent when an application deployment completes successfully. + +```json +{ + "success": true, + "event": "deployment_success", + "message": "New version successfully deployed", + "application_name": "my-app", + "application_uuid": "...", + "deployment_uuid": "...", + "deployment_url": "...", + "project": "...", + "environment": "...", + "fqdn": "..." +} +``` + + + + +For PR preview deployments, `fqdn` is omitted and the following fields are included instead: + +```json +{ + "pull_request_id": 123, + "preview_fqdn": "..." +} +``` + + + + +### `deployment_failed` + +Sent when an application deployment fails. + +```json +{ + "success": false, + "event": "deployment_failed", + "message": "Deployment failed", + "application_name": "my-app", + "application_uuid": "...", + "deployment_uuid": "...", + "deployment_url": "...", + "project": "...", + "environment": "...", + "fqdn": "..." +} +``` + +Same structure as `deployment_success`, with `"success": false`. PR preview fields apply in the same way. + +### `status_changed` + +Sent when an application stops unexpectedly (not via a manual stop). + +```json +{ + "success": false, + "event": "status_changed", + "message": "Application stopped", + "application_name": "my-app", + "application_uuid": "...", + "project": "...", + "environment": "...", + "fqdn": "...", + "url": "..." +} +``` + +--- + +## Database Backups + +### `backup_success` + +Sent when a database backup completes successfully. + +```json +{ + "success": true, + "event": "backup_success", + "message": "Database backup successful", + "database_name": "...", + "database_uuid": "...", + "database_type": "...", + "frequency": "...", + "url": "..." +} +``` + +### `backup_failed` + +Sent when a database backup fails. + +```json +{ + "success": false, + "event": "backup_failed", + "message": "Database backup failed", + "database_name": "...", + "database_uuid": "...", + "database_type": "...", + "frequency": "...", + "error_output": "...", + "url": "..." +} +``` + +### `backup_success_with_s3_warning` + +Sent when the local backup succeeds but uploading to S3 fails. + +```json +{ + "success": true, + "event": "backup_success_with_s3_warning", + "message": "Database backup succeeded locally, S3 upload failed", + "database_name": "...", + "database_uuid": "...", + "database_type": "...", + "frequency": "...", + "s3_error": "...", + "s3_storage_url": "...", + "url": "..." +} +``` + + + + +`s3_storage_url` is only present when the S3 storage URL is available. + + + + +--- + +## Scheduled Tasks + +### `task_success` + +Sent when a scheduled task completes successfully. + +```json +{ + "success": true, + "event": "task_success", + "message": "Scheduled task succeeded", + "task_name": "...", + "task_uuid": "...", + "output": "...", + "application_uuid": "...", + "url": "..." +} +``` + +### `task_failed` + +Sent when a scheduled task fails. + +```json +{ + "success": false, + "event": "task_failed", + "message": "Scheduled task failed", + "task_name": "...", + "task_uuid": "...", + "output": "...", + "application_uuid": "...", + "url": "..." +} +``` + + + + +`application_uuid` is included for application-level tasks. For service-level tasks, `service_uuid` is included instead. `url` is only present when available. + + + + +--- + +## Docker Cleanup + +### `docker_cleanup_success` + +Sent when a Docker cleanup job completes successfully. + +```json +{ + "success": true, + "event": "docker_cleanup_success", + "message": "Docker cleanup job succeeded", + "server_name": "...", + "server_uuid": "...", + "cleanup_message": "...", + "url": "..." +} +``` + +### `docker_cleanup_failed` + +Sent when a Docker cleanup job fails. + +```json +{ + "success": false, + "event": "docker_cleanup_failed", + "message": "Docker cleanup job failed", + "server_name": "...", + "server_uuid": "...", + "error_message": "...", + "url": "..." +} +``` + +--- + +## Server + +### `server_reachable` + +Sent when a previously unreachable server becomes reachable again. + +```json +{ + "success": true, + "event": "server_reachable", + "message": "Server revived", + "server_name": "...", + "server_uuid": "...", + "url": "..." +} +``` + +### `server_unreachable` + +Sent when Coolify cannot reach a server. + +```json +{ + "success": false, + "event": "server_unreachable", + "message": "Server unreachable", + "server_name": "...", + "server_uuid": "...", + "url": "..." +} +``` + +### `high_disk_usage` + +Sent when disk usage on a server exceeds the configured threshold. + +```json +{ + "success": false, + "event": "high_disk_usage", + "message": "High disk usage detected", + "server_name": "...", + "server_uuid": "...", + "disk_usage": 85, + "threshold": 80, + "url": "..." +} +``` + +`disk_usage` and `threshold` are integer percentages. + +### `server_patch_check` + +Sent when available OS patches are detected on a server. + +```json +{ + "success": false, + "event": "server_patch_check", + "message": "Server patches available", + "server_name": "...", + "server_uuid": "...", + "total_updates": 12, + "os_id": "ubuntu", + "package_manager": "apt", + "updates": [...], + "critical_packages_count": 2, + "url": "..." +} +``` + + + + +If the patch check itself fails, the event is `server_patch_check_error` and an `"error": "..."` field is included instead of the update fields. + + + + +### `traefik_version_outdated` + +Sent when one or more servers are running an outdated version of the Traefik proxy. + +```json +{ + "success": false, + "event": "traefik_version_outdated", + "message": "Traefik proxy outdated", + "affected_servers_count": 1, + "servers": [ + { + "name": "...", + "uuid": "...", + "current_version": "v3.1.0", + "latest_version": "v3.1.4", + "update_type": "patch_update", + "upgrade_target": "v3.2", + "newer_branch_target": "...", + "newer_branch_latest": "..." + } + ] +} +``` + +| Field | Description | +|-------|-------------| +| `update_type` | `patch_update` or `minor_upgrade` | +| `upgrade_target` | Target minor version — only present for `minor_upgrade` | +| `newer_branch_target` / `newer_branch_latest` | Present when a newer major/minor branch is available | + +--- + +## Container + +### `container_stopped` + +Sent when a container stops unexpectedly (not via a manual stop action). + +```json +{ + "success": false, + "event": "container_stopped", + "message": "Resource stopped unexpectedly", + "container_name": "...", + "server_name": "...", + "server_uuid": "...", + "url": "..." +} +``` + +### `container_restarted` + +Sent when a container is automatically restarted by Coolify. + +```json +{ + "success": true, + "event": "container_restarted", + "message": "Resource restarted automatically", + "container_name": "...", + "server_name": "...", + "server_uuid": "...", + "url": "..." +} +``` + + + + +`url` is only present when available. + + + + +--- + +## Test + +### `test` + +Sent when you click **Send Test Notification** in the Coolify dashboard. + +```json +{ + "success": true, + "event": "test", + "message": "This is a test webhook notification from Coolify.", + "url": "..." +} +``` diff --git a/content/docs/meta.json b/content/docs/meta.json new file mode 100644 index 00000000..74426d2a --- /dev/null +++ b/content/docs/meta.json @@ -0,0 +1,13 @@ +{ + "pages": [ + "index", + "get-started", + "applications", + "services", + "databases", + "integrations", + "knowledge-base", + "api-reference", + "troubleshoot" + ] +} \ No newline at end of file diff --git a/content/docs/services/activepieces.mdx b/content/docs/services/activepieces.mdx new file mode 100644 index 00000000..da0ac49c --- /dev/null +++ b/content/docs/services/activepieces.mdx @@ -0,0 +1,145 @@ +--- +title: ActivePieces +description: "Open source no-code business automation." +og: + description: "Deploy ActivePieces workflow automation platform on Coolify with TypeScript-based extensible automation, visual builder, and 100+ integrations." +category: "Automation" +icon: "/docs/images/services/activepieces-logo.png" +# tabs: +# - title: Overview & Requirements +# content: +# items: +# - icon: 🔲 +# label: CPU +# value: 2 Cores +# - icon: 💾 +# label: RAM +# value: 2 GB +# - icon: 💿 +# label: Storage +# value: 10 GB +# - icon: 🌐 +# label: Network +# value: IPv4 Address Required +# - icon: 🖥️ +# label: Supported OS +# value: All Linux-based distributions +# - icon: 🌱 +# label: System Architecture +# value: ARM64, AMD64 (x86_64) +# message: +# icon: 🌱 +# value: >- +# It may take up to 5 minutes for the services to go healthy after +# deployment. Please be patient and avoid assuming the services are not +# working during this period. +# type: info +# - title: Default Credentials +# content: +# items: +# - icon: 👤 +# label: Username +# value: admin +# - icon: 🔑 +# label: Password +# value: admin +# - title: External Links +# content: +# items: +# - code: Official Website +# description: "Deploy ActivePieces workflow automation platform on Coolify with TypeScript-based extensible automation, visual builder, and 100+ integrations." +# - code: Official Documentation +# description: https://www.activepieces.com/docs?utm_source=coolify.io +# - code: GitHub Repository +# description: https://github.com/activepieces/activepieces?utm_source=coolify.io +# compose: +# services: +# activepieces: +# image: ghcr.io/activepieces/activepieces:latest +# environment: +# - SERVICE_FQDN_ACTIVEPIECESS +# - AP_API_KEY=$SERVICE_PASSWORD_64_APIKEY +# - AP_ENCRYPTION_KEY=$SERVICE_PASSWORD_ENCRYPTIONKEY +# - >- +# AP_ENGINE_EXECUTABLE_PATH=${AP_ENGINE_EXECUTABLE_PATH:-dist/packages/engine/main.js} +# - AP_ENVIRONMENT=${AP_ENVIRONMENT:-prod} +# - AP_EXECUTION_MODE=${AP_EXECUTION_MODE:-UNSANDBOXED} +# - AP_FRONTEND_URL=${SERVICE_FQDN_ACTIVEPIECES} +# - AP_JWT_SECRET=$SERVICE_PASSWORD_64_JWT +# - AP_POSTGRES_DATABASE=${POSTGRES_DB:-activepieces} +# - AP_POSTGRES_HOST=${POSTGRES_HOST:-postgres} +# - AP_POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} +# - AP_POSTGRES_PORT=${POSTGRES_PORT:-5432} +# - AP_POSTGRES_USERNAME=$SERVICE_USER_POSTGRES +# - AP_REDIS_HOST=${REDIS_HOST:-redis} +# - AP_REDIS_PORT=${REDIS_PORT:-6379} +# - AP_SANDBOX_RUN_TIME_SECONDS=${AP_SANDBOX_RUN_TIME_SECONDS:-600} +# - AP_TELEMETRY_ENABLED=${AP_TELEMETRY_ENABLED:-false} +# - >- +# AP_TEMPLATES_SOURCE_URL=${AP_TEMPLATES_SOURCE_URL:-https://cloud.activepieces.com/api/v1/flow-templates} +# - >- +# AP_TRIGGER_DEFAULT_POLL_INTERVAL=${AP_TRIGGER_DEFAULT_POLL_INTERVAL:-5} +# - AP_WEBHOOK_TIMEOUT_SECONDS=${AP_WEBHOOK_TIMEOUT_SECONDS:-30} +# depends_on: +# postgres: +# condition: service_healthy +# redis: +# condition: service_started +# healthcheck: +# test: +# - CMD +# - curl +# - '-f' +# - http://127.0.0.1:80 +# interval: 5s +# timeout: 20s +# retries: 10 +# postgres: +# image: postgres:latest +# environment: +# - POSTGRES_DB=${POSTGRES_DB:-activepieces} +# - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} +# - POSTGRES_USER=${SERVICE_USER_POSTGRES} +# - POSTGRES_PORT=${POSTGRES_PORT:-5432} +# volumes: +# - pg-data:/var/lib/postgresql/data +# healthcheck: +# test: +# - CMD-SHELL +# - pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} +# interval: 5s +# timeout: 20s +# retries: 10 +# redis: +# image: redis:latest +# volumes: +# - redis_data:/data +# healthcheck: +# test: +# - CMD +# - redis-cli +# - ping +# interval: 5s +# timeout: 20s +# retries: 10 +--- + + + + + +## What is ActivePieces + +Your friendliest open source all-in-one automation tool, designed to be extensible through a type-safe pieces framework written in Typescript. + +## Visual Demos + + + +
+ + + + + + diff --git a/content/docs/services/actualbudget.mdx b/content/docs/services/actualbudget.mdx new file mode 100644 index 00000000..155a9615 --- /dev/null +++ b/content/docs/services/actualbudget.mdx @@ -0,0 +1,25 @@ +--- +title: "Actual Budget" +description: "A local-first personal finance tool based on zero-based budgeting." +og: + description: "Host Actual Budget on Coolify for privacy-focused envelope budgeting with multi-device sync, end-to-end encryption, and real-time financial tracking." +category: "Finance" +icon: "/docs/images/services/actualbudget-logo.webp" +--- + + + +## What is Actual Budget? + +Actual Budget is a super fast and privacy-focused app for managing your finances. At its heart is the well proven and much loved Envelope Budgeting methodology. + +You own your data and can do whatever you want with it. Featuring multi-device sync, optional end-to-end encryption and so much more. + +## Screenshots + + + +## Links + +- [The official website](https://actualbudget.org/?utm_source=coolify.io) +- [GitHub](https://github.com/actualbudget/actual?utm_source=coolify.io) diff --git a/content/docs/services/affine.mdx b/content/docs/services/affine.mdx new file mode 100644 index 00000000..e396490c --- /dev/null +++ b/content/docs/services/affine.mdx @@ -0,0 +1,25 @@ +--- +title: "Affine" +description: "Open-source knowledge base and workspace combining docs, whiteboards, and databases." +og: + description: "Deploy AFFiNE workspace on Coolify combining docs, whiteboards, and databases for seamless collaboration and creative project management." +category: "Productivity" +icon: "/docs/images/services/affine-logo.webp" +--- + + + +## What is Affine? + +AFFiNE is a workspace with fully merged docs, whiteboards and databases. + +Get more things done, your creativity isn’t monotone. + +## Screenshots + + + +## Links + +- [The official website](https://affine.pro/?utm_source=coolify.io) +- [GitHub](https://github.com/toeverything/AFFiNE?utm_source=coolify.io) diff --git a/content/docs/services/alexandrie.mdx b/content/docs/services/alexandrie.mdx new file mode 100644 index 00000000..ca6e5534 --- /dev/null +++ b/content/docs/services/alexandrie.mdx @@ -0,0 +1,30 @@ +--- +title: "Alexandrie" +description: "Markdown note-taking app focused on performance, local data, and knowledge graph navigation." +og: + description: "Self-hosted Markdown note-taking app focused on performance, local data, and knowledge graph navigation." +category: "Productivity" +icon: "/docs/images/services/alexandrie-logo.svg" +--- + +# Alexandrie + + + +## What is Alexandrie? + +Alexandrie is a self-hosted Markdown note-taking application designed for speed, offline usage, and long-term knowledge management. +It focuses on speed, design, fast navigation in large note collections, and explicit links between documents. + +## Features + +- Markdown editor with live preview +- Fast full-text search, tags based organisation, hierarchy +- Advanced management features for handling hundreds of documents +- Simple Docker-based deployment + +## Links + +- [Website](https://alexandrie-hub.fr?utm_source=coolify.io) +- [GitHub](https://github.com/Smaug6739/Alexandrie?utm_source=coolify.io) +- [Documentation](https://github.com/Smaug6739/Alexandrie/wiki?utm_source=coolify.io) diff --git a/content/docs/services/all.mdx b/content/docs/services/all.mdx new file mode 100644 index 00000000..a999bec1 --- /dev/null +++ b/content/docs/services/all.mdx @@ -0,0 +1,430 @@ +--- +title: All Services +description: Complete directory of one-click services in Coolify including AI, analytics, databases, CMS, monitoring, and more. +layout: doc +--- + +# All Services + +Complete directory of all one-click services available in Coolify, organized by category. + +## Administration + +- [Cockpit](/services/cockpit) - Web-based server administration interface. +- [Dashboard](/services/dashboard) - A simple dashboard for your server. +- [Dashy](/services/dashy) - Customizable homepage dashboard for self-hosted services. +- [Glance](/services/glance) - All-in-one Home Server Dashboard. +- [Heimdall](/services/heimdall) - An elegant solution to organize all your web applications. +- [Homarr](/services/homarr) - Customizable browser homepage and dashboard. +- [Homepage](/services/homepage) - A modern homepage for your server. +- [Litequeen](/services/litequeen) - Lightweight service management platform. +- [Organizr](/services/organizr) - Homepage organizer for your server services. + +## AI + +- [AnythingLLM](/services/anythingllm) - An open-source LLM client that empowers developers to build and scale workflows quickly. +- [Argilla](/services/argilla) - An open-source platform for building, training, and evaluating conversational AI models. +- [Chroma](/services/chroma) - Open-source, AI-native vector database for building applications with embeddings. +- [Flowise](/services/flowise) - Drag & drop UI to build your customized LLM flow. +- [Label Studio](/services/labelstudio) - Open source data labeling platform. +- [Langflow](/services/langflow) - Open source Python-based framework for building AI applications. +- [Langfuse](/services/langfuse) - Open source LLM engineering platform. +- [LibreChat](/services/librechat) - Self-hosted, powerful, and privacy-focused chat UI for multiple AI models. +- [Libretranslate](/services/libretranslate) - Free and open-source machine translation API. +- [Litellm](/services/litellm) - Open source LLM Gateway to manage authentication, loadbalancing, and spend tracking across 100+ LLMs. All in the OpenAI format. +- [LobeChat](/services/lobe-chat) - Open-source, modern AI chat framework with multi-provider support and knowledge base management. +- [MetaMCP](/services/metamcp) - MCP Aggregator, Orchestrator, Middleware, Gateway in one application. +- [Mindsdb](/services/mindsdb) - Machine learning platform that brings AI to databases. +- [NewAPI](/services/newapi) - The next-generation LLM gateway and AI asset management system supports multiple languages. +- [Ollama](/services/ollama) - A lightweight and efficient server for running large language models (LLMs) on your local machine or in the cloud. +- [Open Webui](/services/open-webui) - User-friendly WebUI for LLMs, formerly Ollama WebUI. +- [OpenClaw](/services/openclaw) - AI-powered coding assistant with multi-provider support and browser automation. +- [Qdrant](/services/qdrant) - Open source, AI-native vector database. +- [Unstructured](/services/unstructured) - Open-source platform and tools to ingest and process unstructured documents for Retrieval Augmented Generation (RAG) and model fine-tuning. +- [Weaviate](/services/weaviate) - Open source, AI-native vector database. + +## Analytics + +- [GoatCounter](/services/goatcounter) - Web analytics platform offering easy to use and meaningful privacy-friendly web analytics. +- [Metabase](/services/metabase) - The simplest, fastest way to share data and analytics inside your company. +- [OpenPanel](/services/openpanel) - Open source alternative to Mixpanel and Plausible for product analytics. +- [Plausible Analytics](/services/plausible) - A lightweight, open-source web analytics tool that prioritizes user privacy by not using cookies. +- [PostHog](/services/posthog) - Open source product analytics. +- [Rybbit](/services/rybbit) - A lightweight, open-source web analytics tool that prioritizes user privacy by not using cookies. +- [Sequin](/services/sequin) - The fastest Postgres change data capture. +- [Superset](/services/superset) - Open-source data visualization and exploration platform. +- [Swetrix](/services/swetrix) - Privacy-friendly and cookieless European web analytics alternative to Google Analytics. +- [Umami](/services/umami) - A lightweight, open-source web analytics tool that prioritizes user privacy by not using cookies. + +## Automation + +- [ActivePieces](/services/activepieces) - Open source no-code business automation. +- [Evolution API](/services/evolution-api) - WhatsApp API service for automation. +- [Mage AI](/services/mage-ai) - Build, run, and manage data pipelines for integrating and transforming data. +- [N8N](/services/n8n) - Workflow automation tool. +- [Trigger](/services/trigger) - Open-source workflow automation tool. + +## Backup + +- [Databasus](/services/databasus) - A free, open source and self-hosted tool to backup PostgreSQL, MySQL and MongoDB with multiple storage backends. +- [Duplicati](/services/duplicati) - A free backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers. + +## Bookmarks + +- [Hoarder](/services/hoarder) - Self-hosted bookmark manager with AI-powered tagging. +- [Linkding](/services/linkding) - A self-hosted bookmark manager designed to be minimal, fast, and easy to set up. + +## Browser + +- [Firefox](/services/firefox) - Firefox browser in a container. + +## Business + +- [Chaskiq](/services/chaskiq) - Open source customer engagement platform. +- [Chatwoot](/services/chatwoot) - Open-source customer engagement suite. +- [Documenso](/services/documenso) - Open-source DocuSign alternative for document signing. +- [Docuseal](/services/docuseal) - Open source DocuSign alternative. +- [Dolibarr](/services/dolibarr) - Open-source ERP and CRM software. +- [Easyappointments](/services/easyappointments) - Open-source appointment scheduler. +- [EspoCRM](/services/espocrm) - A free and open-source CRM platform. +- [Fider](/services/fider) - An open platform to collect and organize customer feedback. +- [Freescout](/services/freescout) - Help desk and customer support application. +- [GLPI (Gestionnaire Libre de Parc Informatique)](/services/glpi) - Free, open-source IT Service Management platform for asset management, helpdesk, and service desk operations. +- [Invoice Ninja](/services/invoice-ninja) - Invoice management system. +- [Kimai](/services/kimai) - An open-source time-tracking solution for teams of all sizes. +- [LimeSurvey](/services/limesurvey) - The most popular FOSS online survey tool on the web. +- [Odoo](/services/odoo) - Open source ERP and CRM. +- [OrangeHRM](/services/orangehrm) - Free HR management system for businesses. +- [Osticket](/services/osticket) - Open-source help desk ticketing system. +- [Paymenter](/services/paymenter) - Open-Source Billing, Built for Hosting Providers. +- [Twenty](/services/twenty) - Open-source CRM designed to fit your unique business needs. + +## CMS + +- [ClassicPress](/services/classicpress) - A business-focused CMS with a strong community. +- [Directus](/services/directus) - An open-source headless CMS and API for custom databases. +- [Drupal](/services/drupal) - Open-source content management system. +- [Ghost](/services/ghost) - A professional publishing platform. +- [Joomla](/services/joomla) - Open-source content management system. +- [Strapi](/services/strapi) - Open-source headless CMS. +- [WordPress](/services/wordpress) - Website and blogging platform. + +## Communication + +- [GoWa](/services/gowa) - Golang WhatsApp - Built with Go for efficient memory use. +- [Matrix](/services/matrix) - Chat securely with your family, friends, community. +- [Mattermost](/services/mattermost) - Open-source messaging platform for teams. +- [Once Campfire](/services/once-campfire) - Web-based chat application. +- [Rocket.Chat](/services/rocketchat) - Open source team chat software. +- [Soju](/services/soju) - User-friendly IRC bouncer with modern features. + +## Crypto + +- [Bitcoin Core](/services/bitcoin-core) - Bitcoin Core full node software. + +## Database + +- [Autobase](/services/autobase) - Open-source alternative to cloud-managed databases for PostgreSQL (self-hosted DBaaS). +- [ElectricSQL](/services/electricsql) - Sync shape-based subsets of your Postgres data over HTTP +- [NocoDB](/services/nocodb) - Open Source Airtable Alternative. +- [PG Back Web](/services/pgbackweb) - Effortless PostgreSQL backups with a user-friendly web interface. +- [Teable](/services/teable) - No-code database built on PostgreSQL. + +## Design + +- [Penpot](/services/penpot) - Open Source design & prototyping platform. + +## Development + +- [Apprise API](/services/apprise-api) - RESTful API for Apprise notification library. +- [Appsmith](/services/appsmith) - A low-code application platform for building internal tools. +- [Appwrite](/services/appwrite) - A backend-as-a-service platform that simplifies the web & mobile app development. +- [Browserless](/services/browserless) - Headless Chrome as a service. +- [Budibase](/services/budibase) - Low-code platform for building internal tools and business apps. +- [Bugsink](/services/bugsink) - Self-hosted Error Tracking +- [Cloudbeaver](/services/cloudbeaver) - Universal database tool with web interface. +- [Code Server](/services/code-server) - Run VS Code on any machine anywhere and access it in the browser. +- [Convex](/services/convex) - Backend platform for web developers. +- [Denokv](/services/denokv) - Deno's built-in key-value database service. +- [Docker Registry](/services/docker-registry) - A Docker registry to store and manage your Docker images. +- [Dozzle](/services/dozzle) - Realtime log viewer for docker containers. +- [Drizzle Gateway](/services/drizzle-gateway) - Drizzle Studio for exploring SQL databases. +- [Flipt](/services/flipt) - Open-source feature flag management platform. +- [Forgejo](/services/forgejo) - A self-hosted Git service fork of Gitea. +- [Formbricks](/services/formbricks) - A form builder for static sites. +- [Gitea](/services/gitea) - A painless self-hosted Git service. +- [GitHub Runner](/services/github-runner) - A GitHub Actions runner for Docker. +- [GitLab](/services/gitlab) - DevOps lifecycle tool. +- [Glitchtip](/services/glitchtip) - An open-source error tracking tool. +- [Gotenberg](/services/gotenberg) - A Docker-powered stateless API for PDF files. +- [Hatchet](/services/hatchet) - Platform for running background tasks and durable workflows built on Postgres. +- [Heyform](/services/heyform) - Open-source form builder for conversational forms. +- [Hoppscotch](/services/hoppscotch) - Open-source API development ecosystem. +- [It Tools](/services/it-tools) - Collection of handy online tools for developers. +- [Jenkins](/services/jenkins) - Open-source automation server. +- [Jupyter Notebook Python](/services/jupyter-notebook-python) - Interactive computing environment for Python. +- [Kuzzle](/services/kuzzle) - A powerful backend that enables you to build modern apps faster. +- [Lowcoder](/services/lowcoder) - Open-source low-code platform for building internal tools. +- [Mailpit](/services/mailpit) - Self-hosted email and SMTP testing tool. +- [Marimo](/services/marimo) - Open-source reactive notebook for Python. +- [Martin](/services/martin) - PostGIS vector tile server. +- [Neon Ws Proxy](/services/neon-ws-proxy) - WebSocket proxy for Neon database. +- [Next Image Transformation](/services/next-image-transformation) - Image transformation service for Next.js. +- [Nitropage](/services/nitropage) - Nitropage is an extensible, drag-and-drop website builder based on SolidStart, completely free and open source. +- [NocoBase](/services/nocobase) - The most extensible AI-powered no-code platform with total control and infinite extensibility. +- [Onedev](/services/onedev) - Self-hosted Git server with integrated CI/CD and kanban. +- [OpenBlocks](/services/openblocks) - Open-source low code platform. +- [OpnForm](/services/opnform) - Open-source form builder that lets you create beautiful forms and share them anywhere. +- [pgAdmin](/services/pgadmin) - A web-based database management tool for administering your PostgreSQL databases through a user-friendly interface. +- [phpMyAdmin](/services/phpmyadmin) - MySQL database management tool. +- [PocketBase](/services/pocketbase) - Open Source backend for your next SaaS and Mobile app. +- [Portainer](/services/portainer) - Container management platform. +- [Prefect](/services/prefect) - Open source workflow management platform. +- [Privatebin](/services/privatebin) - Minimalist, open-source online pastebin. +- [Proxyscotch](/services/proxyscotch) - Tiny open-source CORS proxy made by Hoppscotch. +- [RabbitMQ](/services/rabbitmq) - Open source message broker. +- [Redis Insight](/services/redis-insight) - Official Redis GUI that lets you do both GUI- and CLI-based interactions in a fully-featured desktop GUI client. +- [Rivet Engine](/services/rivet-engine) - Backend engine for running stateful actors at scale with automatic scaling and distributed state management. +- [Shlink](/services/shlink) - The open source URL shortener. +- [Soketi](/services/soketi) - Open-source WebSocket server. +- [Soketi App Manager](/services/soketi-app-manager) - Manage Soketi apps with application configuration and WebSocket server administration interface. +- [Sonatype Nexus](/services/nexus) - A repository manager that allows you to store, manage, and distribute your software artifacts. +- [Supabase](/services/supabase) - Open source Firebase alternative. +- [Tolgee](/services/tolgee) - Open source localization platform. +- [TrailBase](/services/trailbase) - Blazingly fast Rust/SQLite/Wasmtime app server with type-safe APIs. +- [Unleash](/services/unleash) - Open-source feature management platform. +- [Vvveb](/services/vvveb) - Powerful website builder with drag and drop functionality. +- [Wakapi](/services/wakapi) - Open-source coding activity tracker. +- [Web Check](/services/web-check) - All-in-one website analysis tool. +- [Weblate](/services/weblate) - Web-based translation tool. +- [Windmill](/services/windmill) - Open-source developer platform. + +## Documentation + +- [Bookstack](/services/bookstack) - Self-hosted wiki-style documentation platform. +- [Docmost](/services/docmost) - Open-source document collaboration platform. +- [DokuWiki](/services/dokuwiki) - A simple to use and highly versatile Open Source wiki software that doesn't require a database. +- [Mediawiki](/services/mediawiki) - A free and open-source wiki software package. +- [Paperless](/services/paperless) - Document management system that transforms physical documents into searchable online archives. +- [Stirling PDF](/services/stirling-pdf) - Powerful PDF manipulation tool. +- [Wikijs](/services/wikijs) - Modern and powerful wiki software built on Node.js. + +## Education + +- [Moodle](/services/moodle) - Open-source learning platform. + +## Email + +- [Open Archiver](/services/open-archiver) - Self-hosted, open-source email archiving solution with full-text search. +- [Sessy](/services/sessy) - Email observability platform for monitoring Amazon SES deliveries, bounces, and more. +- [Usesend](/services/usesend) - Open-source email recall service. + +## Family + +- [Gramps Web](/services/gramps-web) - The free, open-source genealogy system. + +## File Management + +- [Chibisafe](/services/chibisafe) - A beautiful and performant vault to save all your files in the cloud. +- [Filebrowser](/services/filebrowser) - A file manager for the web. +- [FileFlows](/services/fileflows) - A automatic file processing service. +- [SFTPGo](/services/sftpgo) - Event-driven SFTP, FTP/S, HTTP/S and WebDAV server. +- [Syncthing](/services/syncthing) - Open Source Continuous File Synchronization. +- [Zipline](/services/zipline) - Next generation ShareX / File upload server + +## File Sharing + +- [Pairdrop](/services/pairdrop) - Local file sharing in your browser. +- [PingvinShare](/services/pingvinshare) - Self-hosted file sharing platform that combines lightness and beauty. +- [Pydio Cells](/services/pydio-cells) - File sharing platform for organizations. +- [Snapdrop](/services/snapdrop) - Local file sharing in your browser. + +## Finance + +- [Actual Budget](/services/actualbudget) - A local-first personal finance tool based on zero-based budgeting. +- [BudgE](/services/budge) - A budgeting personal finance app. +- [Firefly III](/services/firefly) - A personal finances manager. +- [Maybe](/services/maybe) - Personal finance and wealth management application. +- [Sure](/services/sure) - An all-in-one personal finance platform. + +## Forum + +- [Nodebb](/services/nodebb) - Node.js based forum software. + +## Gaming + +- [Foundryvtt](/services/foundryvtt) - Virtual tabletop for tabletop role-playing games. +- [Minecraft](/services/minecraft) - Minecraft game server. +- [Palworld](/services/palworld) - Dedicated server for Palworld multiplayer survival game with creature collection and base building. +- [Pterodactyl Panel](/services/pterodactyl) - Game server management panel with Wings daemon for hosting Minecraft, CS:GO, ARK and more. +- [Satisfactory](/services/satisfactory) - Game server for Satisfactory open-world factory building game with a dash of exploration and combat. +- [Terraria Server](/services/terraria-server) - Docker multi-arch image for Terraria game server. +- [Wings](/services/wings) - Pterodactyl server control daemon for standalone game server node deployments. + +## Health + +- [BabyBuddy](/services/babybuddy) - It helps parents track their baby's daily activities, growth, and health with ease. +- [SparkyFitness](/services/sparkyfitness) - A comprehensive fitness app that helps users track nutrition, exercise, and body metrics. + +## Home + +- [Grocy](/services/grocy) - A self-hosted groceries & household management solution for your home. +- [Home Assistant](/services/home-assistant) - Open-source home automation platform focused on local control and privacy. +- [Homebox](/services/homebox) - Inventory and organization system built for the Home User. +- [Mealie](/services/mealie) - Self-hosted recipe manager and meal planner. + +## IoT + +- [ESPHome](/services/esphome) - Open-source firmware framework for WiFi-enabled microcontrollers. +- [Mosquitto](/services/mosquitto) - Open-source MQTT broker. +- [Traccar](/services/traccar) - Open-source GPS tracking platform. + +## Marketing + +- [Listmonk](/services/listmonk) - Self-hosted newsletter and mailing list manager. +- [Mautic](/services/mautic) - Open-source marketing automation platform. +- [Plunk](/services/plunk) - Self-hosted email marketing platform. + +## Media + +- [Audiobookshelf](/services/audiobookshelf) - Self-hosted audiobook and podcast server. +- [Booklore](/services/booklore) - Open-source library management system for your digital book collection. +- [Calibre Web](/services/calibre-web) - Web app for browsing, reading and downloading eBooks from a Calibre database. +- [Calibre Web Automated with Downloader](/services/calibre-web-automated-with-downloader) - Intuitive web interface for searching and requesting book downloads with Calibre-Web-Automated. +- [Cap](/services/cap) - Cap is the open source alternative to Loom. Lightweight, powerful, and cross-platform. Record and share in seconds. +- [Castopod](/services/castopod) - Open-source podcast hosting platform. +- [Emby](/services/emby) - A media server to organize, play, and stream audio and video to a variety of devices. +- [Emby Stat](/services/embystat) - A simple and easy-to-use Emby statistics dashboard. +- [Grimmory](/services/grimmory) - A self-hosted ebook library manager and reader, successor to Booklore. +- [Imgcompress](/services/imgcompress) - Image tool for compression, format conversion, and AI background removal +- [Immich](/services/immich) - Self-hosted photo and video backup solution. +- [Jellyfin](/services/jellyfin) - The Free Software Media System. +- [Metube](/services/metube) - A self-hosted video sharing platform. +- [Navidrome](/services/navidrome) - Modern music server and streamer compatible with Subsonic/Airsonic. +- [Overseerr](/services/overseerr) - A request management and media discovery tool built to work with your existing Plex ecosystem. +- [Plex](/services/plex) - Media server software. +- [Prowlarr](/services/prowlarr) - A free and open source BitTorrent client. +- [Qbittorrent](/services/qbittorrent) - Free and open-source BitTorrent client. +- [Radarr](/services/radarr) - A Media server software. +- [Sonarr](/services/sonarr) - A internet PVR for Usenet and Torrents. +- [Transmission](/services/transmission) - Fast, easy, and free BitTorrent client. +- [Yamtrack](/services/yamtrack) - Self-hosted music scrobble database. + +## Monitoring + +- [Beszel](/services/beszel) - Lightweight server monitoring hub with historical data, docker stats, and alerts. +- [Change Detection](/services/changedetection) - Website change detection monitor and notifications. +- [Checkmate](/services/checkmate) - Website monitoring and uptime service. +- [Diun](/services/diun) - Docker Image Update Notifier. +- [Glances](/services/glances) - Cross-platform system monitoring tool. +- [Grafana](/services/grafana) - The open platform for beautiful analytics and monitoring. +- [Observium](/services/observium) - Low-maintenance auto-discovering network monitoring platform. +- [SigNoz](/services/signoz) - Open source observability platform native to OpenTelemetry with logs, traces, and metrics. +- [Statusnook](/services/statusnook) - A status page system for your website. +- [Uptime Kuma](/services/uptime-kuma) - A fancy self-hosted monitoring tool. + +## Networking + +- [Cloudflared](/services/cloudflared) - Cloudflare Tunnel client. +- [Librespeed](/services/librespeed) - Deploy Librespeed on Coolify for self-hosted lightweight speed test. +- [Netbird-Client](/services/netbird-client) - Connect your devices into a secure WireGuard-based mesh network. +- [Newt-Pangolin](/services/newt-pangolin) - User space WireGuard tunnel client and TCP/UDP proxy for securely exposing private resources. +- [Tailscale Client](/services/tailscale-client) - Zero-config WireGuard VPN client for secure mesh networking and encrypted connections. + +## Notifications + +- [Gotify](/services/gotify) - Open-source push notifications for web and mobile apps. +- [Ntfy](/services/ntfy) - Simple HTTP-based pub-sub notification service. + +## Productivity + +- [Affine](/services/affine) - Open-source knowledge base and workspace combining docs, whiteboards, and databases. +- [Alexandrie](/services/alexandrie) - Markdown note-taking app focused on performance, local data, and knowledge graph navigation. +- [AppFlowy](/services/appflowy) - Open-source alternative to Notion with workspaces for docs, wikis, and project management. +- [BentoPDF](/services/bento-pdf) - Process PDFs entirely in your browser. No uploads. No servers. Complete privacy. +- [Calcom](/services/calcom) - Open-source Calendly alternative for scheduling meetings. +- [CodiMD](/services/codimd) - Realtime collaborative markdown notes on all platforms. +- [Ente](/services/ente-photos) - A fully open-source, end-to-end encrypted platform for you to store data in the cloud without needing to trust the service provider. +- [Excalidraw](/services/excalidraw) - Virtual whiteboard for sketching hand-drawn like diagrams. +- [Grist](/services/grist) - Modern relational spreadsheet combining flexibility and database robustness. +- [Joplin](/services/joplin) - Open-source note taking and to-do application. +- [KaraKeep](/services/karakeep) - Self-hostable bookmark-everything app with AI-based automatic tagging. +- [Libreoffice](/services/libreoffice) - Free and open-source office suite. +- [Memos](/services/memos) - Open-source, self-hosted memo hub with knowledge management. +- [Outline](/services/getoutline) - Open-source collaboration tool. +- [Rallly](/services/rallly) - Open-source meeting scheduling tool. +- [Reactive Resume](/services/reactive-resume) - A free and open source resume builder. +- [Readeck](/services/readeck) - Web article reader and bookmark manager. +- [Ryot](/services/ryot) - Self-hosted platform for tracking various facets of your life. +- [SilverBullet](/services/silverbullet) - An open source personal productivity platform built on Markdown. +- [Siyuan](/services/siyuan) - A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. +- [Slash](/services/slash) - Open-source, self-hosted links and notes manager. +- [TriliumNext](/services/triliumnext) - Build your personal knowledge base with TriliumNext Notes. +- [Vikunja](/services/vikunja) - The open-source to-do app. + +## Project Management + +- [Fizzy](/services/fizzy) - Kanban tracking tool for issues and ideas by 37signals. +- [Leantime](/services/leantime) - Lean project management system for innovators. +- [Plane](/services/plane) - Open source project planning tool. +- [Redmine](/services/redmine) - Flexible project management web application. + +## RSS + +- [Freshrss](/services/freshrss) - Free, self-hostable RSS feed aggregator. +- [Miniflux](/services/miniflux) - Minimalist and opinionated feed reader. + +## Search + +- [Elasticsearch](/services/elasticsearch) - Free and Open Source, Distributed, RESTful Search Engine. +- [Meilisearch](/services/meilisearch) - A powerful, fast, open-source, easy to use, and deploy search engine. +- [SearXNG](/services/searxng) - Open source search engine. +- [Typesense](/services/typesense) - Open source alternative to Algolia and easier-to-use alternative to ElasticSearch. +- [Whoogle](/services/whoogle) - Self-hosted, ad-free, privacy-respecting metasearch engine. + +## Security + +- [Authentik](/services/authentik) - An open-source Identity Provider, focused on flexibility and versatility. +- [Cap (CAPTCHA)](/services/cap-captcha) - The self-hosted CAPTCHA for the modern web. +- [Cryptgeon](/services/cryptgeon) - Secure note sharing service with self-destructing messages. +- [Cyberchef](/services/cyberchef) - Data analysis and manipulation tool for cybersecurity. +- [Faraday](/services/faraday) - Collaborative penetration testing and vulnerability management platform. +- [Infisical](/services/infisical) - Open source secret management platform. +- [Keycloak](/services/keycloak) - Open-source identity and access management solution. +- [Logto](/services/logto) - Logto is an Auth0 alternative designed for modern apps and SaaS products. +- [Onetime Secret](/services/onetimesecret) - Share secrets securely with self-destructing links that can only be viewed once. +- [Passbolt](/services/passbolt) - Open source password manager for teams. +- [Pi-hole](/services/pi-hole) - Network-wide ad blocker that acts as a DNS sinkhole. +- [Pocket ID](/services/pocket-id) - A simple OIDC provider for passwordless authentication with passkeys. +- [Supertokens](/services/supertokens) - Open-source authentication solution. +- [Vaultwarden](/services/vaultwarden) - Unofficial Bitwarden compatible server. +- [Wireguard Easy](/services/wireguard-easy) - Easy-to-use WireGuard VPN server. + +## Social Media + +- [Bluesky PDS](/services/bluesky-pds) - Bluesky PDS (Personal Data Server) for decentralized social networking. +- [Mixpost](/services/mixpost) - Self-hosted social media management software (Buffer alternative). +- [Postiz](/services/postiz) - Social media scheduling and analytics tool. +- [Redlib](/services/redlib) - Private front-end for Reddit. + +## Storage + +- [Cloudreve](/services/cloudreve) - A self-hosted file management and sharing system. +- [Garage](/services/garage) - S3-compatible distributed object storage service designed for self-hosting. +- [MinIO](/services/minio-community-edition) - A high-performance, distributed object storage system. +- [MinIO](/services/minio) - A high-performance, distributed object storage system. +- [NextCloud](/services/nextcloud) - A safe home for all your data. +- [Owncloud](/services/owncloud) - File synchronization and sharing platform. +- [Seafile](/services/seafile) - High-performance file syncing and sharing with knowledge management features. +- [SeaweedFS](/services/seaweedfs) - Simple and highly scalable distributed file system compatible with S3. + +## Utilities + +- [Convertx](/services/convertx) - File conversion service supporting multiple formats. +- [Vert](/services/vert) - Self-hosted file converter. + +--- + +Looking for a searchable interface? Visit our [interactive services search](/services/overview) page. + +To request a new service, please check our [contribution guide](https://github.com/coollabsio/coolify/blob/v4.x/CONTRIBUTING.md). diff --git a/content/docs/services/anythingllm.mdx b/content/docs/services/anythingllm.mdx new file mode 100644 index 00000000..f0bd0bd1 --- /dev/null +++ b/content/docs/services/anythingllm.mdx @@ -0,0 +1,103 @@ +--- +title: AnythingLLM +description: "An open-source LLM client that empowers developers to build and scale workflows quickly." +og: + description: "Run AnythingLLM on Coolify for all-in-one AI application with RAG, AI agents, document chat, and multi-model support without infrastructure hassle." +category: "AI" +icon: "/docs/images/services/anythingllm-logo.svg" +# tabs: +# - title: Overview & Requirements +# content: +# items: +# - icon: 🔲 +# label: CPU +# value: 2 Cores +# - icon: 💾 +# label: RAM +# value: 2 GB +# - icon: 💿 +# label: Storage +# value: 10 GB +# - icon: 🌐 +# label: Network +# value: IPv4 Address Required +# - icon: 🖥️ +# label: Supported OS +# value: All Linux-based distributions +# - icon: 🌱 +# label: System Architecture +# value: ARM64, AMD64 (x86_64) +# message: +# icon: 🌱 +# value: >- +# It may take up to 5 minutes for the services to go healthy after +# deployment. Please be patient and avoid assuming the services are not +# working during this period. +# type: info +# - title: Default Credentials +# content: +# items: +# - icon: 👤 +# label: Username +# value: admin +# - icon: 🔑 +# label: Password +# value: admin +# - title: External Links +# content: +# items: +# - code: Official Website +# description: "Run AnythingLLM on Coolify for all-in-one AI application with RAG, AI agents, document chat, and multi-model support without infrastructure hassle." +# - code: Official Documentation +# description: https://www.activepieces.com/docs?utm_source=coolify.io +# - code: GitHub Repository +# description: https://github.com/activepieces/activepieces?utm_source=coolify.io +# compose: +# services: +# anything-llm: +# image: mintplexlabs/anythingllm +# environment: +# - SERVICE_FQDN_ANYTHINGLLM_3001 +# - STORAGE_DIR=/app/server/storage +# - DISABLE_TELEMETRY=${DISABLE_TELEMETRY:-true} +# - PASSWORDLOWERCASE=${PASSWORDLOWERCASE:-1} +# - PASSWORDMAXCHAR=${PASSWORDMAXCHAR:-250} +# - PASSWORDMINCHAR=${PASSWORDMINCHAR:-6} +# - PASSWORDNUMERIC=${PASSWORDNUMERIC:-1} +# - PASSWORDREQUIREMENTS=${PASSWORDREQUIREMENTS:-1} +# - PASSWORDSYMBOL=${PASSWORDSYMBOL:-1} +# - PASSWORDUPPERCASE=${PASSWORDUPPERCASE:-1} +# - SIG_KEY=${SERVICE_PASSWORD_SIGKEY} +# - SIG_SALT=${SERVICE_PASSWORD_SIGSALT} +# - JWT_SECRET=${SERVICE_PASSWORD_JWTSECRET} +# - AUTH_TOKEN=${SERVICE_PASSWORD_AUTHTOKEN} +# - SERVER_PORT=${SERVER_PORT:-3001} +# cap_add: +# - SYS_ADMIN +# volumes: +# - anythingllm-storage:/app/server/storage +# - anythingllm-hot:/app/collector/hotdir +# - anythingllm-outputs:/app/collector/outputs +# user: ${UID:-1000}:${GID:-1000} +--- + + + +# AnythingLLM + + + +## What is AnythingLLM? + +AnythingLLM is the easiest to use, all-in-one AI application that can do RAG, AI Agents, and much more with no code or infrastructure headaches. + +## Screenshots + + + + + +## Links + +- [The official website](https://www.anythingllm.com?utm_source=coolify.io) +- [GitHub](https://github.com/Mintplex-Labs/anything-llm?utm_source=coolify.io) diff --git a/content/docs/services/appflowy.mdx b/content/docs/services/appflowy.mdx new file mode 100644 index 00000000..114a9665 --- /dev/null +++ b/content/docs/services/appflowy.mdx @@ -0,0 +1,35 @@ +--- +title: "AppFlowy" +description: "Open-source alternative to Notion with workspaces for docs, wikis, and project management." +og: + description: "Deploy AppFlowy on Coolify as an open-source alternative to Notion with AI-powered workspace, combining docs, wikis, and project management with full data control." +category: "Productivity" +icon: "/docs/images/services/appflowy.svg" +--- + + + +## What is AppFlowy? + +AppFlowy is the AI collaborative workspace where you achieve more without losing control of your data. It's a leading open-source alternative to Notion, bringing together projects, wikis, and teams with AI capabilities. + +Built with Flutter and Rust, AppFlowy offers: + +- **Data Privacy First** - 100% control of your data with self-hosting capabilities +- **Native Experience** - Reliable cross-platform performance with a single codebase +- **AI Integration** - Built-in AI features to enhance productivity +- **Flexible Workspace** - Combines documents, databases, kanban boards, and more +- **Community-Driven** - Open-source and extensible platform + +Perfect for individuals seeking Notion's functionality with enhanced data security, or enterprises needing customizable collaboration tools with complete data ownership. + +## Screenshots + + + +## Links + +- [The official website](https://www.appflowy.com/?utm_source=coolify.io) +- [GitHub](https://github.com/AppFlowy-IO/AppFlowy?utm_source=coolify.io) +- [Documentation](https://docs.appflowy.io/?utm_source=coolify.io) +- [Self-hosting Guide](https://appflowy.com/docs/self-host-appflowy-overview?utm_source=coolify.io) diff --git a/content/docs/services/apprise-api.mdx b/content/docs/services/apprise-api.mdx new file mode 100644 index 00000000..153133ca --- /dev/null +++ b/content/docs/services/apprise-api.mdx @@ -0,0 +1,32 @@ +--- +title: "Apprise API" +description: "RESTful API for Apprise notification library." +og: + description: "Host Apprise API on Coolify to send push notifications to 100+ services via unified REST API for alerts, monitoring, and messaging workflows." +category: "Development" +icon: "/docs/images/services/appriseapi-logo.png" +--- + +# What is Apprise API? + +[Apprise-api](https://github.com/caronc/apprise-api) Takes advantage of [Apprise](https://github.com/caronc/apprise) through your network with a user-friendly API. + +- Send notifications to more than 100 services. +- An incredibly lightweight gateway to Apprise. +- A production ready micro-service at your disposal. +- A Simple Website to verify and test your configuration with. + +Apprise API was designed to easily fit into existing (and new) eco-systems that are looking for a simple notification solution. + +## Screenshots + + + +
+ + + +## Links + +- [The official website](https://hub.docker.com/r/caronc/apprise/?utm_source=coolify.io) +- [GitHub](https://github.com/caronc/apprise-api?utm_source=coolify.io) diff --git a/content/docs/services/appsmith.mdx b/content/docs/services/appsmith.mdx new file mode 100644 index 00000000..7be5ee5f --- /dev/null +++ b/content/docs/services/appsmith.mdx @@ -0,0 +1,47 @@ +--- +title: "Appsmith" +description: "A low-code application platform for building internal tools." +og: + description: "Build internal tools on Coolify with Appsmith's low-code platform featuring drag-and-drop UI, database connectors, and custom business logic." +category: "Development" +icon: "/docs/images/services/appsmith-logo.svg" +--- + +# Appsmith + + + +## What is Appsmith + +Organizations build internal applications such as dashboards, database GUIs, admin panels, approval apps, customer support tools, etc. to help improve their business operations. + +Appsmith is an open-source developer tool that enables the rapid development of these applications. You can drag and drop pre-built widgets to build UI. + +Connect securely to your databases & APIs using its datasources. Write business logic to read & write data using queries & JavaScript. + +## Why Appsmith + +Appsmith makes it easy to build a UI that talks to any datasource. You can create anything from simple CRUD apps to complicated multi-step workflows with a few simple steps: + +- Connect Datasource: Integrate with a database or API. Appsmith supports the most popular databases and REST APIs. +- Build UI: Use built-in widgets to build your app layout. +- Write Logic: Express your business logic using queries and JavaScript anywhere in the editor. +- Collaborate, Deploy, Share: Appsmith supports version control using Git to build apps in collaboration using branches to track and roll back changes. Deploy the app and share it with other users. + +## Learning Resources + +- [Documentation](https://docs.appsmith.com?utm_source=coolify.io) +- [Tutorials](https://docs.appsmith.com/getting-started/tutorials?utm_source=coolify.io) +- [Videos](https://www.youtube.com/appsmith?utm_source=coolify.io) +- [Templates](https://www.appsmith.com/templates?utm_source=coolify.io) + +## Need Help? + +- [Discord](https://discord.gg/rBTTVJp?utm_source=coolify.io) +- [Community Portal](https://community.appsmith.com/?utm_source=coolify.io) +- [support@appsmith.com](mailto:support@appsmith.com) + +## Links + +- [The official website](https://www.appsmith.com?utm_source=coolify.io) +- [GitHub](https://github.com/appsmithorg/appsmith?utm_source=coolify.io) diff --git a/content/docs/services/appwrite.mdx b/content/docs/services/appwrite.mdx new file mode 100644 index 00000000..a70f36bd --- /dev/null +++ b/content/docs/services/appwrite.mdx @@ -0,0 +1,755 @@ +--- +title: Appwrite +description: "A backend-as-a-service platform that simplifies the web & mobile app development." +og: + description: "Deploy Appwrite BaaS on Coolify for authentication, databases, storage, serverless functions, and real-time APIs for web and mobile apps." +category: "Development" +icon: "/docs/images/services/appwrite-logo.svg" +# compose: +# services: +# appwrite: +# image: appwrite/appwrite:1.6.0 +# container_name: appwrite +# volumes: +# - appwrite-uploads:/storage/uploads:rw +# - appwrite-cache:/storage/cache:rw +# - appwrite-config:/storage/config:rw +# - appwrite-certificates:/storage/certificates:rw +# - appwrite-functions:/storage/functions:rw +# depends_on: +# - appwrite-mariadb +# - appwrite-redis +# environment: +# - SERVICE_FQDN_APPWRITE=/ +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_LOCALE=${_APP_LOCALE:-en} +# - _APP_CONSOLE_WHITELIST_ROOT=${_APP_CONSOLE_WHITELIST_ROOT:-enabled} +# - _APP_CONSOLE_WHITELIST_EMAILS=${_APP_CONSOLE_WHITELIST_EMAILS} +# - _APP_CONSOLE_WHITELIST_IPS=${_APP_CONSOLE_WHITELIST_IPS} +# - >- +# _APP_CONSOLE_HOSTNAMES=${_APP_CONSOLE_HOSTNAMES:-localhost,appwrite.io,*.appwrite.io} +# - _APP_SYSTEM_EMAIL_NAME=${_APP_SYSTEM_EMAIL_NAME:-Appwrite} +# - >- +# _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-team@appwrite.io} +# - _APP_SYSTEM_TEAM_EMAIL=${_APP_SYSTEM_TEAM_EMAIL:-team@appwrite.io} +# - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} +# - _APP_SYSTEM_RESPONSE_FORMAT=${_APP_SYSTEM_RESPONSE_FORMAT} +# - _APP_OPTIONS_ABUSE=${_APP_OPTIONS_ABUSE:-enabled} +# - >- +# _APP_OPTIONS_ROUTER_PROTECTION=${_APP_OPTIONS_ROUTER_PROTECTION:-disabled} +# - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} +# - >- +# _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=${_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS:-disabled} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_TARGET=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_FUNCTIONS=$SERVICE_URL_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_SMTP_HOST=${_APP_SMTP_HOST} +# - _APP_SMTP_PORT=${_APP_SMTP_PORT} +# - _APP_SMTP_SECURE=${_APP_SMTP_SECURE} +# - _APP_SMTP_USERNAME=${_APP_SMTP_USERNAME} +# - _APP_SMTP_PASSWORD=${_APP_SMTP_PASSWORD} +# - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} +# - _APP_STORAGE_LIMIT=${_APP_STORAGE_LIMIT:-30000000} +# - _APP_STORAGE_PREVIEW_LIMIT=${_APP_STORAGE_PREVIEW_LIMIT:-20000000} +# - _APP_STORAGE_ANTIVIRUS=${_APP_STORAGE_ANTIVIRUS:-disabled} +# - >- +# _APP_STORAGE_ANTIVIRUS_HOST=${_APP_STORAGE_ANTIVIRUS_HOST:-appwrite-clamav} +# - _APP_STORAGE_ANTIVIRUS_PORT=${_APP_STORAGE_ANTIVIRUS_PORT:-3310} +# - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} +# - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} +# - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} +# - _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} +# - _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} +# - _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} +# - _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} +# - >- +# _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1} +# - _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} +# - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} +# - _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} +# - >- +# _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004} +# - _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} +# - _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} +# - _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} +# - _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1} +# - _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} +# - _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} +# - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} +# - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} +# - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} +# - _APP_FUNCTIONS_SIZE_LIMIT=${_APP_FUNCTIONS_SIZE_LIMIT:-30000000} +# - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} +# - _APP_FUNCTIONS_BUILD_TIMEOUT=${_APP_FUNCTIONS_BUILD_TIMEOUT:-900} +# - _APP_FUNCTIONS_CPUS=${_APP_FUNCTIONS_CPUS:-0} +# - _APP_FUNCTIONS_MEMORY=${_APP_FUNCTIONS_MEMORY:-0} +# - >- +# _APP_FUNCTIONS_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES:-node-20.0,php-8.2,python-3.11,ruby-3.2} +# - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_MAINTENANCE_INTERVAL=${_APP_MAINTENANCE_INTERVAL:-86400} +# - _APP_MAINTENANCE_DELAY=${_APP_MAINTENANCE_DELAY} +# - >- +# _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION:-1209600} +# - >- +# _APP_MAINTENANCE_RETENTION_CACHE=${_APP_MAINTENANCE_RETENTION_CACHE:-2592000} +# - >- +# _APP_MAINTENANCE_RETENTION_ABUSE=${_APP_MAINTENANCE_RETENTION_ABUSE:-86400} +# - >- +# _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600} +# - >- +# _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=${_APP_MAINTENANCE_RETENTION_USAGE_HOURLY:-8640000} +# - >- +# _APP_MAINTENANCE_RETENTION_SCHEDULES=${_APP_MAINTENANCE_RETENTION_SCHEDULES:-86400} +# - _APP_SMS_PROVIDER=${_APP_SMS_PROVIDER} +# - _APP_SMS_FROM=${_APP_SMS_FROM} +# - _APP_GRAPHQL_MAX_BATCH_SIZE=${_APP_GRAPHQL_MAX_BATCH_SIZE:-10} +# - _APP_GRAPHQL_MAX_COMPLEXITY=${_APP_GRAPHQL_MAX_COMPLEXITY:-250} +# - _APP_GRAPHQL_MAX_DEPTH=${_APP_GRAPHQL_MAX_DEPTH:-3} +# - _APP_VCS_GITHUB_APP_NAME=${_APP_VCS_GITHUB_APP_NAME} +# - _APP_VCS_GITHUB_PRIVATE_KEY=${_APP_VCS_GITHUB_PRIVATE_KEY} +# - _APP_VCS_GITHUB_APP_ID=${_APP_VCS_GITHUB_APP_ID} +# - _APP_VCS_GITHUB_WEBHOOK_SECRET=${_APP_VCS_GITHUB_WEBHOOK_SECRET} +# - _APP_VCS_GITHUB_CLIENT_SECRET=${_APP_VCS_GITHUB_CLIENT_SECRET} +# - _APP_VCS_GITHUB_CLIENT_ID=${_APP_VCS_GITHUB_CLIENT_ID} +# - >- +# _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID} +# - >- +# _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET} +# - _APP_ASSISTANT_OPENAI_API_KEY=${_APP_ASSISTANT_OPENAI_API_KEY} +# appwrite-console: +# image: appwrite/console:5.0.12 +# container_name: appwrite-console +# environment: +# - SERVICE_FQDN_APPWRITE=/console +# appwrite-realtime: +# image: appwrite/appwrite:1.6.0 +# entrypoint: realtime +# container_name: appwrite-realtime +# depends_on: +# - appwrite-mariadb +# - appwrite-redis +# environment: +# - SERVICE_FQDN_APPWRITE=/v1/realtime +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPTIONS_ABUSE=${_APP_OPTIONS_ABUSE:-enabled} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# appwrite-worker-audits: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-audits +# container_name: appwrite-worker-audits +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# appwrite-worker-webhooks: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-webhooks +# container_name: appwrite-worker-webhooks +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} +# - >- +# _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=${_APP_SYSTEM_SECURITY_EMAIL_ADDRESS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# appwrite-worker-deletes: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-deletes +# container_name: appwrite-worker-deletes +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# volumes: +# - appwrite-uploads:/storage/uploads:rw +# - appwrite-cache:/storage/cache:rw +# - appwrite-functions:/storage/functions:rw +# - appwrite-builds:/storage/builds:rw +# - appwrite-certificates:/storage/certificates:rw +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} +# - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY:-local} +# - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} +# - _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} +# - _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} +# - _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} +# - _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} +# - >- +# _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1} +# - _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} +# - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} +# - _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} +# - >- +# _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004} +# - _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} +# - _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} +# - _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} +# - _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1} +# - _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} +# - _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} +# - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} +# - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} +# - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} +# - >- +# _APP_MAINTENANCE_RETENTION_ABUSE=${_APP_MAINTENANCE_RETENTION_ABUSE:-86400} +# - >- +# _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600} +# - >- +# _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION:-1209600} +# appwrite-worker-databases: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-databases +# container_name: appwrite-worker-databases +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# appwrite-worker-builds: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-builds +# container_name: appwrite-worker-builds +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# volumes: +# - appwrite-functions:/storage/functions:rw +# - appwrite-builds:/storage/builds:rw +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_VCS_GITHUB_APP_NAME=${_APP_VCS_GITHUB_APP_NAME} +# - _APP_VCS_GITHUB_PRIVATE_KEY=${_APP_VCS_GITHUB_PRIVATE_KEY} +# - _APP_VCS_GITHUB_APP_ID=${_APP_VCS_GITHUB_APP_ID} +# - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} +# - _APP_FUNCTIONS_BUILD_TIMEOUT=${_APP_FUNCTIONS_BUILD_TIMEOUT:-900} +# - _APP_FUNCTIONS_CPUS=${_APP_FUNCTIONS_CPUS:-0} +# - _APP_FUNCTIONS_MEMORY=${_APP_FUNCTIONS_MEMORY:-0} +# - _APP_FUNCTIONS_SIZE_LIMIT=${_APP_FUNCTIONS_SIZE_LIMIT:-30000000} +# - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} +# - >- +# _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=${_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS:-disabled} +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} +# - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY:-local} +# - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} +# - _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} +# - _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} +# - _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} +# - _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} +# - >- +# _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1} +# - _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} +# - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} +# - _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} +# - >- +# _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004} +# - _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} +# - _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} +# - _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} +# - _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1} +# - _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} +# - _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} +# - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} +# - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} +# - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} +# appwrite-worker-certificates: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-certificates +# container_name: appwrite-worker-certificates +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# volumes: +# - appwrite-config:/storage/config:rw +# - appwrite-certificates:/storage/certificates:rw +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_TARGET=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_FUNCTIONS=$SERVICE_URL_APPWRITE +# - _APP_EMAIL_CERTIFICATES=${_APP_EMAIL_CERTIFICATES:-enabled} +# - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# appwrite-worker-functions: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-functions +# container_name: appwrite-worker-functions +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# - openruntimes-executor +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} +# - _APP_FUNCTIONS_BUILD_TIMEOUT=${_APP_FUNCTIONS_BUILD_TIMEOUT:-900} +# - _APP_FUNCTIONS_CPUS=${_APP_FUNCTIONS_CPUS:-0} +# - _APP_FUNCTIONS_MEMORY=${_APP_FUNCTIONS_MEMORY:-0} +# - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} +# - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} +# - _APP_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME} +# - _APP_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# appwrite-worker-mails: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-mails +# container_name: appwrite-worker-mails +# depends_on: +# - appwrite-redis +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_SYSTEM_EMAIL_NAME=${_APP_SYSTEM_EMAIL_NAME:-Appwrite} +# - >- +# _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-team@appwrite.io} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_SMTP_HOST=${_APP_SMTP_HOST} +# - _APP_SMTP_PORT=${_APP_SMTP_PORT} +# - _APP_SMTP_SECURE=${_APP_SMTP_SECURE} +# - _APP_SMTP_USERNAME=${_APP_SMTP_USERNAME} +# - _APP_SMTP_PASSWORD=${_APP_SMTP_PASSWORD} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# appwrite-worker-messaging: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-messaging +# container_name: appwrite-worker-messaging +# volumes: +# - appwrite-uploads:/storage/uploads:rw +# depends_on: +# - appwrite-redis +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_SMS_FROM=${_APP_SMS_FROM} +# - _APP_SMS_PROVIDER=${_APP_SMS_PROVIDER} +# - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} +# - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} +# - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} +# - _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} +# - _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} +# - _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} +# - _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} +# - >- +# _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1} +# - _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} +# - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} +# - _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} +# - >- +# _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004} +# - _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} +# - _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} +# - _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} +# - _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1} +# - _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} +# - _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} +# - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} +# - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} +# - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} +# appwrite-worker-migrations: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-migrations +# container_name: appwrite-worker-migrations +# depends_on: +# - appwrite-mariadb +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_TARGET=$SERVICE_URL_APPWRITE +# - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - >- +# _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID} +# - >- +# _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET} +# appwrite-task-maintenance: +# image: appwrite/appwrite:1.6.0 +# entrypoint: maintenance +# container_name: appwrite-task-maintenance +# depends_on: +# - appwrite-redis +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_DOMAIN=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_TARGET=$SERVICE_URL_APPWRITE +# - _APP_DOMAIN_FUNCTIONS=$SERVICE_URL_APPWRITE +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_MAINTENANCE_INTERVAL=${_APP_MAINTENANCE_INTERVAL} +# - >- +# _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION} +# - >- +# _APP_MAINTENANCE_RETENTION_CACHE=${_APP_MAINTENANCE_RETENTION_CACHE:-2592000} +# - >- +# _APP_MAINTENANCE_RETENTION_ABUSE=${_APP_MAINTENANCE_RETENTION_ABUSE:-86400} +# - >- +# _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600} +# - >- +# _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=${_APP_MAINTENANCE_RETENTION_USAGE_HOURLY:-8640000} +# - >- +# _APP_MAINTENANCE_RETENTION_SCHEDULES=${_APP_MAINTENANCE_RETENTION_SCHEDULES:-86400} +# appwrite-worker-usage: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-usage +# container_name: appwrite-worker-usage +# restart: unless-stopped +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_USAGE_AGGREGATION_INTERVAL=${_APP_USAGE_AGGREGATION_INTERVAL:-30} +# appwrite-worker-usage-dump: +# image: appwrite/appwrite:1.6.0 +# entrypoint: worker-usage-dump +# container_name: appwrite-worker-usage-dump +# depends_on: +# - appwrite-redis +# - appwrite-mariadb +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} +# - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - _APP_USAGE_AGGREGATION_INTERVAL=${_APP_USAGE_AGGREGATION_INTERVAL:-30} +# appwrite-task-scheduler-functions: +# image: appwrite/appwrite:1.6.0 +# entrypoint: schedule-functions +# container_name: appwrite-task-scheduler-functions +# depends_on: +# - appwrite-mariadb +# - appwrite-redis +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# appwrite-task-scheduler-executions: +# image: appwrite/appwrite:1.6.0 +# entrypoint: schedule-executions +# container_name: appwrite-task-scheduler-executions +# depends_on: +# - appwrite-mariadb +# - appwrite-redis +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# appwrite-task-scheduler-messages: +# image: appwrite/appwrite:1.6.0 +# entrypoint: schedule-messages +# container_name: appwrite-task-scheduler-messages +# depends_on: +# - appwrite-mariadb +# - appwrite-redis +# environment: +# - _APP_ENV=${_APP_ENV:-production} +# - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} +# - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE +# - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} +# - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} +# - _APP_REDIS_USER=${_APP_REDIS_USER} +# - _APP_REDIS_PASS=${_APP_REDIS_PASS} +# - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} +# - _APP_DB_PORT=${_APP_DB_PORT:-3306} +# - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} +# - _APP_DB_USER=$SERVICE_USER_MARIADB +# - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB +# appwrite-assistant: +# image: appwrite/assistant:0.4.0 +# container_name: appwrite-assistant +# environment: +# - _APP_ASSISTANT_OPENAI_API_KEY=${_APP_ASSISTANT_OPENAI_API_KEY} +# openruntimes-executor: +# container_name: openruntimes-executor +# hostname: appwrite-executor +# stop_signal: SIGINT +# image: openruntimes/executor:0.6.11 +# networks: +# - runtimes +# volumes: +# - /var/run/docker.sock:/var/run/docker.sock +# - appwrite-builds:/storage/builds:rw +# - appwrite-functions:/storage/functions:rw +# - /tmp:/tmp:rw +# environment: +# - OPR_EXECUTOR_INACTIVE_THRESHOLD=${_APP_FUNCTIONS_INACTIVE_THRESHOLD} +# - >- +# OPR_EXECUTOR_MAINTENANCE_INTERVAL=${_APP_FUNCTIONS_MAINTENANCE_INTERVAL} +# - OPR_EXECUTOR_NETWORK=${_APP_FUNCTIONS_RUNTIMES_NETWORK:-runtimes} +# - OPR_EXECUTOR_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME} +# - OPR_EXECUTOR_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD} +# - OPR_EXECUTOR_ENV=${_APP_ENV:-production} +# - OPR_EXECUTOR_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES} +# - OPR_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE +# - OPR_EXECUTOR_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} +# - OPR_EXECUTOR_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} +# - >- +# OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY:-local} +# - OPR_EXECUTOR_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} +# - OPR_EXECUTOR_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION} +# - OPR_EXECUTOR_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} +# - >- +# OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} +# - OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} +# - OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION} +# - OPR_EXECUTOR_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} +# - >- +# OPR_EXECUTOR_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} +# - OPR_EXECUTOR_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} +# - OPR_EXECUTOR_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION} +# - OPR_EXECUTOR_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} +# - >- +# OPR_EXECUTOR_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} +# - OPR_EXECUTOR_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} +# - OPR_EXECUTOR_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION} +# - OPR_EXECUTOR_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} +# - >- +# OPR_EXECUTOR_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} +# - OPR_EXECUTOR_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} +# - OPR_EXECUTOR_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION} +# - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} +# appwrite-mariadb: +# image: mariadb:10.11 +# container_name: appwrite-mariadb +# volumes: +# - appwrite-mariadb:/var/lib/mysql:rw +# environment: +# - MYSQL_ROOT_PASSWORD=$SERVICE_PASSWORD_MARIADBROOT +# - MYSQL_DATABASE=${_APP_DB_SCHEMA:-appwrite} +# - MYSQL_USER=$SERVICE_USER_MARIADB +# - MYSQL_PASSWORD=$SERVICE_PASSWORD_MARIADB +# - MARIADB_AUTO_UPGRADE=1 +# command: mysqld --innodb-flush-method=fsync +# appwrite-redis: +# image: redis:7.2.4-alpine +# container_name: appwrite-redis +# command: > +# redis-server --maxmemory 512mb --maxmemory-policy +# allkeys-lru --maxmemory-samples 5 +# volumes: +# - appwrite-redis:/data:rw +# networks: +# runtimes: +# name: runtimes +# volumes: +# appwrite-mariadb: null +# appwrite-redis: null +# appwrite-cache: null +# appwrite-uploads: null +# appwrite-certificates: null +# appwrite-functions: null +# appwrite-builds: null +# appwrite-config: null +--- + +# Appwrite + + + +## What is Appwrite? + +Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker microservices. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster. + +Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and +file management, image manipulation, Cloud Functions, and [more services](https://appwrite.io/docs?utm_source=coolify.io). + +## Links + +- [The official website](https://appwrite.io?utm_source=coolify.io) +- [GitHub](https://github.com/appwrite/appwrite?utm_source=coolify.io) diff --git a/content/docs/services/argilla.mdx b/content/docs/services/argilla.mdx new file mode 100644 index 00000000..97768782 --- /dev/null +++ b/content/docs/services/argilla.mdx @@ -0,0 +1,23 @@ +--- +title: "Argilla" +description: "An open-source platform for building, training, and evaluating conversational AI models." +og: + description: "Host Argilla on Coolify for collaborative AI dataset creation, annotation, labeling, and feedback collection for machine learning projects." +category: "AI" +icon: "/docs/images/services/argilla-logo.svg" +--- + + + +## What is Argilla? + +Argilla is a collaboration tool for AI engineers and domain experts to build high-quality datasets. + +## Screenshots + + + +## Links + +- [The official website](https://argilla.io/?utm_source=coolify.io) +- [GitHub](https://github.com/argilla-io/argilla?utm_source=coolify.io) diff --git a/content/docs/services/audiobookshelf.mdx b/content/docs/services/audiobookshelf.mdx new file mode 100644 index 00000000..3b23d10f --- /dev/null +++ b/content/docs/services/audiobookshelf.mdx @@ -0,0 +1,20 @@ +--- +title: Audiobookshelf +description: "Self-hosted audiobook and podcast server." +og: + description: "Deploy Audiobookshelf on Coolify for self-hosted audiobook and podcast server with mobile apps, progress tracking, and streaming support." +category: "Media" +icon: "/docs/images/services/audiobookshelf-logo.svg" +--- + +# Audiobookshelf + + + +## What is Audiobookshelf + +Self-hosted audiobook, ebook, and podcast server + +## Links + +- [Official Documentation](https://www.audiobookshelf.org/?utm_source=coolify.io) diff --git a/content/docs/services/authentik.mdx b/content/docs/services/authentik.mdx new file mode 100644 index 00000000..f2bb5b10 --- /dev/null +++ b/content/docs/services/authentik.mdx @@ -0,0 +1,28 @@ +--- +title: "Authentik" +description: "An open-source Identity Provider, focused on flexibility and versatility." +og: + description: "Run Authentik identity provider on Coolify with SSO, LDAP, OAuth2, SAML support for unified authentication and user management across apps." +category: "Security" +icon: "/docs/images/services/authentik-logo.png" +--- + + + +## What is authentik? + +Authentik is an open-source Identity Provider that emphasizes flexibility and versatility. It can be seamlessly integrated into existing environments to support new protocols. + +Authentik is also a great solution for implementing sign-up, recovery, and other similar features in your application, saving you the hassle of dealing with them. + +## Screenshots + +| Light | Dark | +| ----------------------------------------------------------- | ---------------------------------------------------------- | +| | | +| | | + +## Links + +- [The official website](https://goauthentik.io?utm_source=coolify.io) +- [GitHub](https://github.com/goauthentik/authentik?utm_source=coolify.io) diff --git a/content/docs/services/autobase.mdx b/content/docs/services/autobase.mdx new file mode 100644 index 00000000..887abc74 --- /dev/null +++ b/content/docs/services/autobase.mdx @@ -0,0 +1,36 @@ +--- +title: "Autobase" +description: "Open-source alternative to cloud-managed databases for PostgreSQL (self-hosted DBaaS)." +og: + description: "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS)." +category: "Database" +icon: "/docs/images/services/autobase-logo.svg" +--- + +# Autobase + + + +## What is Autobase? + +**Autobase for PostgreSQL®** is an open-source alternative to cloud-managed databases (DBaaS) such as Amazon RDS, Google Cloud SQL, Azure Database, and others. + +This automated database platform enables you to create and manage production-ready, highly available PostgreSQL clusters. It simplifies the deployment process, reduces operational costs, and makes database management accessible even for teams without specialized expertise. + +*Automate deployment, failover, backups, restore, upgrades, scaling, and more with ease.* + +Say goodbye to manual database management 👋 + +## Demo + +[https://demo.autobase.tech/](https://demo.autobase.tech/?utm_source=coolify.io) + +Note: use the token *demo* to access. + + + +## Links + +- [Official Website](https://autobase.tech/?utm_source=coolify.io) +- [Documentation](https://autobase.tech/docs?utm_source=coolify.io) +- [GitHub](https://github.com/vitabaks/autobase?utm_source=coolify.io) diff --git a/content/docs/services/babybuddy.mdx b/content/docs/services/babybuddy.mdx new file mode 100644 index 00000000..a9dc1498 --- /dev/null +++ b/content/docs/services/babybuddy.mdx @@ -0,0 +1,32 @@ +--- +title: "BabyBuddy" +description: "It helps parents track their baby's daily activities, growth, and health with ease." +og: + description: "Track baby care on Coolify with Baby Buddy featuring feeding, diaper changes, sleep schedules, growth charts, and caregiver coordination." +category: "Health" +icon: "/docs/images/services/babybuddy-logo.png" +--- + + + +## What is BabyBuddy? + +A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (_as much_) guess work. + +## Screenshots + + + + +## Demo + +A [demo of Baby Buddy](https://demo.baby-buddy.net?utm_source=coolify.io) is available. The demo instance +resets every hour. Login credentials are: + +- Username: `admin` +- Password: `admin` + +## Links + +- [The official website](https://docs.baby-buddy.net?utm_source=coolify.io) +- [GitHub](https://github.com/babybuddy/babybuddy?utm_source=coolify.io) diff --git a/content/docs/services/bento-pdf.mdx b/content/docs/services/bento-pdf.mdx new file mode 100644 index 00000000..825f8d97 --- /dev/null +++ b/content/docs/services/bento-pdf.mdx @@ -0,0 +1,40 @@ +--- +title: "BentoPDF" +description: "Process PDFs entirely in your browser. No uploads. No servers. Complete privacy." +og: + description: "Process PDFs entirely in your browser. No uploads. No servers. Complete privacy." +category: "Productivity" +icon: "/docs/images/services/bento-pdf.png" +--- + +# BentoPDF + + + +## What is BentoPDF? + +The PDF Toolkit built for privacy. + +- No Signup + - Start instantly, no accounts or emails. + +- No Uploads + - 100% client-side, your files never leave your device. + +- Forever Free + - All tools, no trials, no paywalls. + +- No Limits + - Use as much as you want, no hidden caps. + +- Batch Processing + - Handle unlimited PDFs in one go. + +- Lightning Fast + - Process PDFs instantly, without waiting or delays. + +## Links + +- [Official website](https://www.bentopdf.com?utm_source=coolify.io) +- [Documentation](https://bentopdf.com/docs?utm_source=coolify.io) +- [GitHub](https://github.com/alam00000/bentopdf?utm_source=coolify.io) \ No newline at end of file diff --git a/content/docs/services/beszel.mdx b/content/docs/services/beszel.mdx new file mode 100644 index 00000000..545901a7 --- /dev/null +++ b/content/docs/services/beszel.mdx @@ -0,0 +1,69 @@ +--- +title: "Beszel" +description: "Lightweight server monitoring hub with historical data, docker stats, and alerts." +og: + description: "Deploy Beszel lightweight server monitoring on Coolify with real-time metrics, Docker stats, and minimal resource usage for infrastructure tracking." +category: "Monitoring" +icon: "/docs/images/services/beszel-logo.svg" +--- + + + +## What is Beszel? + +Lightweight server monitoring hub with historical data, docker stats, and alerts. + + + +## Setup + +### 1. Deploy Beszel +Create a new resource on Coolify and search for `Beszel` and select the template `Beszel` (you can select `Beszel Agent` if you only want to deploy the agent) + +Then click the deploy button and wait for it to deploy. + +When you deploy Beszel with Agent for first time the beszel-agent will be unhealthy and be in restarting state, this is normal and expected because it needs some additional steps to setup which are explained below. + + + + +### 2. Add System on Beszel dashboard +Visit the Beszel URL and create your first admin account on the Beszel dashboard. + +After creating the account, click the "**Add a new System**" button in the top corner. + + + + +
+ + + +- Give a name for the Agent +- Enter `beszel-agent` as the Host/IP if you are using the **Beszel** template; if you are using the **Beszel Agent** template, then enter the IP address of the server where the agent is deployed +- Copy the value of `Public Key` and `Token`, then click on "Add system" + +### 3. Set KEY and TOKEN environment variables on Coolify +Go to the **Environment Variables** on Coolify and enter the value for `KEY` and `TOKEN` variables. These are the Public Key and Token you copied from the Beszel dashboard in the previous step. + + + +### 4. Restart Beszel +After you set the environment variables (previous step), restart Beszel by clicking the restart button. + +Once it’s restarted, the `beszel-agent` service will become healthy and the Beszel dashboard will start showing data. + + + + +If you are using Coolify version below v4.0.0-beta.452, disable gzip compression in the hub service settings. + +Go to the Beszel service in Coolify, click "settings", and uncheck the `gzip compression` option. + + + + +## Links + +- [Official Website](https://beszel.dev?utm_source=coolify.io) +- [GitHub](https://github.com/henrygd/beszel?utm_source=coolify.io) diff --git a/content/docs/services/bitcoin-core.mdx b/content/docs/services/bitcoin-core.mdx new file mode 100644 index 00000000..d11f67b4 --- /dev/null +++ b/content/docs/services/bitcoin-core.mdx @@ -0,0 +1,58 @@ +--- +title: Bitcoin Core +description: "Bitcoin Core full node software." +og: + description: "Run Bitcoin Core full node on Coolify for decentralized cryptocurrency network participation, wallet management, and blockchain validation." +category: "Crypto" +icon: "/docs/images/services/bitcoin-logo.svg" +--- + +# Bitcoin Core + + + +## What is Bitcoin Core + +A self-hosted Bitcoin Core full node. + +## Public Node vs. Private Use + +By default, Coolify’s Bitcoin Core service is configured for private/internal use. This means it is intended for connecting wallets or apps from the same server or private network, and **does not accept inbound P2P connections from the public internet**. This is a security-conscious default to help reduce the attack surface, especially for new users. + +### How to Run a Public Node + +If you want your Bitcoin node to be a fully public peer (accepting inbound connections from other nodes): + +1. **Expose the P2P port in your Compose file:** + Add the following under your `bitcoin-core` service: + ```text + ports: + - "8333:8333" + ``` + +2. **Open port 8333 in your server’s firewall:** +- On Ubuntu with UFW: + ```bash + sudo ufw allow 8333/tcp + ``` +- On CentOS with firewalld: + ```bash + sudo firewall-cmd --add-port=8333/tcp --permanent + sudo firewall-cmd --reload + ``` +- For cloud servers, update your provider’s security group or firewall rules to allow inbound TCP on port 8333. + +### Considerations + +- **Default Behavior:** +Without the `ports` section, your node will not accept inbound P2P connections, but can still make outbound connections and fully sync the blockchain. +- **Security:** +Not exposing 8333 by default helps protect users who may not understand the implications of running a public Bitcoin node. +- **Advanced Users:** +If you understand the risks and want to contribute more fully to the Bitcoin network, follow the steps above to run a public node. + +## Links + +- [Official Documentation](https://hub.docker.com/r/ruimarinho/bitcoin-core/?utm_source=coolify.io) + + diff --git a/content/docs/services/bluesky-pds.mdx b/content/docs/services/bluesky-pds.mdx new file mode 100644 index 00000000..821e5c32 --- /dev/null +++ b/content/docs/services/bluesky-pds.mdx @@ -0,0 +1,61 @@ +--- +title: "Bluesky PDS" +description: "Bluesky PDS (Personal Data Server) for decentralized social networking." +og: + description: "Host a Bluesky Personal Data Server with Coolify" +category: "Social Media" +icon: "/docs/images/services/bluesky-logo.svg" +--- + +# Bluesky PDS + + + +## What is a Bluesky PDS? + +Bluesky PDS (Personal Data Server) is a self-hosted data server that stores your data in the AT Protocol network. It allows you to control your own social media data and identity while still participating in the AT Protocol network. The PDS handles user accounts, posts, followers, and other social data in a decentralized manner. + +## Setting a domain with https if already not set + +Pdsadmin requires you to have https in your Bluesky PDS, make sure you have set a domain with https in the Coolify UI and check the environment variables so it matches it. + +## Creating an account in your PDS + +To create an account and start using your PDS, you can use the following pdsadmin commands in the Terminal tab of the Coolify UI: + +```bash +pdsadmin create-invite-code +``` + +or + +```bash +pdsadmin account create +``` + +To check for other available commands in pdsadmin, you can simply run `pdsadmin` + +## Setting up mail + +Mailing is important for a Bluesky PDS, it's needed to confirm email, and other things! + +You need to edit 2 environment variables in the Coolify UI, head to the Environment Variables tab and look for the `PDS_EMAIL_FROM_ADDRESS`, what you need to fill here is pretty much self explanatory, is the email address that's going to be used when sending an email, for example: `user@domain.com` + +The next environment variable is `PDS_EMAIL_SMTP_URL`, this one is not very self explanatory, but here's how to fill it: + +There are many ways to fill this variable, here are some examples: + +`smtps://user%40example.com:password@mail.example.com:465` (SMTP with SSL) + +`smtp://user%40example.com:password@mail.example.com:587` (SMTP without SSL) + +`smtps://resend:@smtp.resend.com:465` (Resend) + +You might need to URL-encode your username and password for the Mail Setup to work. + +And that's it, your PDS should be ready for you to use, it will work like any other PDS! + +## Links + +- [The official website](https://blueskyweb.xyz?utm_source=coolify.io) +- [GitHub](https://github.com/bluesky-social/pds?utm_source=coolify.io) diff --git a/content/docs/services/booklore.mdx b/content/docs/services/booklore.mdx new file mode 100644 index 00000000..da487f2c --- /dev/null +++ b/content/docs/services/booklore.mdx @@ -0,0 +1,30 @@ +--- +title: "Booklore" +description: "Open-source library management system for your digital book collection." +og: + description: "Booklore is an open-source library management system for your digital book collection." +category: "Media" +icon: "/docs/images/services/booklore-logo.svg" +--- + +# Booklore + + + + + + +This service has been removed from Coolify. BookLore is no longer maintained by its authors and removed by the authors from GitHub. + + + + +## What is Booklore? + +Booklore is an open-source library management system that gives you complete control over your digital book collection. Your books and data stay on your own server, ensuring privacy and independence. + +## Links + +- [Official Website](https://booklore.org/?utm_source=coolify.io) +- [Documentation](https://booklore.org/docs/getting-started?utm_source=coolify.io) +- [GitHub](https://github.com/booklore-app/booklore?utm_source=coolify.io) diff --git a/content/docs/services/bookstack.mdx b/content/docs/services/bookstack.mdx new file mode 100644 index 00000000..4b0a7159 --- /dev/null +++ b/content/docs/services/bookstack.mdx @@ -0,0 +1,20 @@ +--- +title: Bookstack +description: "Self-hosted wiki-style documentation platform." +og: + description: "Deploy BookStack wiki on Coolify for organized documentation with WYSIWYG editor, hierarchical structure, search, and team collaboration features." +category: "Documentation" +icon: "/docs/images/services/bookstack-logo.png" +--- + +# Bookstack + + + +## What is Bookstack + +BookStack is a simple, self-hosted, easy-to-use platform for organising and storing information + +## Links + +- [Official Documentation](https://www.bookstackapp.com/docs/?utm_source=coolify.io) diff --git a/content/docs/services/browserless.mdx b/content/docs/services/browserless.mdx new file mode 100644 index 00000000..a1c22c18 --- /dev/null +++ b/content/docs/services/browserless.mdx @@ -0,0 +1,50 @@ +--- +title: "Browserless" +description: "Headless Chrome as a service." +og: + description: "Run Browserless on Coolify for headless Chrome automation, web scraping, PDF generation, and screenshot services via simple REST API." +category: "Development" +icon: "/docs/images/services/browserless-logo.svg" +--- + + + +## What is Browserless + +Browserless is a platform that provides headless browser automation and management services. It allows developers to run automated browser tasks without the need for manual intervention, making it ideal for web scraping, testing, and rendering tasks. + +## Example use cases + +- Web Scraping: Automate the collection of data from websites, such as product prices, news articles, or social media content, without worrying about CAPTCHAs, JavaScript rendering, or rate limits. + +- Automated Testing: Run browser-based tests for web applications using tools like Puppeteer or Selenium to check functionality, compatibility, and performance across different browsers. + +- PDF Generation: Convert webpages or HTML content into PDFs automatically, which is useful for invoicing, reporting, or archiving purposes. + +- Website Monitoring: Automate the monitoring of websites for uptime, broken links, or content changes, ensuring everything is functioning as expected without manually visiting the site. + +- SEO Audits: Use Browserless to run scripts that crawl your website, analyzing metadata, tags, and other factors that impact SEO, ensuring your site follows best practices. + +## Key Features + +- Headless Browser Automation: Supports running headless browsers, automating tasks with Puppeteer, Playwright, and Selenium without manual browser operation. + +- Cloud-Based Infrastructure: Run scripts in the cloud, reducing the need to manage your own browser environments and infrastructure. + +- Pre-Built APIs: Offers APIs for common tasks like screenshotting, PDF generation, and web scraping, simplifying integration. + +- Scalability: Easily scale automation tasks across many concurrent browser sessions. + +- Logging & Debugging Tools: Detailed logging and debugging tools for tracking and troubleshooting automated browser sessions. + +## Images + + + +## Links + +- [The official website](https://www.browserless.io?utm_source=coolify.io) +- [Documentation](https://docs.browserless.io?utm_source=coolify.io) +- [GitHub](https://github.com/browserless?utm_source=coolify.io) +- [Api Documentation](https://docs.browserless.io/docs/api.html?utm_source=coolify.io) +- [Pricing](https://www.browserless.io/pricing?utm_source=coolify.io) diff --git a/content/docs/services/budge.mdx b/content/docs/services/budge.mdx new file mode 100644 index 00000000..c2bdda2b --- /dev/null +++ b/content/docs/services/budge.mdx @@ -0,0 +1,37 @@ +--- +title: "BudgE" +description: "A budgeting personal finance app." +og: + description: "Manage finances with Budge on Coolify offering budget tracking, expense categorization, financial goals, and spending insights for personal finance." +category: "Finance" +icon: "/docs/images/services/budge-logo.png" +--- + +## What is BudgE? + +BudgE (pronounced "budgie", like the bird) is an open source "budgeting with envelopes" personal finance app, taking inspiration from other tools such as [Aspire Budgeting](https://www.aspirebudget.com?utm_source=coolify.io), [budgetzero](https://budgetzero.io?utm_source=coolify.io), and [Buckets](https://www.budgetwithbuckets.com/?utm_source=coolify.io). + +## Current Features + +- Multi user support +- Envelope budgeting with monthly rollover +- Transaction management for accounts +- Standard bank account management +- Credit card management with payment handling +- Tracking accounts +- Export account transactions +- CSV transaction import + +## Screenshots + + + + + +## Support + +- [Discord](https://discord.gg/hKJWjDqCBz) + +## Links + +- [GitHub](https://github.com/linuxserver/budge?utm_source=coolify.io) diff --git a/content/docs/services/budibase.mdx b/content/docs/services/budibase.mdx new file mode 100644 index 00000000..fe43aa68 --- /dev/null +++ b/content/docs/services/budibase.mdx @@ -0,0 +1,20 @@ +--- +title: Budibase +description: "Low-code platform for building internal tools and business apps." +og: + description: "Build internal apps on Coolify with Budibase low-code platform featuring database integration, workflow automation, and custom business applications." +category: "Development" +icon: "/docs/images/services/budibase-logo.svg" +--- + +# Budibase + + + +## What is Budibase + +Low code platform for building business apps and workflows in minutes. Supports PostgreSQL, MySQL, MSSQL, MongoDB, Rest API, Docker, K8s, and more. + +## Links + +- [Official Documentation](https://docs.budibase.com/docs/docker-compose?utm_source=coolify.io) diff --git a/content/docs/services/bugsink.mdx b/content/docs/services/bugsink.mdx new file mode 100644 index 00000000..66b1cfb6 --- /dev/null +++ b/content/docs/services/bugsink.mdx @@ -0,0 +1,28 @@ +--- +title: "Bugsink" +description: "Self-hosted Error Tracking" +og: + description: "Deploy Bugsink error tracking on Coolify for application monitoring, exception logging, stack traces, and debugging insights for development teams." +category: "Development" +icon: "/docs/images/services/bugsink-logo.webp" +--- + + + +## What is Bugsink? + +[Bugsink](https://www.bugsink.com/?utm_source=coolify.io) offers [error tracking](https://www.bugsink.com/error-tracking/?utm_source=coolify.io) for your applications with +full control through self-hosting. + +- [Built to self-host](https://www.bugsink.com/built-to-self-host/?utm_source=coolify.io) +- [Sentry-SDK compatible](https://www.bugsink.com/sentry-sdk-compatible/?utm_source=coolify.io) +- [Scalable and reliable](https://www.bugsink.com/scalable-and-reliable/?utm_source=coolify.io) + +## Screenshots + + + +## Links + +- [The official website](https://www.bugsink.com/?utm_source=coolify.io) +- [GitHub](https://github.com/bugsink/bugsink/?utm_source=coolify.io) diff --git a/content/docs/services/calcom.mdx b/content/docs/services/calcom.mdx new file mode 100644 index 00000000..000d3a4a --- /dev/null +++ b/content/docs/services/calcom.mdx @@ -0,0 +1,54 @@ +--- +title: Calcom +description: "Open-source Calendly alternative for scheduling meetings." +og: + description: "Host Cal.com scheduling platform on Coolify with calendar integration, team booking, payment processing, and customizable appointment workflows." +category: "Productivity" +icon: "/docs/images/services/calcom-logo.svg" +disabled: true +--- + +# Calcom + + + + +This service has been removed from Coolify’s one-click service catalog. More info on https://github.com/coollabsio/coolify/pull/9776 + + + + + + + +## What is Calcom + +Scheduling infrastructure for everyone. + +## Deploying on x86 (amd64) + +You need to change default docker compose to the following to make cal.com work on x86 (amd64): + +```yaml +services: + calcom: + image: 'calcom/cal.com: + platform: linux/amd64 + (... same ...) +``` + +You can check the latest amd64 compatible version [here](https://hub.docker.com/r/calcom/cal.com/tags). + +Example: + +```yaml +services: + calcom: + image: 'calcom/cal.com:v5.9.0 + platform: linux/amd64 + (... same ...) +``` + +## Links + +- [Official Documentation](https://cal.com/docs/developing/introduction?utm_source=coolify.io) diff --git a/content/docs/services/calibre-web-automated-with-downloader.mdx b/content/docs/services/calibre-web-automated-with-downloader.mdx new file mode 100644 index 00000000..a52d281e --- /dev/null +++ b/content/docs/services/calibre-web-automated-with-downloader.mdx @@ -0,0 +1,27 @@ +--- +title: Calibre Web Automated with Downloader +description: "Intuitive web interface for searching and requesting book downloads with Calibre-Web-Automated." +og: + description: "An intuitive web interface for searching and requesting book downloads, designed to work seamlessly with Calibre-Web-Automated." +category: "Media" +icon: "/docs/images/services/calibre-web-automated-with-downloader.png" +--- +# What is Calibre Web Automated with Downloader + + + +## Calibre Web Automated + +Calibre, while a fantastic tool for its age, has several problems when containerised, including its reliance on a KasmVNC server instance for the UI, which is near impossible to use on mobile and is relatively resource-heavy if you're running a small, lower power server like I am. + +### Links + +- [GitHub](https://github.com/crocodilestick/Calibre-Web-Automated) + +## Downloader + +An intuitive web interface for searching and requesting book downloads, designed to work seamlessly with Calibre-Web-Automated. This project streamlines the process of downloading books and preparing them for integration into your Calibre library. + +### Links + +- [GitHub](https://github.com/calibrain/calibre-web-automated-book-downloader) diff --git a/content/docs/services/calibre-web.mdx b/content/docs/services/calibre-web.mdx new file mode 100644 index 00000000..972f3ff7 --- /dev/null +++ b/content/docs/services/calibre-web.mdx @@ -0,0 +1,20 @@ +--- +title: Calibre Web +description: "Web app for browsing, reading and downloading eBooks from a Calibre database." +og: + description: "Run Calibre Web on Coolify for ebook library management with OPDS feeds, reading interface, format conversion, and metadata editing features." +category: "Media" +icon: "/docs/images/services/calibreweb-logo.svg" +--- + +# Calibre Web + + + +## What is Calibre Web + +Calibre web is a web app providing a clean interface for browsing, reading and downloading eBooks. + +## Links + +- [Official Documentation](https://github.com/linuxserver/docker-calibre-web?utm_source=coolify.io) diff --git a/content/docs/services/cap-captcha.mdx b/content/docs/services/cap-captcha.mdx new file mode 100644 index 00000000..98024b27 --- /dev/null +++ b/content/docs/services/cap-captcha.mdx @@ -0,0 +1,25 @@ +--- +title: "Cap (CAPTCHA)" +description: "The self-hosted CAPTCHA for the modern web." +og: + description: "Deploy Cap on Coolify as a self-hosted CAPTCHA alternative using proof-of-work and JavaScript challenges for enhanced security and user experience." +icon: "/docs/images/services/cap-captcha.png" +category: "Security" +--- + +# Cap + + + +## What is Cap? + +[Cap](https://capjs.js.org/?utm_source=coolify.io) is a modern, lightweight, and self-hosted CAPTCHA alternative using SHA-256 proof-of-work and JavaScript instrumentation challenges. + +## Screenshots + + + +## Links + +- [Official website](https://capjs.js.org/?utm_source=coolify.io) +- [GitHub](https://github.com/tiagozip/cap?utm_source=coolify.io) diff --git a/content/docs/services/cap.mdx b/content/docs/services/cap.mdx new file mode 100644 index 00000000..df173998 --- /dev/null +++ b/content/docs/services/cap.mdx @@ -0,0 +1,75 @@ +--- +title: "Cap" +description: "Cap is the open source alternative to Loom. Lightweight, powerful, and cross-platform. Record and share in seconds." +og: + description: "Here you can find the documentation for hosting Cap with Coolify." +category: "Media" +icon: "/docs/images/services/cap.svg" +--- + + + +## What is Cap? + +Cap is the open source alternative to Loom. Lightweight, powerful, and cross-platform. Record and share in seconds. + +## How to self-host + +There are two storage options: you can store the video data on a remote storage service like S3 or R2, or you can choose the less recommended option of storing it directly on the local VPS (or another VPS) via a MinIO service. + +### Option 1: Remote S3-compatible storage (AWS S3, Cloudflare R2, etc.) + +Set these environment variables: + +- `CAP_AWS_ACCESS_KEY`: Your S3/R2 access key +- `CAP_AWS_SECRET_KEY`: Your S3/R2 secret key +- `CAP_AWS_BUCKET`: Your S3/R2 bucket name +- `CAP_AWS_REGION`: Your S3/R2 region (e.g., us-east-1, auto for R2) +- `CAP_AWS_ENDPOINT`: Your S3/R2 endpoint URL +- `S3_PUBLIC_ENDPOINT`: Public endpoint for your bucket (same as CAP_AWS_ENDPOINT for most cases) +- `S3_INTERNAL_ENDPOINT`: Internal endpoint (same as CAP_AWS_ENDPOINT for most cases) +- `S3_PATH_STYLE`: true for R2/most S3-compatible, false for AWS S3 virtual-hosted style + +### Option 2: Local MinIO storage + +Deploy MinIO as a separate service in the same network and set: + +- `CAP_AWS_ACCESS_KEY`: MinIO root user +- `CAP_AWS_SECRET_KEY`: MinIO root password +- `CAP_AWS_BUCKET`: Your bucket name (e.g., capso) +- `CAP_AWS_REGION`: us-east-1 (or any region) +- `CAP_AWS_ENDPOINT`: http://minio:9000 (internal MinIO endpoint) +- `S3_PUBLIC_ENDPOINT`: http://your-minio-domain:9000 (public MinIO endpoint) +- `S3_INTERNAL_ENDPOINT`: http://minio:9000 (internal MinIO endpoint) +- `S3_PATH_STYLE`: true + +## Email Login Links + +If the `RESEND_API_KEY` and `RESEND_FROM_DOMAIN` environment variables are not set, login links will be written to the server logs. To send login links via email, you'll need to configure [Resend](https://resend.com): + +1. Create an account at [Resend](https://resend.com) +2. Connect a domain and set it as `RESEND_FROM_DOMAIN` +3. Generate an API key and set it as `RESEND_API_KEY` + +## How to unlock limits (organization seats and recordings) + + +1. Open the terminal of the MySQL service +2. Connect to the database: `mysql -u root -p planetscale` and use the `MYSQL_ROOT_PASSWORD` when prompted +3. Run the SQL command below, replacing `your-user-id` with your actual user ID + ```sql + UPDATE users SET inviteQuota = 100, stripeSubscriptionId = '12345', subscriptionStatus = 'active' WHERE id = 'your-user-id'; + ``` +4. You can verify the changes by running the following command: + ```sql + SELECT * FROM users WHERE id = 'your-user-id'; + ``` + +## Screenshots + + + +## Links + +- [The official website ›](https://cap.so/) +- [GitHub ›](https://github.com/CapSoftware/Cap) diff --git a/content/docs/services/castopod.mdx b/content/docs/services/castopod.mdx new file mode 100644 index 00000000..b0c469f2 --- /dev/null +++ b/content/docs/services/castopod.mdx @@ -0,0 +1,20 @@ +--- +title: Castopod +description: "Open-source podcast hosting platform." +og: + description: "Deploy Castopod podcast hosting on Coolify with RSS feeds, analytics, social features, and fediverse integration for independent podcasters." +category: "Media" +icon: "/docs/images/services/castopod-logo.svg" +--- + +# Castopod + + + +## What is Castopod + +Castopod is a free & open-source hosting platform made for podcasters who want to engage and interact with their audience. + +## Links + +- [Official Documentation](https://docs.castopod.org/main/en/?utm_source=coolify.io) diff --git a/content/docs/services/changedetection.mdx b/content/docs/services/changedetection.mdx new file mode 100644 index 00000000..3e47854f --- /dev/null +++ b/content/docs/services/changedetection.mdx @@ -0,0 +1,62 @@ +--- +title: "Change Detection" +description: "Website change detection monitor and notifications." +og: + description: "Monitor website changes on Coolify with Change Detection featuring automatic tracking, alerts, visual diffs, and API endpoint monitoring." +category: "Monitoring" +icon: "/docs/images/services/changedetection-logo.png" +--- + + + +## What is Change Detection? + +Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more. + +Live your data-life pro-actively. + +## Example use cases + +- Products and services have a change in pricing +- _Out of stock notification_ and _Back In stock notification_ +- Monitor and track PDF file changes, know when a PDF file has text changes. +- Governmental department updates (changes are often only on their websites) +- New software releases, security advisories when you're not on their mailing list. +- Festivals with changes +- Discogs restock alerts and monitoring +- Realestate listing changes +- Know when your favourite whiskey is on sale, or other special deals are announced before anyone else +- COVID related news from government websites +- University/organisation news from their website +- Detect and monitor changes in JSON API responses +- JSON API monitoring and alerting +- Changes in legal and other documents +- Trigger API calls via notifications when text appears on a website +- Glue together APIs using the JSON filter and JSON notifications +- Create RSS feeds based on changes in web content +- Monitor HTML source code for unexpected changes, strengthen your PCI compliance +- You have a very sensitive list of URLs to watch and you do _not_ want to use the paid alternatives. (Remember, _you_ are the product) +- Get notified when certain keywords appear in Twitter search results +- Proactively search for jobs, get notified when companies update their careers page, search job portals for keywords. +- Get alerts when new job positions are open on Bamboo HR and other job platforms +- Website defacement monitoring +- Pokémon Card Restock Tracker / Pokémon TCG Tracker +- RegTech - stay ahead of regulatory changes, regulatory compliance + +## Key Features + +- Lots of trigger filters, such as "Trigger on text", "Remove text by selector", "Ignore text", "Extract text", also using regular-expressions! +- Target elements with xPath(1.0) and CSS Selectors, Easily monitor complex JSON with JSONPath or jq +- Switch between fast non-JS and Chrome JS based "fetchers" +- Track changes in PDF files (Monitor text changed in the PDF, Also monitor PDF filesize and checksums) +- Easily specify how often a site should be checked +- Execute JS before extracting text (Good for logging in, see examples in the UI!) +- Override Request Headers, Specify `POST` or `GET` and other methods +- Use the "Visual Selector" to help target specific elements +- Configurable [proxy per watch](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration?utm_source=coolify.io) +- Send a screenshot with the notification when a change is detected in the web page. + +## Links + +- [The official website](https://changedetection.io?utm_source=coolify.io) +- [GitHub](https://github.com/dgtlmoon/changedetection.io?utm_source=coolify.io) diff --git a/content/docs/services/chaskiq.mdx b/content/docs/services/chaskiq.mdx new file mode 100644 index 00000000..ad899fab --- /dev/null +++ b/content/docs/services/chaskiq.mdx @@ -0,0 +1,19 @@ +--- +title: "Chaskiq" +description: "Open source customer engagement platform." +og: + description: "Run Chaskiq customer engagement platform on Coolify with live chat, email campaigns, knowledge base, and conversational marketing automation." +category: "Business" +icon: "/docs/images/services/chaskiq-logo.png" +--- + + + +## What is Chaskiq? + +Chaskiq is an open source chat platform that allows you to chat with your customers. + +## Links + +- [The official website](https://chaskiq.io?utm_source=coolify.io) +- [GitHub](https://github.com/chaskiq/chaskiq?utm_source=coolify.io) diff --git a/content/docs/services/chatwoot.mdx b/content/docs/services/chatwoot.mdx new file mode 100644 index 00000000..1ba8065d --- /dev/null +++ b/content/docs/services/chatwoot.mdx @@ -0,0 +1,19 @@ +--- +title: "Chatwoot" +description: "Open-source customer engagement suite." +og: + description: "Deploy Chatwoot customer support on Coolify with omnichannel inbox, live chat widgets, automation rules, and team collaboration for helpdesk." +category: "Business" +icon: "/docs/images/services/chatwoot-logo.svg" +--- + + + +## What is Chatwoot? + +Chatwoot gives you all the tools to manage conversations, build relationships and delight your customers from one place. + +## Links + +- [The official website](https://www.chatwoot.com?utm_source=coolify.io) +- [GitHub](https://github.com/chatwoot/chatwoot?utm_source=coolify.io) diff --git a/content/docs/services/checkmate.mdx b/content/docs/services/checkmate.mdx new file mode 100644 index 00000000..b05458d7 --- /dev/null +++ b/content/docs/services/checkmate.mdx @@ -0,0 +1,20 @@ +--- +title: Checkmate +description: "Website monitoring and uptime service." +og: + description: "Host Checkmate monitoring on Coolify for uptime checks, SSL certificate tracking, domain expiration alerts, and infrastructure health monitoring." +category: "Monitoring" +icon: "/docs/images/services/checkmate-logo.png" +--- + +# Checkmate + + + +## What is Checkmate + +An open source server monitoring application + +## Links + +- [Official Documentation](https://bluewavelabs.gitbook.io/checkmate?utm_source=coolify.io) diff --git a/content/docs/services/chibisafe.mdx b/content/docs/services/chibisafe.mdx new file mode 100644 index 00000000..d9b5b56d --- /dev/null +++ b/content/docs/services/chibisafe.mdx @@ -0,0 +1,22 @@ +--- +title: "Chibisafe" +description: "A beautiful and performant vault to save all your files in the cloud." +og: + description: "A beautiful and performant vault to save all your files in the cloud." +category: "File Management" +icon: "/docs/images/services/chibisafe-logo.svg" +--- + +# Chibisafe + + + +## What is Chibisafe? + +Chibisafe is a beautiful and performant vault to save all your files in the cloud. A modern and self-hosted take on file uploading services that can handle anything you throw at it thanks to it's robust and fast API, chunked uploads support and more. + +## Links + +- [Official website](https://chibisafe.app/?utm_source=coolify.io) +- [Documentation](https://chibisafe.app/docs/intro?utm_source=coolify.io) +- [GitHub](https://github.com/chibisafe/chibisafe?utm_source=coolify.io) diff --git a/content/docs/services/chroma.mdx b/content/docs/services/chroma.mdx new file mode 100644 index 00000000..b103dd11 --- /dev/null +++ b/content/docs/services/chroma.mdx @@ -0,0 +1,21 @@ +--- +title: "Chroma" +description: "Open-source, AI-native vector database for building applications with embeddings." +og: + description: "Deploy Chroma vector database on Coolify for AI embeddings storage, semantic search, and retrieval-augmented generation in machine learning apps." +category: "AI" +icon: "/docs/images/services/chroma-logo.svg" +--- + +# Chroma + + + +## What is Chroma? + +Chroma is an open-source, AI-native vector database designed for building applications with embeddings. It provides a simple way to store, retrieve, and search vector embeddings for machine learning applications, particularly those involving large language models (LLMs) and semantic search. Chroma handles the complexities of vector operations, similarity search, and metadata filtering, making it ideal for retrieval-augmented generation (RAG) systems and other AI applications. + +## Links + +- [The official website](https://www.trychroma.com?utm_source=coolify.io) +- [GitHub](https://github.com/chroma-core/chroma?utm_source=coolify.io) diff --git a/content/docs/services/classicpress.mdx b/content/docs/services/classicpress.mdx new file mode 100644 index 00000000..bb205fe2 --- /dev/null +++ b/content/docs/services/classicpress.mdx @@ -0,0 +1,43 @@ +--- +title: "ClassicPress" +description: "A business-focused CMS with a strong community." +og: + description: "Run ClassicPress CMS on Coolify as WordPress alternative with classic editor, no blocks, and focus on business websites and traditional publishing." +category: "CMS" +icon: "/docs/images/services/classicpress-logo.svg" +--- + + + +## What is ClassicPress? + +ClassicPress is a community-led open source content management system for creators. It is a fork of WordPress 6.2 that preserves the TinyMCE classic editor as the default option. It is half the size of WordPress, contains less bloat improving performance, and has no block editor (Gutenberg/Full Site Editing). + +## Deployment Variants + +ClassicPress is available in two deployment configurations in Coolify: + +### ClassicPress with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference (recommended for most users) +- **Components:** + - ClassicPress container + - MariaDB container + - Automatic database configuration and health checks + +### ClassicPress with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - ClassicPress container + - MySQL container + - Automatic database configuration and health checks + +Both variants provide equivalent functionality - choose based on your database preference or existing infrastructure. + +For more information, see: + +- [The official website](https://www.classicpress.net?utm_source=coolify.io) +- [The ClassicPress documentation](https://docs.classicpress.net?utm_source=coolify.io) +- [The ClassicPress governance](https://www.classicpress.net/governance?utm_source=coolify.io) +- [Suggest features](https://github.com/ClassicPress/ClassicPress/issues?utm_source=coolify.io) diff --git a/content/docs/services/cloudbeaver.mdx b/content/docs/services/cloudbeaver.mdx new file mode 100644 index 00000000..77e92eee --- /dev/null +++ b/content/docs/services/cloudbeaver.mdx @@ -0,0 +1,20 @@ +--- +title: Cloudbeaver +description: "Universal database tool with web interface." +og: + description: "Deploy CloudBeaver on Coolify for web-based database management supporting PostgreSQL, MySQL, MongoDB with SQL editor and data visualization." +category: "Development" +icon: "/docs/images/services/cloudbeaver-logo.png" +--- + +# Cloudbeaver + + + +## What is Cloudbeaver + +CloudBeaver is a lightweight web application designed for comprehensive data management. + +## Links + +- [Official Documentation](https://dbeaver.com/docs/cloudbeaver/?utm_source=coolify.io) diff --git a/content/docs/services/cloudflared.mdx b/content/docs/services/cloudflared.mdx new file mode 100644 index 00000000..b0256328 --- /dev/null +++ b/content/docs/services/cloudflared.mdx @@ -0,0 +1,19 @@ +--- +title: "Cloudflared" +description: "Cloudflare Tunnel client." +og: + description: "Run Cloudflare Tunnel on Coolify to expose local services securely without port forwarding using cloudflared for remote access and protection." +category: "Networking" +icon: "/docs/images/services/cloudflared-logo.svg" +--- + + + +## What is Cloudflared? + +Cloudflare Tunnel is tunneling software that lets you quickly secure and encrypt application traffic to any type of infrastructure, so you can hide your web server IP addresses, block direct attacks, and get back to delivering great applications. + +## Links + +- [The official website](https://www.cloudflare.com/products/tunnel?utm_source=coolify.io) +- [GitHub](https://github.com/cloudflare/cloudflared?utm_source=coolify.io) diff --git a/content/docs/services/cloudreve.mdx b/content/docs/services/cloudreve.mdx new file mode 100644 index 00000000..e00c7701 --- /dev/null +++ b/content/docs/services/cloudreve.mdx @@ -0,0 +1,22 @@ +--- +title: "Cloudreve" +description: "A self-hosted file management and sharing system." +og: + description: "A self-hosted file management and sharing system." +category: "Storage" +icon: "/docs/images/services/cloudreve-logo.svg" +--- + +# Cloudreve + + + +## What is Cloudreve? + +Cloudreve enables you to quickly set up a cloud storage system that serves both public and private needs. Cloudreve supports different cloud storage platforms at its core, and users don't need to worry about the physical storage method during actual use. You can use Cloudreve to build a personal cloud drive, file sharing system, or even a public cloud system for small to large organizations. + +## Links + +- [Official website](https://cloudreve.org/?utm_source=coolify.io) +- [Documentation](https://docs.cloudreve.org/en/?utm_source=coolify.io) +- [GitHub](https://github.com/cloudreve/Cloudreve?utm_source=coolify.io) diff --git a/content/docs/services/cockpit.mdx b/content/docs/services/cockpit.mdx new file mode 100644 index 00000000..41a8fd9c --- /dev/null +++ b/content/docs/services/cockpit.mdx @@ -0,0 +1,20 @@ +--- +title: Cockpit +description: "Web-based server administration interface." +og: + description: "Host Cockpit CMS on Coolify for headless content management with flexible data structures, REST API, GraphQL, and developer-friendly workflows." +category: "Administration" +icon: "/docs/images/services/cockpit-logo.svg" +--- + +# Cockpit + + + +## What is Cockpit + +Cockpit is a headless content platform that is lightweight, fast and ready for takeoff. + +## Links + +- [Official Documentation](https://getcockpit.com/documentation/?utm_source=coolify.io) diff --git a/content/docs/services/code-server.mdx b/content/docs/services/code-server.mdx new file mode 100644 index 00000000..f48faa8e --- /dev/null +++ b/content/docs/services/code-server.mdx @@ -0,0 +1,38 @@ +--- +title: "Code Server" +description: "Run VS Code on any machine anywhere and access it in the browser." +og: + description: "Run VS Code in browser on Coolify with code-server for remote development, extensions support, terminal access, and cloud-based coding environment." +category: "Development" +icon: "/docs/images/services/codeserver-logo.svg" +--- + +# Code Server + + + + +## What is Code Server? + +Run [VS Code](https://github.com/Microsoft/vscode) on any machine anywhere and access it in the browser. + +## Highlights + +- Code on any device with a consistent development environment +- Use cloud servers to speed up tests, compilations, downloads, and more +- Preserve battery life when you're on the go; all intensive tasks run on your server + +## Requirements + +See [requirements](https://coder.com/docs/code-server/latest/requirements?utm_source=coolify.io) for minimum specs + +**TL;DR:** Linux machine with WebSockets enabled, 1 GB RAM, and 2 vCPUs + +## Questions? + +See answers to [frequently asked questions](https://coder.com/docs/code-server/latest/FAQ?utm_source=coolify.io). + +## Links + +- [The official website](https://coder.com/docs/code-server/?utm_source=coolify.io) +- [GitHub](https://github.com/coder/code-server?utm_source=coolify.io) diff --git a/content/docs/services/codimd.mdx b/content/docs/services/codimd.mdx new file mode 100644 index 00000000..9dfa6edf --- /dev/null +++ b/content/docs/services/codimd.mdx @@ -0,0 +1,23 @@ +--- +title: "CodiMD" +description: "Realtime collaborative markdown notes on all platforms." +og: + description: "Deploy CodiMD collaborative markdown editor on Coolify with real-time collaboration, presentations, diagrams, and knowledge sharing for teams." +category: "Productivity" +icon: "/docs/images/services/codimd-logo.png" +--- + + + +## What is CodiMD? + +CodiMD lets you collaborate in real-time with markdown. Built on HackMD source code, CodiMD lets you host and control your team's content with speed and ease. + +## Screenshots + + + +## Links + +- [The official website](https://hackmd.io/c/codimd-documentation/%2Fs%2Fcodimd-documentation?utm_source=coolify.io) +- [GitHub](https://github.com/hackmdio/codimd?utm_source=coolify.io) diff --git a/content/docs/services/convertx.mdx b/content/docs/services/convertx.mdx new file mode 100644 index 00000000..76b62d83 --- /dev/null +++ b/content/docs/services/convertx.mdx @@ -0,0 +1,20 @@ +--- +title: Convertx +description: "File conversion service supporting multiple formats." +og: + description: "Host ConvertX file conversion on Coolify for format transformation, document processing, image optimization, and media file conversion services." +category: "Utilities" +icon: "/docs/images/services/convertx-logo.png" +--- + +# Convertx + + + +## What is Convertx + +A self-hosted online file converter. Supports over a thousand different formats. + +## Links + +- [Official Documentation](https://github.com/C4illin/ConvertX?utm_source=coolify.io) diff --git a/content/docs/services/convex.mdx b/content/docs/services/convex.mdx new file mode 100644 index 00000000..8133560a --- /dev/null +++ b/content/docs/services/convex.mdx @@ -0,0 +1,30 @@ +--- +title: Convex +description: "Backend platform for web developers." +og: + description: "Deploy Convex backend on Coolify with reactive database, serverless functions, real-time sync, and TypeScript-first development for modern apps." +category: "Development" +icon: "/docs/images/services/convex-logo.svg" +--- + +# Convex + + + +## What is Convex + +Convex is the open-source reactive database for app developers. + +## How to Generate an Admin Key + +To generate an admin key for your Convex application in Coolify, follow these steps: +1. Go to the Coolify dashboard. +2. Select your Convex application. +3. Open the Terminal tab. +4. Connect to the backend terminal. +5. In the terminal, execute the following command: `./generate_admin_key.sh` +6. Copy the generated admin key for your records. + +## Links + +- [Official Documentation](https://docs.convex.dev/?utm_source=coolify.io) diff --git a/content/docs/services/cryptgeon.mdx b/content/docs/services/cryptgeon.mdx new file mode 100644 index 00000000..caa6d775 --- /dev/null +++ b/content/docs/services/cryptgeon.mdx @@ -0,0 +1,20 @@ +--- +title: Cryptgeon +description: "Secure note sharing service with self-destructing messages." +og: + description: "Share secrets securely on Coolify with Cryptgeon featuring self-destructing messages, end-to-end encryption, and no server-side storage." +category: "Security" +icon: "/docs/images/services/cryptgeon-logo.png" +--- + +# Cryptgeon + + + +## What is Cryptgeon + +Secure note / file sharing service inspired by PrivNote. + +## Links + +- [Official Documentation](https://github.com/cupcakearmy/cryptgeon?utm_source=coolify.io) diff --git a/content/docs/services/cyberchef.mdx b/content/docs/services/cyberchef.mdx new file mode 100644 index 00000000..c443d343 --- /dev/null +++ b/content/docs/services/cyberchef.mdx @@ -0,0 +1,20 @@ +--- +title: Cyberchef +description: "Data analysis and manipulation tool for cybersecurity." +og: + description: "Run CyberChef data analysis on Coolify for encoding, decoding, encryption, compression, and data transformation with 300+ operations." +category: "Security" +icon: "/docs/images/services/cyberchef-logo.jpeg" +--- + +# Cyberchef + + + +## What is Cyberchef + +The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis + +## Links + +- [Official Documentation](https://github.com/gchq/CyberChef?utm_source=coolify.io) diff --git a/content/docs/services/dashboard.mdx b/content/docs/services/dashboard.mdx new file mode 100644 index 00000000..d1239b61 --- /dev/null +++ b/content/docs/services/dashboard.mdx @@ -0,0 +1,35 @@ +--- +title: "Dashboard" +description: "A simple dashboard for your server." +og: + description: "Deploy customizable dashboard on Coolify for application shortcuts, bookmarks, service monitoring, and centralized access to self-hosted tools." +category: "Administration" +icon: "/docs/images/services/dashboard-logo.svg" +--- + + + + +This service is currently not available in Coolify's service catalog. + + + + + + +## What is Dashboard? + +Dashboard is just that - a dashboard. It's inspired by [SUI](https://github.com/jeroenpardon/sui) and has all the same features as SUI, such as simple customization through JSON-files and a handy search bar to search the internet more efficiently. + +## Features + +So what makes this project different from (or even better than) SUI? + +- "Display URL" functionality (The URL displayed for apps can differ from the actual URL) +- Categorization for apps +- Themes and search providers can be changed using JSON +- Imprint functionality + +## Links + +- [GitHub](https://github.com/phntxx/dashboard?utm_source=coolify.io) diff --git a/content/docs/services/dashy.mdx b/content/docs/services/dashy.mdx new file mode 100644 index 00000000..1e0132b3 --- /dev/null +++ b/content/docs/services/dashy.mdx @@ -0,0 +1,20 @@ +--- +title: Dashy +description: "Customizable homepage dashboard for self-hosted services." +og: + description: "Host Dashy dashboard on Coolify with customizable widgets, service health checks, themes, icons, and organized homepage for self-hosted services." +category: "Administration" +icon: "/docs/images/services/dashy-logo.png" +--- + +# Dashy + + + +## What is Dashy + +A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! + +## Links + +- [Official Documentation](https://dashy.to/docs?utm_source=coolify.io) diff --git a/content/docs/services/databasus.mdx b/content/docs/services/databasus.mdx new file mode 100644 index 00000000..4a07a785 --- /dev/null +++ b/content/docs/services/databasus.mdx @@ -0,0 +1,26 @@ +--- +title: "Databasus" +description: "A free, open source and self-hosted tool to backup PostgreSQL, MySQL and MongoDB with multiple storage backends." +og: + description: "A free, open source and self-hosted tool to backup PostgreSQL, MySQL and MongoDB with multiple storage backends." +category: "Backup" +icon: "/docs/images/services/databasus-logo.webp" +--- + +# Databasus + + + +## What is Databasus? + +Databasus is a free, open source and self-hosted tool to backup databases like PostgreSQL, MySQL and MongoDB. Make backups with different storages (S3, Google Drive, FTP, etc.) and notifications about progress (Slack, Discord, Telegram, etc.). Previously known as Postgresus. + +## Screenshots + + + +## Links + +- [The official website](https://databasus.com/?utm_source=coolify.io) +- [Documentation](https://databasus.com/installation?utm_source=coolify.io) +- [GitHub](https://github.com/databasus/databasus?utm_source=coolify.io) diff --git a/content/docs/services/denokv.mdx b/content/docs/services/denokv.mdx new file mode 100644 index 00000000..997c8555 --- /dev/null +++ b/content/docs/services/denokv.mdx @@ -0,0 +1,33 @@ +--- +title: Denokv +description: "Deno's built-in key-value database service." +og: + description: "Run Deno KV database on Coolify for edge-compatible key-value store with ACID transactions, real-time sync, and serverless architecture support." +category: "Development" +icon: "/docs/images/services/denolookingup-logo.svg" +--- + +# Denokv + + + +## What is Deno KV + +Deno KV is a self-hosted, JavaScript-first key-value database built directly into the Deno runtime. It provides a robust, high-performance data storage solution powered by FoundationDB and SQLite, designed for modern edge computing and serverless applications. + +Key features include: + +- **ACID Transactions**: Guaranteed data consistency with full ACID transaction support, preventing partial writes and data corruption +- **Built on FoundationDB**: Enterprise-grade backend capable of handling millions of operations per second +- **Real-time Watch API**: Monitor database changes in real-time for building reactive applications, notifications, and live updates +- **Zero Configuration**: Works out of the box with the Deno runtime, no complex setup required +- **JavaScript Native**: Store any JavaScript value directly without manual serialization +- **Hierarchical Keys**: Organize data with structured, REST-like key patterns for intuitive data modeling +- **Multiple Consistency Levels**: Balance between performance and consistency based on your application needs +- **Self-hosted & Open Source**: MIT licensed with full control over your infrastructure + +## Links + +- [Official Website](https://deno.com/kv?utm_source=coolify.io) +- [Official Documentation](https://docs.deno.com/deploy/kv/manual/?utm_source=coolify.io) +- [GitHub Repository](https://github.com/denoland/denokv?utm_source=coolify.io) diff --git a/content/docs/services/directus.mdx b/content/docs/services/directus.mdx new file mode 100644 index 00000000..ea59e281 --- /dev/null +++ b/content/docs/services/directus.mdx @@ -0,0 +1,56 @@ +--- +title: "Directus" +description: "An open-source headless CMS and API for custom databases." +og: + description: "Deploy Directus headless CMS on Coolify with SQL database wrapper, REST/GraphQL API, no-code data studio, and custom field types for any project." +category: "CMS" +icon: "/docs/images/services/directus-logo.svg" +--- + + + +## What is Directus? + +Directus is a real-time API and App dashboard for managing SQL database content. + +- **Open Source.** No artificial limitations, vendor lock-in, or hidden paywalls. +- **REST & GraphQL API.** Instantly layers a blazingly fast Node.js API on top of any SQL database. +- **Manage Pure SQL.** Works with new or existing SQL databases, no migration required. +- **Choose your Database.** Supports PostgreSQL, MySQL, SQLite, OracleDB, CockroachDB, MariaDB, and MS-SQL. +- **On-Prem or Cloud.** Run locally, install on-premises, or use our + [self-service Cloud service](https://directus.io/pricing?utm_source=coolify.io). +- **Completely Extensible.** Built to white-label, it is easy to customize our modular platform. +- **A Modern Dashboard.** Our no-code Vue.js app is safe and intuitive for non-technical users, no training required. + +## Deployment Variants + +Directus is available in two deployment configurations in Coolify: + +### Directus (Default) +- **Database:** SQLite3 (file-based) +- **Use case:** Development, testing, or small-scale deployments +- **Components:** Single Directus container with embedded SQLite database + +### Directus with PostgreSQL +- **Database:** PostgreSQL + Redis +- **Use case:** Production deployments requiring better performance, scalability, and caching +- **Components:** + - Directus container + - PostgreSQL 16 container + - Redis 7 container for caching + - Automatic database configuration and health checks + +## Community Help + +[The Directus Documentation](https://docs.directus.io?utm_source=coolify.io) is a great place to start, or explore these other channels: + +- [Discord](https://directus.chat?utm_source=coolify.io) (Questions, Live Discussions) +- [GitHub Issues](https://github.com/directus/directus/issues?utm_source=coolify.io) (Report Bugs) +- [GitHub Discussions](https://github.com/directus/directus/discussions?utm_source=coolify.io) (Feature Requests) +- [Twitter](https://twitter.com/directus?utm_source=coolify.io) (Latest News) +- [YouTube](https://www.youtube.com/c/DirectusVideos/featured?utm_source=coolify.io) (Video Tutorials) + +## Links + +- [The official website](https://directus.io?utm_source=coolify.io) +- [GitHub](https://github.com/directus/directus?utm_source=coolify.io) diff --git a/content/docs/services/diun.mdx b/content/docs/services/diun.mdx new file mode 100644 index 00000000..fb5b801b --- /dev/null +++ b/content/docs/services/diun.mdx @@ -0,0 +1,19 @@ +--- +title: "Diun" +description: "Docker Image Update Notifier." +og: + description: "Monitor Docker images on Coolify with Diun for automatic update notifications, registry tracking, and container version management alerts." +category: "Monitoring" +icon: "/docs/images/services/diun-logo.svg" +--- + + + +## What is Diun? + +Docker Image Update Notifier is a CLI application written in Go and delivered as a single executable (and a Docker image) to receive notifications when a Docker image is updated on a Docker registry. + +## Links + +- [The official website](https://crazymax.dev/diun/?utm_source=coolify.io) +- [GitHub](https://github.com/crazy-max/diun?utm_source=coolify.io) diff --git a/content/docs/services/docker-registry.mdx b/content/docs/services/docker-registry.mdx new file mode 100644 index 00000000..4e0016d9 --- /dev/null +++ b/content/docs/services/docker-registry.mdx @@ -0,0 +1,19 @@ +--- +title: "Docker Registry" +description: "A Docker registry to store and manage your Docker images." +og: + description: "Host private Docker registry on Coolify for container image storage, distribution, versioning, and secure artifact management for DevOps teams." +category: "Development" +icon: "/docs/images/services/docker-registry-logo.png" +--- + + + +## What is Docker Registry? + +Docker Registry is a stateless, highly-available server side application that stores and distributes Docker images. + +## Links + +- [The official website](https://hub.docker.com?utm_source=coolify.io) +- [GitHub](https://github.com/docker/distribution?utm_source=coolify.io) diff --git a/content/docs/services/docmost.mdx b/content/docs/services/docmost.mdx new file mode 100644 index 00000000..059c6875 --- /dev/null +++ b/content/docs/services/docmost.mdx @@ -0,0 +1,25 @@ +--- +title: "Docmost" +description: "Open-source document collaboration platform." +og: + description: "Deploy Docmost wiki on Coolify for team documentation, knowledge management, real-time collaboration, and organized information sharing platform." +category: "Documentation" +icon: "/docs/images/services/docmost-logo.png" +--- + +# What is Docmost? + +Docmost is an open-source collaborative wiki and documentation software. + +## Screenshots + + + + + + + +## Links + +- [The official website](https://www.docmost.com?utm_source=coolify.io) +- [GitHub](https://github.com/docmost/docmost?utm_source=coolify.io) diff --git a/content/docs/services/documenso.mdx b/content/docs/services/documenso.mdx new file mode 100644 index 00000000..33ba212f --- /dev/null +++ b/content/docs/services/documenso.mdx @@ -0,0 +1,20 @@ +--- +title: Documenso +description: "Open-source DocuSign alternative for document signing." +og: + description: "Run Documenso document signing on Coolify as open-source DocuSign alternative with e-signatures, PDF workflows, and digital signature management." +category: "Business" +icon: "/docs/images/services/documenso-logo.png" +--- + +# Documenso + + + +## What is Documenso + +Document signing, finally open source + +## Links + +- [Official Documentation](https://docs.documenso.com/?utm_source=coolify.io) diff --git a/content/docs/services/docuseal.mdx b/content/docs/services/docuseal.mdx new file mode 100644 index 00000000..b14b0e22 --- /dev/null +++ b/content/docs/services/docuseal.mdx @@ -0,0 +1,38 @@ +--- +title: "Docuseal" +description: "Open source DocuSign alternative." +og: + description: "Host DocuSeal on Coolify for PDF form filling, e-signatures, document workflows, and digital signature collection for business process automation." +category: "Business" +icon: "/docs/images/services/docuseal-logo.png" +--- + +## What is Docuseal? + +Document Signing for Everyone free forever for individuals, extensible for businesses and developers. Open Source Alternative to DocuSign, PandaDoc and more. + +## Deployment Variants + +DocuSeal is available in two deployment configurations in Coolify: + +### DocuSeal (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or low-volume document signing +- **Components:** Single DocuSeal container with built-in SQLite database + +### DocuSeal with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance, scalability, and concurrent access +- **Components:** + - DocuSeal container + - PostgreSQL container + - Automatic database configuration and health checks + +## Screenshots + + + +## Links + +- [The official website](https://www.docuseal.co?utm_source=coolify.io) +- [GitHub](https://github.com/docusealco/docuseal?utm_source=coolify.io) diff --git a/content/docs/services/dokuwiki.mdx b/content/docs/services/dokuwiki.mdx new file mode 100644 index 00000000..0a2d3051 --- /dev/null +++ b/content/docs/services/dokuwiki.mdx @@ -0,0 +1,41 @@ +--- +title: "DokuWiki" +description: "A simple to use and highly versatile Open Source wiki software that doesn't require a database." +og: + description: "Deploy DokuWiki on Coolify for flat-file wiki without database, version control, ACL permissions, and plugin extensibility for documentation." +category: "Documentation" +icon: "/docs/images/services/dokuwiki-logo.png" +--- + + + +## What is DokuWiki? + +DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database. It is loved by users for its clean and readable syntax. The ease of maintenance, backup and integration makes it an administrator's favorite. Built in access controls and authentication connectors make DokuWiki especially useful in the enterprise context and the large number of plugins contributed by its vibrant community allow for a broad range of use cases beyond a traditional wiki. + +## Why DokuWiki? + +DokuWiki is a popular choice when choosing a Wiki software and has many advantages over similar software. + +- Easy to install and use +- Low system requirements +- Built-in Access Control Lists +- Large variety of extensions +- Over 50 languages supported +- Device independent +- Open Source + +## Use Cases + +DokuWiki are quick to update and new pages are easily added. Designed for collaboration while maintaining a history of every change, DokuWiki could be used as: + +- Corporate Knowledge Base +- Private notebook +- Software manual +- Project workspace +- CMS – intranet + +## Links + +- [The official website](https://www.dokuwiki.org?utm_source=coolify.io) +- [GitHub](https://github.com/splitbrain/DokuWiki?utm_source=coolify.io) diff --git a/content/docs/services/dolibarr.mdx b/content/docs/services/dolibarr.mdx new file mode 100644 index 00000000..2e252f24 --- /dev/null +++ b/content/docs/services/dolibarr.mdx @@ -0,0 +1,20 @@ +--- +title: Dolibarr +description: "Open-source ERP and CRM software." +og: + description: "Run Dolibarr ERP/CRM on Coolify with invoicing, inventory, projects, HR management, and business process automation for small to medium enterprises." +category: "Business" +icon: "/docs/images/services/dolibarr.png" +--- + +# Dolibarr + + + +## What is Dolibarr + +Dolibarr is a modern software package to manage your organization's activity (contacts, quotes, invoices, orders, stocks, agenda, hr, expense reports, accountancy, ecm, manufacturing, ...). + +## Links + +- [Official Documentation](https://www.dolibarr.org/documentation-home.php?utm_source=coolify.io) diff --git a/content/docs/services/dozzle.mdx b/content/docs/services/dozzle.mdx new file mode 100644 index 00000000..b6dfb3c9 --- /dev/null +++ b/content/docs/services/dozzle.mdx @@ -0,0 +1,40 @@ +--- +title: "Dozzle" +description: "Realtime log viewer for docker containers." +og: + description: "Monitor Docker logs on Coolify with Dozzle real-time log viewer featuring search, filtering, multi-container support, and lightweight web interface." +category: "Development" +icon: "/docs/images/services/dozzle-logo.svg" +--- + + + +## What is Dozzle? + +Dozzle is an open-source project sponsored by Docker OSS. It is a log viewer designed to simplify monitoring and debugging containers. This lightweight, web-based application offers real-time log streaming, filtering, and searching capabilities through an intuitive user interface. + +Users can quickly access logs generated by their Docker containers, making it an essential tool for debugging and troubleshooting applications in a Docker environment. By default, Dozzle supports JSON logs with intelligent color coding. + +Dozzle is easy to install and configure, making it an ideal solution for developers and system administrators seeking an efficient, user-friendly log viewer for their Docker environment. The tool is available under the MIT license and is actively maintained by its developer, Amir Raminfar. + +## Deployment Variants + +Dozzle is available in two deployment configurations in Coolify: + +### Dozzle (Default) +- **Authentication:** No authentication (open access) +- **Use case:** Development environments, trusted networks, or single-user setups +- **Components:** Single Dozzle container with Docker socket access + +### Dozzle with Authentication +- **Authentication:** Built-in authentication with user management +- **Use case:** Production environments, multi-user access, or security-sensitive deployments +- **Components:** + - Dozzle container with authentication enabled + - User credential management + - Docker socket access + +## Links + +- [The official website](https://dozzle.dev/guide/getting-started#running-with-docker?utm_source=coolify.io) +- [GitHub](https://github.com/amir20/dozzle?utm_source=coolify.io) diff --git a/content/docs/services/drizzle-gateway.mdx b/content/docs/services/drizzle-gateway.mdx new file mode 100644 index 00000000..e2e62dcb --- /dev/null +++ b/content/docs/services/drizzle-gateway.mdx @@ -0,0 +1,21 @@ +--- +title: "Drizzle Gateway" +description: "Drizzle Studio for exploring SQL databases." +og: + description: "Deploy and host Drizzle Studio with Coolify to explore SQL databases in your Drizzle ORM project visually and efficiently." +category: "Development" +icon: "/docs/images/services/drizzle-logo.jpeg" +--- + +# Drizzle Gateway + + + +## What is Drizzle Gateway? + +Drizzle Studio is a new way for you to explore SQL database on Drizzle ORM project. + +## Links + +- [The official website](https://orm.drizzle.team/docs/get-started/postgresql-new?utm_source=coolify.io) +- [GitHub](https://github.com/drizzle-team/drizzle-orm?utm_source=coolify.io) diff --git a/content/docs/services/drupal.mdx b/content/docs/services/drupal.mdx new file mode 100644 index 00000000..8ab6ea03 --- /dev/null +++ b/content/docs/services/drupal.mdx @@ -0,0 +1,20 @@ +--- +title: Drupal +description: "Open-source content management system." +og: + description: "Deploy Drupal CMS on Coolify for enterprise content management with powerful APIs, content types, workflows, and extensive module ecosystem." +category: "CMS" +icon: "/docs/images/services/drupal-logo.svg" +--- + +# Drupal + + + +## What is Drupal + +Drupal is a free and open-source web content management system written in PHP and distributed under the GNU General Public License. + +## Links + +- [Official Documentation](https://www.drupal.org/about?utm_source=coolify.io) diff --git a/content/docs/services/duplicati.mdx b/content/docs/services/duplicati.mdx new file mode 100644 index 00000000..d17979bb --- /dev/null +++ b/content/docs/services/duplicati.mdx @@ -0,0 +1,19 @@ +--- +title: "Duplicati" +description: "A free backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers." +og: + description: "Host Duplicati backup on Coolify with encrypted cloud backups, incremental updates, scheduling, and restore capabilities for data protection." +category: "Backup" +icon: "/docs/images/services/duplicati-logo.webp" +--- + + + +## What is Duplicati? + +Free backup software to store encrypted backups online for Windows, macOS and Linux. + +## Links + +- [The official website](https://www.duplicati.com?utm_source=coolify.io) +- [GitHub](https://github.com/duplicati/duplicati?utm_source=coolify.io) diff --git a/content/docs/services/easyappointments.mdx b/content/docs/services/easyappointments.mdx new file mode 100644 index 00000000..f305bc94 --- /dev/null +++ b/content/docs/services/easyappointments.mdx @@ -0,0 +1,20 @@ +--- +title: Easyappointments +description: "Open-source appointment scheduler." +og: + description: "Run Easy!Appointments on Coolify for online booking system with calendar sync, customer management, SMS notifications, and service scheduling." +category: "Business" +icon: "/docs/images/services/easyappointments-logo.png" +--- + +# Easyappointments + + + +## What is Easyappointments + +Schedule Anything. Let's start with easy! Get the best free online appointment scheduler on your server, today. + +## Links + +- [Official Documentation](https://easyappointments.org/?utm_source=coolify.io) diff --git a/content/docs/services/elasticsearch.mdx b/content/docs/services/elasticsearch.mdx new file mode 100644 index 00000000..1ebd4e09 --- /dev/null +++ b/content/docs/services/elasticsearch.mdx @@ -0,0 +1,69 @@ +--- +title: "Elasticsearch" +description: "Free and Open Source, Distributed, RESTful Search Engine." +og: + description: "Here you can find the documentation for hosting Elasticsearch with Coolify." +category: "Search" +icon: "/docs/images/services/elasticsearch-logo.svg" +--- + +# Elasticsearch + + + +## What is Elasticsearch? + +Elasticsearch is an open-source search and analytics engine designed for fast, scalable data retrieval—ideal for handling large volumes of both structured and unstructured data. + +## How to Deploy Elasticsearch on Coolify + +There are two ways to deploy Elasticsearch on Coolify: + +- **Elasticsearch as a standalone service** (no GUI) +- **Elasticsearch with Kibana** (GUI) + +--- + +## Elasticsearch as a Standalone Service + +1. Create a new resource on Coolify and select **Elasticsearch with Kibana** from the service list. +2. Click the **Deploy** button to pull the Docker images and start the containers. +3. Once the `Elasticsearch` service shows as healthy, you can access it via its assigned domain. + > ⚠️ Note: This version does not include a GUI—you’ll need to interact with it via CLI tools or APIs. + +--- + +## Deploy Elasticsearch with Kibana + +1. Create a new resource on Coolify and select **Elasticsearch with Kibana** from the service list. +2. Click the **Deploy** button to pull the Docker images and start the containers. +3. Once the `Elasticsearch` service is running and the `Kibana Token Generator` shows an **exited** status: + - Open the logs of the `Kibana Token Generator` service. + - Copy the **Service Token** from the logs. + - Paste the token into the `ELASTICSEARCH_SERVICEACCOUNTTOKEN` environment variable. + - Restart the service (click the **Restart** button). +4. After both `Elasticsearch` and `Kibana` services are running healthy, visit the domain assigned to the service. + - You’ll be presented with the Elastic login page. + - **Username:** `elastic` + **Password:** value of the `SERVICE_PASSWORD_ELASTICSEARCH` environment variable. + +If any of the above steps are unclear, you can refer to [this Pull Request](https://github.com/coollabsio/coolify/pull/6470), which includes a video walkthrough of the entire deployment process. + +--- + +### Notes for Elasticsearch with Kibana + +1. It can take over **2 minutes** for all services to fully start (depending on your server’s performance). +2. The JVM heap size is set to **512MB** by default to prevent Elasticsearch from exhausting server memory. + > To increase this value, modify the environment variable: + > `ES_JAVA_OPTS=-Xms512m -Xmx512m` in the Docker Compose file. +3. The `Kibana Token Generator` service is designed to **run once and then exit**. This is expected behavior and does not impact the health of the Elastic or Kibana services. +4. Clustering is **disabled by default** via the `discovery.type=single-node` environment variable. + > Update this setting if clustering is required. + +--- + +## Useful Links + +- [Official Website](https://www.elastic.co/?utm_source=coolify.io) +- [Official Documentation](https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana-with-docker?utm_source=coolify.io) diff --git a/content/docs/services/electricsql.mdx b/content/docs/services/electricsql.mdx new file mode 100644 index 00000000..df97d5fd --- /dev/null +++ b/content/docs/services/electricsql.mdx @@ -0,0 +1,33 @@ +--- +title: "ElectricSQL" +description: "Sync shape-based subsets of your Postgres data over HTTP" +og: + description: "Sync shape-based subsets of your Postgres data over HTTP." +category: "Database" +icon: "/docs/images/services/electricsql.svg" +--- + +# ElectricSQL + + + +## What is ElectricSQL? + +ElectricSQL allows developers to build fast, modern, collaborative apps without changing their stack + +## Notes on deployment + +When creating the postgresql database, make sure to enable logical replication: adding `wal_level = logical` to your postgresql config should do it. + +## Environment Variables + +- SERVICE_URL_ELECTRIC_3000: exposes port 3000 of electricsql: this is where your clients would connect +- DATABASE_URL: url of the postgresql database (with logical replication enabled) +- ELECTRIC_SECRET: secret electricsql will use to authenticate requests (more info [here](https://electric-sql.com/docs/guides/security#api-token)) +- ELECTRIC_STORAGE_DIR: electric needs to store some data, cache etc. This is where it'll go +- ELECTRIC_USAGE_REPORTING: allows configuration of anonymous usage data reporting back to [https://electric-sql.com](https://electric-sql.com) + +## Links + +- [Official website](https://electric-sql.com/.io) +- [GitHub](https://github.com/electric-sql/electric?utm_source=coolify.io) diff --git a/content/docs/services/emby.mdx b/content/docs/services/emby.mdx new file mode 100644 index 00000000..e5ee3484 --- /dev/null +++ b/content/docs/services/emby.mdx @@ -0,0 +1,41 @@ +--- +title: "Emby" +description: "A media server to organize, play, and stream audio and video to a variety of devices." +og: + description: "Host Emby media server on Coolify for streaming movies, TV shows, music, and photos with transcoding, mobile apps, and DVR capabilities." +category: "Media" +icon: "/docs/images/services/emby-logo.png" +--- + + + +## What is Emby? + +Emby is a free personal media server. It is built with a number of popular open source technologies. + +## Requirements + +Windows, Mac, Linux, or FreeBSD computer + +### Minimum Requirements — no transcoding + +- Intel Core 2 Duo processor 1.6 GHz or better +- At least 1GB RAM for Windows/Mac OS X +- At least 512MB RAM for Linux +- Windows: Vista or later +- OS X: MacOS 10.13 or later +- Ubuntu, Debian, Fedora, CentOS or SuSE Linux + +### Recommended Configuration — transcoding HD Content + +- Intel Core 2 Duo processor 2.4 GHz or better +- If transcoding for multiple devices, a faster CPU may be required +- At least 2GB RAM +- Windows: Vista or later +- OS X: MacOS 10.13 or later +- Ubuntu, Debian, Fedora, CentOS or SuSE Linux + +## Community + +- [The official website](https://emby.media?utm_source=coolify.io) +- [The Emby community](https://emby.media/community?utm_source=coolify.io) diff --git a/content/docs/services/embystat.mdx b/content/docs/services/embystat.mdx new file mode 100644 index 00000000..6c8b696e --- /dev/null +++ b/content/docs/services/embystat.mdx @@ -0,0 +1,18 @@ +--- +title: "Emby Stat" +description: "A simple and easy-to-use Emby statistics dashboard." +og: + description: "Track Emby server usage on Coolify with EmbyStat featuring media statistics, playback analytics, user metrics, and library health monitoring." +category: "Media" +icon: "/docs/images/services/embystat-logo.svg" +--- + + + +## What is Emby Stat? + +EmbyStat is a personal web server that can calculate all kinds of statistics from your (local) Emby or Jellyfin server. Just install this on your server and let him calculate all kinds of fun stuff. + +## Links + +- [The official website](https://github.com/mregni/EmbyStat?utm_source=coolify.io) diff --git a/content/docs/services/ente-photos.mdx b/content/docs/services/ente-photos.mdx new file mode 100644 index 00000000..d651bcc1 --- /dev/null +++ b/content/docs/services/ente-photos.mdx @@ -0,0 +1,105 @@ +--- +title: "Ente" +description: "A fully open-source, end-to-end encrypted platform for you to store data in the cloud without needing to trust the service provider." +og: + description: "Here you can find the documentation for hosting Ente with Coolify." +category: "Productivity" +icon: "/docs/images/services/ente-logo.webp" +--- + +# Ente + + + +## What is Ente? + +Ente is a service that provides a fully open-source, end-to-end encrypted platform for you to store your data in the cloud without needing to trust the service provider. On top of the platform, Ente has built two apps so far: Ente Photos (an alternative to Apple and Google Photos) and Ente Auth (a 2FA alternative to the deprecated Authy). + +Learn more at [help.ente.io](https://help.ente.io/). + +## Configuring Object Store + +- Once you have selected your service. You will need to set up of some environment variables for your S3 bucket or substitute like MinIO. + +### 1. Remote S3 bucket + +- For AWS S3 you can create a bucket and allow access via IAM Roles/User Permissions. Which will generate an access key and secret key for your S3 Bucket. + +- For the S3 bucket, apply the following CORS policy for proper access control from the museum service. + +```json +[ + { + "AllowedOrigins": ["*"], + "AllowedHeaders": ["*"], + "AllowedMethods": ["GET", "HEAD", "POST", "PUT", "DELETE"], + "MaxAgeSeconds": 3000, + "ExposeHeaders": ["Etag"] + } +] +``` + +- Fill the credentials like `endpoint`, `region`, `bucket`, `access key`, `secret key`. + +- Deploy the Service and you are good to go. + +### 2. Coolify minio bucket. + +- Minio is expected to be exposed over HTTPS and needs SSL/TLS, so make sure your proxies are setup properly. Here is a useful [link](https://selfhostschool.com/minio-self-hosted-s3-storage-guide/) for set up and configuration. + +- Once you have deployed the Minio service from Coolify you can login to the service from the console URL and use the same username and password as set in the environment variables user the API URL for backend or shell based usecases. + +```bash +# Set Alias +mc alias set + +# List buckets (same us used in coolify to validate S3) +minio/mc ls myminio +``` + +- Once logged in, create a bucket for your use in Ente. + +- The default region for Minio is `us-east-1`, so you can use the same. + +- Use the API endpoint as bucket endpoint for Ente config. + +**Note**: Additional details are available [here](https://help.ente.io/self-hosting/administration/object-storage). + +## Environment Variables + +| Variable Name | Service | Description | Default Value | Required | Prefilled | +| ------------------------------------- | -------- | ------------------------------------------------------------------------------------------- | ------------------ | -------- | --------- | +| `SERVICE_URL_MUSEUM_8080` | museum | URL for the museum service on port 8080 | - | Yes | Yes | +| `ENTE_HTTP_USE_TLS` | museum | Enable/disable TLS for HTTP connections | `false` | No | Yes | +| `SERVICE_URL_WEB_3002` | museum | URL for the web albums service | - | Yes | Yes | +| `SERVICE_URL_WEB_3004` | museum | URL for the web cast service | - | Yes | Yes | +| `SERVICE_URL_WEB_3001` | museum | URL for the web accounts service | - | Yes | Yes | +| `ENTE_DB_HOST` | museum | PostgreSQL database host | `postgres` | No | Yes | +| `ENTE_DB_PORT` | museum | PostgreSQL database port | `5432` | No | Yes | +| `ENTE_DB_NAME` | museum | PostgreSQL database name | `ente_db` | No | Yes | +| `SERVICE_USER_POSTGRES` | museum | PostgreSQL database username | `pguser` | No | Yes | +| `SERVICE_PASSWORD_POSTGRES` | museum | PostgreSQL database password | - | Yes | Yes | +| `SERVICE_REALBASE64_ENCRYPTION` | museum | Base64 encoded encryption key | - | Yes | Yes | +| `SERVICE_REALBASE64_64_HASH` | museum | Base64 encoded hash key | - | Yes | Yes | +| `SERVICE_REALBASE64_JWT` | museum | Base64 encoded JWT secret | - | Yes | Yes | +| `ENTE_INTERNAL_ADMIN` | museum | Internal admin user ID | `1580559962386438` | No | Yes | +| `ENTE_INTERNAL_DISABLE_REGISTRATION` | museum | Disable user registration | `false` | No | Yes | +| `PRIMARY_STORAGE_ARE_LOCAL_BUCKETS` | museum | Use local buckets for primary storage (false unless you are connecting to bucket over http) | `false` | No | Yes | +| `PRIMARY_STORAGE_USE_PATH_STYLE_URLS` | museum | Use path-style URLs for storage | `true` | No | Yes | +| `S3_STORAGE_KEY` | museum | S3 storage access key | - | Yes | No | +| `S3_STORAGE_SECRET` | museum | S3 storage secret key | - | Yes | No | +| `S3_STORAGE_ENDPOINT` | museum | S3 storage endpoint URL | - | Yes | No | +| `S3_STORAGE_REGION` | museum | S3 storage region | `us-east-1` | No | Yes | +| `S3_STORAGE_BUCKET` | museum | S3 storage bucket name | - | Yes | No | +| `SERVICE_URL_WEB_3000` | web | URL for the main web service | - | Yes | Yes | +| `SERVICE_URL_MUSEUM` | web | URL for the museum service | - | Yes | Yes | +| `SERVICE_URL_WEB_3002` | web | URL for the albums service | - | Yes | Yes | +| `SERVICE_USER_POSTGRES` | postgres | PostgreSQL username | `pguser` | No | Yes | +| `SERVICE_PASSWORD_POSTGRES` | postgres | PostgreSQL password | - | Yes | Yes | +| `SERVICE_DB_NAME` | postgres | PostgreSQL database name | `ente_db` | No | Yes | + +## Links + +- [The official website](https://ente.io?utm_source=coolify.io) +- [Documentation](https://help.ente.io?utm_source=coolify.io) +- [GitHub](https://github.com/ente-io/ente?utm_source=coolify.io) diff --git a/content/docs/services/esphome.mdx b/content/docs/services/esphome.mdx new file mode 100644 index 00000000..636ca577 --- /dev/null +++ b/content/docs/services/esphome.mdx @@ -0,0 +1,22 @@ +--- +title: "ESPHome" +description: "Open-source firmware framework for WiFi-enabled microcontrollers." +og: + description: "Smart Home Made Simple." +category: "IoT" +icon: "/docs/images/services/esphome-logo.svg" +--- + +# ESPHome + + + +## What is ESPHome? + +ESPHome is an open-source firmware framework that simplifies the process of creating custom firmware for popular WiFi-enabled microcontrollers. + +## Links + +- [Official website](https://esphome.io/?utm_source=coolify.io) +- [Documentation](https://esphome.io/guides/getting_started_command_line/?utm_source=coolify.io) +- [GitHub](https://github.com/esphome/esphome?utm_source=coolify.io) diff --git a/content/docs/services/espocrm.mdx b/content/docs/services/espocrm.mdx new file mode 100644 index 00000000..8fe613c6 --- /dev/null +++ b/content/docs/services/espocrm.mdx @@ -0,0 +1,43 @@ +--- +title: "EspoCRM" +description: "A free and open-source CRM platform." +og: + description: "Here you can find the documentation for hosting EspoCRM with Coolify." +category: "Business" +icon: "/docs/images/services/espocrm.svg" +--- + + + +## What is EspoCRM? + +EspoCRM is an open-source customer relationship management (CRM) system for managing sales, marketing, and customer support in one place. Lightweight and flexible, it gives organizations full control over their data. + +Use cases: + +* Managing leads, contacts, and sales pipelines +* Automating business processes with workflows +* Tracking customer communication and activities +* Handling support tickets and service requests +* Generating reports and analytics for business insights +* Integrating with email and third-party services + +## Why EspoCRM? + +* **Open-source and transparent.** EspoCRM is open source, so you can inspect the code and understand exactly how your data is handled. +* **Highly customizable.** You can add custom entities, fields, relationships, and buttons to match your workflows. EspoCRM works as both a CRM and a platform for custom business apps. +* **Simple, fast interface.** The UI is clean and easy to navigate, which helps teams get started quickly. +* **Easy integration.** EspoCRM provides a straightforward REST API for connecting with external tools and services. + +## Credentials + +After deploying the service, you can log in with the following credentials: + +- **Username:** admin +- **Password:** is autogenerated and available in the *Service Specific Configuration* + +## Links + +- [Official website](https://www.espocrm.com/?utm_source=coolify) +- [Documentation](https://docs.espocrm.com/?utm_source=coolify) +- [GitHub](https://github.com/espocrm/espocrm?utm_source=coolify) diff --git a/content/docs/services/evolution-api.mdx b/content/docs/services/evolution-api.mdx new file mode 100644 index 00000000..1e19db5d --- /dev/null +++ b/content/docs/services/evolution-api.mdx @@ -0,0 +1,27 @@ +--- +title: "Evolution API" +description: "WhatsApp API service for automation." +og: + description: "Deploy Evolution API on Coolify for WhatsApp Business integration, message automation, chatbot workflows, and customer communication management." +category: "Automation" +icon: "/docs/images/services/evolution-api-logo.svg" +--- + +## What is Evolution API? + +Evolution API is a robust platform devoted to empowering small businesses, entrepreneurs, freelancers, and individuals with limited resources—offering more than just a basic WhatsApp™ messaging solution. + +## What I need to configure to make Coolify work with Evolution API? + +The docker-compose available in Coolify should be able to install everything you need to start with the Evolution API + Postgres + Redis + Evolution Manager. + +Once everything is running, you can access your https://url/manager. + +## Screenshots + +SCR-20250314-ojnw + +## Links + +- [GitHub](https://github.com/EvolutionAPI/evolution-api?utm_source=coolify.io) +- [Official Documentation](https://doc.evolution-api.com/v1/en/get-started/introduction?utm_source=coolify.io) diff --git a/content/docs/services/excalidraw.mdx b/content/docs/services/excalidraw.mdx new file mode 100644 index 00000000..e6bbfa4a --- /dev/null +++ b/content/docs/services/excalidraw.mdx @@ -0,0 +1,21 @@ +--- +title: "Excalidraw" +description: "Virtual whiteboard for sketching hand-drawn like diagrams." +og: + description: "Run Excalidraw on Coolify for collaborative whiteboarding with hand-drawn diagrams, real-time collaboration, and export options for visual thinking." +category: "Productivity" +icon: "/docs/images/services/excalidraw-logo.svg" +--- + +# Excalidraw + + + +## What is Excalidraw? + +Excalidraw is a virtual whiteboard for sketching hand-drawn like diagrams. It's a collaborative drawing tool that allows you to create diagrams that feel hand-drawn. Excalidraw is perfect for wireframing, brainstorming, creating flowcharts, and collaborative design sessions. It supports real-time collaboration, exports to various formats, and has an intuitive interface that makes digital sketching feel natural. + +## Links + +- [The official website](https://excalidraw.com?utm_source=coolify.io) +- [GitHub](https://github.com/excalidraw/excalidraw?utm_source=coolify.io) diff --git a/content/docs/services/faraday.mdx b/content/docs/services/faraday.mdx new file mode 100644 index 00000000..6a78911b --- /dev/null +++ b/content/docs/services/faraday.mdx @@ -0,0 +1,20 @@ +--- +title: Faraday +description: "Collaborative penetration testing and vulnerability management platform." +og: + description: "Host Faraday security platform on Coolify for penetration testing management, vulnerability tracking, and collaborative security assessment workflows." +category: "Security" +icon: "/docs/images/services/faraday-logo.png" +--- + +# Faraday + + + +## What is Faraday + +Faraday is a powerful, open-source, web-based vulnerability management tool. + +## Links + +- [Official Documentation](https://faradaysec.com/?utm_source=coolify.io) diff --git a/content/docs/services/fider.mdx b/content/docs/services/fider.mdx new file mode 100644 index 00000000..1e24f500 --- /dev/null +++ b/content/docs/services/fider.mdx @@ -0,0 +1,22 @@ +--- +title: "Fider" +description: "An open platform to collect and organize customer feedback." +og: + description: "Deploy Fider feedback platform on Coolify for product ideas, feature voting, roadmap planning, and customer feedback collection for product teams." +category: "Business" +icon: "/docs/images/services/fider-logo.svg" +--- + + + +## What is Fider? + +Fider is a feedback portal for feature requests and suggestions. Give your customers a voice and let them tell you what they need. Spend less time guessing and more time building the right product. + +## How to setup + +See the official [Fider + Coolify guide](https://docs.fider.io/hosting-coolify?utm_source=coolify.io) + +## Links + +- [The official website](https://fider.io?utm_source=coolify.io) diff --git a/content/docs/services/filebrowser.mdx b/content/docs/services/filebrowser.mdx new file mode 100644 index 00000000..a907cdd6 --- /dev/null +++ b/content/docs/services/filebrowser.mdx @@ -0,0 +1,30 @@ +--- +title: "Filebrowser" +description: "A file manager for the web." +og: + description: "Run File Browser on Coolify for web-based file management with uploads, sharing, search, and access control for self-hosted cloud storage." +category: "File Management" +icon: "/docs/images/services/filebrowser-logo.svg" +--- + + + +## What is Filebrowser? + +Filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app. + +## Setup + +- Deploy Filebrowser using Coolify template +- In the Filebrowser UI login with credentials: + - Username: `admin` + - Password: randomly generated, viewable in the logs + +## Screenshots + + + +## Links + +- [The official Filebrowser website](https://filebrowser.org?utm_source=coolify.io) +- [GitHub](https://github.com/filebrowser/filebrowser?utm_source=coolify.io) diff --git a/content/docs/services/fileflows.mdx b/content/docs/services/fileflows.mdx new file mode 100644 index 00000000..8c7fbe22 --- /dev/null +++ b/content/docs/services/fileflows.mdx @@ -0,0 +1,35 @@ +--- +title: "FileFlows" +description: "A automatic file processing service." +og: + description: "Host FileFlows on Coolify for automated file processing, media conversion, organization workflows, and batch operations with visual flow builder." +category: "File Management" +icon: "/docs/images/services/fileflows-logo.svg" +--- + + + +## What is FileFlows? + +Are you tired of manually managing your files? Meet FileFlows — the ultimate solution for automatic file processing! + +FileFlows lets you monitor and process any file type with custom flows. Videos, audio, images, archives, comics, eBooks—you name it! + +## Installation + +1. Create the service within Coolify. +2. If your device supports it, enable hardware transcoding by uncommenting this section in the compose file: + +```yaml +#devices: +# - "/dev/dri:/dev/dri" +``` + +## Screenshots + + + +## Links + +- [The official website](https://fileflows.com/) +- [Doc](https://fileflows.com/docs) diff --git a/content/docs/services/firefly.mdx b/content/docs/services/firefly.mdx new file mode 100644 index 00000000..ff131f9c --- /dev/null +++ b/content/docs/services/firefly.mdx @@ -0,0 +1,27 @@ +--- +title: "Firefly III" +description: "A personal finances manager." +og: + description: "Manage personal finances on Coolify with Firefly III featuring budgets, reports, recurring transactions, and multi-currency expense tracking." +category: "Finance" +icon: "/docs/images/services/firefly-iii-logo.svg" +--- + + + +## What is Firefly III? + +"Firefly III" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. Using a bunch of external tools, you can import data. It also has many neat financial reports available. + +Firefly III should give you insight into and control over your finances. Money should be useful, not scary. You should be able to see where it is going, to feel your expenses and to... wow, I'm going overboard with this aren't I? + +But you get the idea: this is your money. These are your expenses. Stop them from controlling you. I built this tool because I started to dislike money. Having money, not having money, paying bills with money, you get the idea. But no more. I want to feel "safe", whatever my balance is. And I hope this tool can help you. I know it helps me. + +## Screenshots + + + +## Links + +- [The official website](https://firefly-iii.org?utm_source=coolify.io) +- [GitHub](https://github.com/firefly-iii/firefly-iii?utm_source=coolify.io) diff --git a/content/docs/services/firefox.mdx b/content/docs/services/firefox.mdx new file mode 100644 index 00000000..153ebfc5 --- /dev/null +++ b/content/docs/services/firefox.mdx @@ -0,0 +1,20 @@ +--- +title: Firefox +description: "Firefox browser in a container." +og: + description: "Run Firefox browser on Coolify in containerized environment for secure web browsing, testing, and isolated internet access via web interface." +category: "Browser" +icon: "/docs/images/services/firefox-logo.png" +--- + +# Firefox + + + +## What is Firefox + +Fast, private, and self-hosted secure browser for browsing without limits. + +## Links + +- [Official Documentation](https://github.com/jlesage/docker-firefox?utm_source=coolify.io) diff --git a/content/docs/services/fizzy.mdx b/content/docs/services/fizzy.mdx new file mode 100644 index 00000000..99ef5c7e --- /dev/null +++ b/content/docs/services/fizzy.mdx @@ -0,0 +1,21 @@ +--- +title: "Fizzy" +description: "Kanban tracking tool for issues and ideas by 37signals." +og: + description: "Kanban tracking tool for issues and ideas by 37signals" +category: "Project Management" +icon: "/docs/images/services/fizzy-logo.png" +--- + +# Fizzy + + + +## What is Fizzy? + +Fizzy is a lightweight Kanban board tool developed by 37signals for tracking issues and ideas. + +## Links + +- [Official website](https://www.fizzy.do/?utm_source=coolify.io) +- [GitHub](https://github.com/basecamp/fizzy?utm_source=coolify.io) diff --git a/content/docs/services/flipt.mdx b/content/docs/services/flipt.mdx new file mode 100644 index 00000000..d442b9f5 --- /dev/null +++ b/content/docs/services/flipt.mdx @@ -0,0 +1,20 @@ +--- +title: Flipt +description: "Open-source feature flag management platform." +og: + description: "Host Flipt feature flags on Coolify for feature toggles, A/B testing, gradual rollouts, and environment-specific configuration management." +category: "Development" +icon: "/docs/images/services/flipt-logo.svg" +--- + +# Flipt + + + +## What is Flipt + +Flipt is a fully managed feature flag solution that enables you to keep your feature flags and remote config next to your code in Git. + +## Links + +- [Official Documentation](https://docs.flipt.io/cloud/overview?utm_source=coolify.io) diff --git a/content/docs/services/flowise.mdx b/content/docs/services/flowise.mdx new file mode 100644 index 00000000..eda1aa14 --- /dev/null +++ b/content/docs/services/flowise.mdx @@ -0,0 +1,38 @@ +--- +title: Flowise +description: "Drag & drop UI to build your customized LLM flow." +og: + description: "Build AI workflows on Coolify with Flowise drag-and-drop LLM interface for chatbots, agents, RAG applications, and custom AI tool integration." +category: "AI" +icon: "/docs/images/services/flowise-logo.svg" +--- + +# Flowise + + + +## What is Flowise + +Flowise is an open source low-code tool for developers to build customized LLM orchestration flows & AI agents. + +## Deployment Variants + +Flowise is available in two deployment configurations in Coolify: + +### Flowise (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal AI workflow development +- **Components:** Single Flowise container with built-in SQLite database + +### Flowise with Databases +- **Database:** PostgreSQL + Redis +- **Use case:** Production deployments requiring better performance, caching, and scalability +- **Components:** + - Flowise container + - PostgreSQL container for data persistence + - Redis container for caching and session management + - Automatic database configuration and health checks + +## Links + +- [Official Documentation](https://docs.flowiseai.com/?utm_source=coolify.io) diff --git a/content/docs/services/forgejo.mdx b/content/docs/services/forgejo.mdx new file mode 100644 index 00000000..e81c9004 --- /dev/null +++ b/content/docs/services/forgejo.mdx @@ -0,0 +1,69 @@ +--- +title: "Forgejo" +description: "A self-hosted Git service fork of Gitea." +og: + description: "Deploy Forgejo Git hosting on Coolify as lightweight GitHub alternative with repositories, CI/CD, issues, pull requests, and collaboration tools." +category: "Development" +icon: "/docs/images/services/forgejo-logo.svg" +--- + + + +## What is Forgejo? + +Forgejo is a self-hosted lightweight software forge. It's easy to install and low maintenance, it just does the job. + +## Deployment Variants + +Forgejo is available in four deployment configurations in Coolify: + +### Forgejo (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal Git hosting +- **Components:** Single Forgejo container with built-in SQLite database + +### Forgejo with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and scalability +- **Components:** + - Forgejo container + - PostgreSQL container + - Automatic database configuration and health checks + +### Forgejo with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - Forgejo container + - MySQL container + - Automatic database configuration and health checks + +### Forgejo with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference +- **Components:** + - Forgejo container + - MariaDB container + - Automatic database configuration and health checks + +## Forgejo Actions Runner + +Forgejo has available a first party "actions runner" to [execute task jobs on a repository](https://forgejo.org/docs/latest/user/actions/), much like [GitHub Actions](https://docs.github.com/en/actions) or [GitLab CI](https://docs.gitlab.com/ee/ci/index.html). + +Coolify includes Forgejo services with a single runner, using [Docker-in-Docker](https://hub.docker.com/_/docker) to handle and report task jobs. + +Due to the alpha status of the Forgejo runner, rebooting the Forejo application container after the initial setup is required to fully register the shared secret into Forejo for runners to validate: + +1. In the **Environment Variables** section of the service configuration, you may set as `RUNNER_SHARED_SECRET` a random 40-character hexagesimal string. The command `openssl rand -hex 20` creates something you can copy and paste. +2. After successfully setting up Forejo, **reboot the `forgejo` service** and wait some seconds until the runner appears in Forgejo _Actions_ Configuration section. + +Forejo is also compatible with third-party CI apps and platforms. Forgejo is a Gitea-fork, so instructions to incorporate these CI may be the same for both. + +## Demo + +- [Demo](https://next.forgejo.org/) + +## Links + +- [The official website](https://forgejo.org/) +- [Codeberg](https://codeberg.org/forgejo/forgejo) diff --git a/content/docs/services/formbricks.mdx b/content/docs/services/formbricks.mdx new file mode 100644 index 00000000..3464b256 --- /dev/null +++ b/content/docs/services/formbricks.mdx @@ -0,0 +1,24 @@ +--- +title: "Formbricks" +description: "A form builder for static sites." +og: + description: "Run Formbricks surveys on Coolify for in-app feedback, NPS surveys, user research, and product experience analytics with no-code forms." +category: "Development" +icon: "/docs/images/services/formbricks-logo.png" +--- + + + +## What is Formbricks? + +Formbricks provides a free and open source surveying platform. Gather feedback at every point in the user journey with beautiful in-app, website, link and email surveys. Build on top of Formbricks or leverage prebuilt data analysis capabilities. + +## Screenshots + + + + +## Links + +- [The official website](https://formbricks.com?utm_source=coolify.io) +- [GitHub](https://github.com/formbricks/formbricks?utm_source=coolify.io) diff --git a/content/docs/services/foundryvtt.mdx b/content/docs/services/foundryvtt.mdx new file mode 100644 index 00000000..21aebc49 --- /dev/null +++ b/content/docs/services/foundryvtt.mdx @@ -0,0 +1,20 @@ +--- +title: Foundryvtt +description: "Virtual tabletop for tabletop role-playing games." +og: + description: "Host Foundry VTT on Coolify for virtual tabletop RPG gaming with dynamic lighting, fog of war, character sheets, and immersive D&D sessions." +category: "Gaming" +icon: "/docs/images/services/foundryvtt-logo.png" +--- + +# Foundryvtt + + + +## What is Foundryvtt + +Foundry Virtual Tabletop is a self-hosted & modern roleplaying platform + +## Links + +- [Official Documentation](https://foundryvtt.com/kb/?utm_source=coolify.io) diff --git a/content/docs/services/freescout.mdx b/content/docs/services/freescout.mdx new file mode 100644 index 00000000..45fa736b --- /dev/null +++ b/content/docs/services/freescout.mdx @@ -0,0 +1,20 @@ +--- +title: Freescout +description: "Help desk and customer support application." +og: + description: "Deploy FreeScout helpdesk on Coolify as self-hosted HelpScout alternative with shared inbox, ticketing, and customer support email management." +category: "Business" +icon: "/docs/images/services/freescout-logo.png" +--- + +# Freescout + + + +## What is Freescout + +FreeScout is the super lightweight and powerful free open source help desk and shared inbox written in PHP (Laravel framework). + +## Links + +- [Official Documentation](https://github.com/freescout-help-desk/freescout/wiki/?utm_source=coolify.io) diff --git a/content/docs/services/freshrss.mdx b/content/docs/services/freshrss.mdx new file mode 100644 index 00000000..45b76142 --- /dev/null +++ b/content/docs/services/freshrss.mdx @@ -0,0 +1,53 @@ +--- +title: Freshrss +description: "Free, self-hostable RSS feed aggregator." +og: + description: "Run FreshRSS reader on Coolify for RSS/Atom feed aggregation, article reading, mobile apps integration, and news consumption with privacy." +category: "RSS" +icon: "/docs/images/services/freshrss-logo.png" +--- + +# Freshrss + + + +## What is Freshrss + +A free, self-hostable feed aggregator. + +## Deployment Variants + +FreshRSS is available in four deployment configurations in Coolify: + +### FreshRSS (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal RSS feed reading +- **Components:** Single FreshRSS container with built-in SQLite database + +### FreshRSS with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and scalability +- **Components:** + - FreshRSS container + - PostgreSQL container + - Automatic database configuration and health checks + +### FreshRSS with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - FreshRSS container + - MySQL container + - Automatic database configuration and health checks + +### FreshRSS with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference +- **Components:** + - FreshRSS container + - MariaDB container + - Automatic database configuration and health checks + +## Links + +- [Official Documentation](https://freshrss.org/index.html?utm_source=coolify.io) diff --git a/content/docs/services/garage.mdx b/content/docs/services/garage.mdx new file mode 100644 index 00000000..44cac0c6 --- /dev/null +++ b/content/docs/services/garage.mdx @@ -0,0 +1,22 @@ +--- +title: "Garage" +description: "S3-compatible distributed object storage service designed for self-hosting." +og: + description: "Garage is an S3-compatible distributed object storage service designed for self-hosting." +category: "Storage" +icon: "/docs/images/services/garage-logo.svg" +--- + +# Garage + + + +## What is Garage? + +Garage is a lightweight geo-distributed data store that implements the Amazon S3 object storage protocol. It enables applications to store large blobs such as pictures, video, images, documents, etc., in a redundant multi-node setting. S3 is versatile enough to also be used to publish a static website. + +## Links + +- [Official website](https://garagehq.deuxfleurs.fr/?utm_source=coolify.io) +- [Documentation](https://garagehq.deuxfleurs.fr/documentation/quick-start/?utm_source=coolify.io) +- [GitLab](https://git.deuxfleurs.fr/Deuxfleurs/garage?utm_source=coolify.io) diff --git a/content/docs/services/getoutline.mdx b/content/docs/services/getoutline.mdx new file mode 100644 index 00000000..97ab9a95 --- /dev/null +++ b/content/docs/services/getoutline.mdx @@ -0,0 +1,21 @@ +--- +title: "Outline" +description: "Open-source collaboration tool." +og: + description: "Host Outline wiki on Coolify for team knowledge base, documentation, real-time collaboration, and beautifully organized information sharing." +category: "Productivity" +icon: "/docs/images/services/outline-logo.svg" +--- + +# What is Outline? + + + +Outline is an open-source collaboration tool that allows you to create and share documents with your team. + +## Screenshots + +## Links + +- [The official website](https://getoutline.com/?utm_source=coolify.io) +- [GitHub](https://github.com/outline/outline?utm_source=coolify.io) diff --git a/content/docs/services/ghost.mdx b/content/docs/services/ghost.mdx new file mode 100644 index 00000000..d76e6e95 --- /dev/null +++ b/content/docs/services/ghost.mdx @@ -0,0 +1,19 @@ +--- +title: "Ghost" +description: "A professional publishing platform." +og: + description: "Deploy Ghost publishing platform on Coolify for professional blogs, newsletters, memberships, and content monetization with modern editor." +category: "CMS" +icon: "/docs/images/services/ghost-logo.svg" +--- + + + +## What is Ghost? + +Ghost is a powerful app for professional publishers to create, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members. + +## Links + +- [The official website](https://ghost.org/) +- [GitHub](https://github.com/TryGhost/Ghost) diff --git a/content/docs/services/gitea.mdx b/content/docs/services/gitea.mdx new file mode 100644 index 00000000..8382eede --- /dev/null +++ b/content/docs/services/gitea.mdx @@ -0,0 +1,56 @@ +--- +title: "Gitea" +description: "A painless self-hosted Git service." +og: + description: "Host Gitea Git service on Coolify for lightweight repository hosting with pull requests, CI/CD integration, issues, and team collaboration." +category: "Development" +icon: "/docs/images/services/gitea-logo.svg" +--- + + + +## What is Gitea? + +Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD. + +## Deployment Variants + +Gitea is available in four deployment configurations in Coolify: + +### Gitea (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, personal projects, or testing +- **Components:** Single Gitea container with built-in SQLite database + +### Gitea with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring PostgreSQL compatibility and better performance +- **Components:** + - Gitea container + - PostgreSQL 16 container + - Automatic database configuration and health checks + +### Gitea with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - Gitea container + - MySQL container + - Automatic database configuration and health checks + +### Gitea with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference +- **Components:** + - Gitea container + - MariaDB container + - Automatic database configuration and health checks + +## Demo + +- [Demo](https://try.gitea.io/) + +## Links + +- [The official website](https://gitea.com) +- [GitHub](https://github.com/go-gitea/gitea) diff --git a/content/docs/services/github-runner.mdx b/content/docs/services/github-runner.mdx new file mode 100644 index 00000000..d6af9f6b --- /dev/null +++ b/content/docs/services/github-runner.mdx @@ -0,0 +1,21 @@ +--- +title: "GitHub Runner" +description: "A GitHub Actions runner for Docker." +og: + description: "Run self-hosted GitHub Actions runner on Coolify for CI/CD workflows, private infrastructure builds, and automated deployment pipelines." +category: "Development" +icon: "/docs/images/services/githubrunner-logo.png" +--- + +# GitHub Runner + + + +## What is GitHub Runner? + +GitHub Runner is a self-hosted runner for GitHub Actions that allows you to run CI/CD workflows on your own infrastructure. This Docker-based solution provides more control over the execution environment, better security for private repositories, and can be more cost-effective for heavy workloads. It supports running workflows for multiple repositories and organizations. + +## Links + +- [The official GitHub Actions documentation](https://docs.github.com/en/actions/hosting-your-own-runners?utm_source=coolify.io) +- [GitHub](https://github.com/myoung34/docker-github-actions-runner?utm_source=coolify.io) diff --git a/content/docs/services/gitlab.mdx b/content/docs/services/gitlab.mdx new file mode 100644 index 00000000..c89f06d8 --- /dev/null +++ b/content/docs/services/gitlab.mdx @@ -0,0 +1,23 @@ +--- +title: "GitLab" +description: "DevOps lifecycle tool." +og: + description: "Deploy GitLab on Coolify for complete DevOps platform with Git repos, CI/CD pipelines, issue tracking, and container registry integration." +category: "Development" +icon: "/docs/images/services/gitlab-logo.svg" +--- + + + +## What is GitLab? + +GitLab is a web-based DevOps lifecycle tool that provides a Git-repository manager providing wiki, issue-tracking and CI/CD pipeline features, powered by Ruby on Rails framework. + +## Demo + +- [Demo](https://gitlab.com/) + +## Links + +- [The official website](https://about.gitlab.com) +- [GitLab](https://gitlab.com/gitlab-org/gitlab) diff --git a/content/docs/services/glance.mdx b/content/docs/services/glance.mdx new file mode 100644 index 00000000..f353159c --- /dev/null +++ b/content/docs/services/glance.mdx @@ -0,0 +1,20 @@ +--- +title: "Glance" +description: "All-in-one Home Server Dashboard." +og: + description: "Host Glance dashboard on Coolify for quick server overview, system monitoring, service status, and at-a-glance infrastructure health display." +category: "Administration" +icon: "/docs/images/services/glance-logo.png" +--- + +# Glance + +A self-hosted dashboard that puts all your feeds in one place. + +## Screenshots + + + +## Links + +- [The official website](https://github.com/glanceapp/glance) diff --git a/content/docs/services/glances.mdx b/content/docs/services/glances.mdx new file mode 100644 index 00000000..4cec0fb9 --- /dev/null +++ b/content/docs/services/glances.mdx @@ -0,0 +1,19 @@ +--- +title: "Glances" +description: "Cross-platform system monitoring tool." +og: + description: "Monitor system performance on Coolify with Glances showing CPU, memory, disk, network stats, and process monitoring via web interface." +category: "Monitoring" +icon: "/docs/images/services/glances-logo.png" +--- + + + +## What is Glances? + +Glances is a cross-platform monitoring tool which aims to provide a simple yet efficient and straightforward way to access and display system information. + +## Links + +- [The official website](https://nicolargo.github.io/glances/) +- [GitHub](https://github.com/nicolargo/glances) diff --git a/content/docs/services/glitchtip.mdx b/content/docs/services/glitchtip.mdx new file mode 100644 index 00000000..4edae2bd --- /dev/null +++ b/content/docs/services/glitchtip.mdx @@ -0,0 +1,19 @@ +--- +title: "Glitchtip" +description: "An open-source error tracking tool." +og: + description: "Deploy GlitchTip error tracking on Coolify as open-source Sentry alternative for exception monitoring, performance tracking, and debugging." +category: "Development" +icon: "/docs/images/services/glitchtip-logo.png" +--- + + + +## What is Glitchtip? + +Track errors, uptime, and performance. An open source reimplementation of Sentry error tracking platform. + +## Links + +- [The official website](https://glitchtip.com/) +- [GitHub](https://gitlab.com/glitchtip) diff --git a/content/docs/services/glpi.mdx b/content/docs/services/glpi.mdx new file mode 100644 index 00000000..612e812e --- /dev/null +++ b/content/docs/services/glpi.mdx @@ -0,0 +1,34 @@ +--- +title: GLPI (Gestionnaire Libre de Parc Informatique) +description: "Free, open-source IT Service Management platform for asset management, helpdesk, and service desk operations." +og: + description: "GLPI (Gestionnaire Libre de Parc Informatique) is a free, open-source IT Service Management (ITSM) platform used for IT asset management, helpdesk, and service desk operations." +category: "Business" +icon: "/docs/images/services/glpi-logo.svg" +--- + +# GLPI + + + +## What is GLPI + +GLPI (Gestionnaire Libre de Parc Informatique) is a free, open-source IT Service Management (ITSM) platform used for IT asset management, helpdesk, and service desk operations, helping organizations inventory hardware/software, manage incidents, track requests, and streamline IT support with features like CMDB, ticketing, and automation. + +### Initial Setup + +After deploying the template, GLPI will automatically complete an installation process, please allow four ~5 mins for full start up. You can then log in with: + + ```bash + # User + glpi + + # password + glpi + ``` + +## Links + +- [Official website](https://glpi-project.org/?utm_source=coolify.io) +- [Official Documentation](https://help.glpi-project.org/documentation/?utm_source=coolify.io) +- [GitHub](https://github.com/glpi-project/glpi?utm_source=coolify.io) diff --git a/content/docs/services/goatcounter.mdx b/content/docs/services/goatcounter.mdx new file mode 100644 index 00000000..0acec8b5 --- /dev/null +++ b/content/docs/services/goatcounter.mdx @@ -0,0 +1,34 @@ +--- +title: "GoatCounter" +description: "Web analytics platform offering easy to use and meaningful privacy-friendly web analytics." +og: + description: "Here you can find the documentation for hosting GoatCounter with Coolify." +category: "Analytics" +icon: "/docs/images/services/goatcounter.svg" +--- + + + +
+ +# What is GoatCounter? + +GoatCounter is an open source web analytics platform. It aims to offer easy to use and meaningful privacy-friendly web analytics. + +- Privacy-aware; doesn’t track users with unique identifiers and doesn't need a GDPR notice. Fine-grained control over which data is collected. + +- Lightweight and fast; adds just ~3.5K of extra data to your site. Also has JavaScript-free "tracking pixel" option, or you can use it from your application's middleware or import from logfiles. + +- Identify unique visits without cookies using a non-identifiable hash. + +- Keeps useful statistics such as browser information, location, and screen size. Keep track of referring sites and campaigns. + +- Easy; if you've been confused by the myriad of options and flexibility of Google Analytics and Matomo that you don't need then GoatCounter will be a breath of fresh air. + +- Accessibility is a high-priority feature, and the interface works well with assistive technology such as screen readers. + +## Links + +- [The official website](https://www.goatcounter.com?utm_source=coolify.io) +- [Documentation](https://www.goatcounter.com/help/start?utm_source=coolify.io) +- [GitHub](https://github.com/arp242/goatcounter?utm_source=coolify.io) diff --git a/content/docs/services/gotenberg.mdx b/content/docs/services/gotenberg.mdx new file mode 100644 index 00000000..4be19523 --- /dev/null +++ b/content/docs/services/gotenberg.mdx @@ -0,0 +1,22 @@ +--- +title: "Gotenberg" +description: "A Docker-powered stateless API for PDF files." +og: + description: "Run Gotenberg on Coolify for PDF generation from HTML, Markdown, Office files via Docker-based microservice with REST API for conversions." +category: "Development" +icon: "/docs/images/services/gotenberg-logo.png" +--- + + + +## What is Gotenberg? + +Gotenberg provides a developer-friendly API to interact with powerful tools like Chromium and LibreOffice +for converting numerous document formats (HTML, Markdown, Word, Excel, etc.) into PDF files, and more! + +Gotenberg **has no UI**. Head to the [documentation](https://gotenberg.dev/docs/getting-started/introduction) to learn how to interact with it 🚀. + +## Links + +- [Official Website](https://gotenberg.dev) +- [GitHub](https://github.com/gotenberg/gotenberg) diff --git a/content/docs/services/gotify.mdx b/content/docs/services/gotify.mdx new file mode 100644 index 00000000..5a27b6a9 --- /dev/null +++ b/content/docs/services/gotify.mdx @@ -0,0 +1,49 @@ +--- +title: "Gotify" +description: "Open-source push notifications for web and mobile apps." +og: + description: "Deploy Gotify on Coolify for self-hosted push notifications, real-time messaging, REST API integration, and Android/iOS notification delivery." +category: "Notifications" +icon: "/docs/images/services/gotify-logo.svg" +--- + + + +## What is Gotify? + +Gotify is a simple server for sending and receiving messages in real-time per WebSocket. It includes a sleek web UI for managing notifications and provides complete control over your notification data. + +## Features + +- **Self-Hosted & Privacy-Focused:** Complete control over your data with no reliance on third-party services +- **REST API:** Send messages through a simple and powerful REST API +- **WebSocket:** Receive messages in real-time using WebSocket connections +- **Cross-Platform:** Written in Go, works on multiple platforms including Docker +- **Android & iOS Support:** Native mobile apps available for push notifications +- **User Management:** Manage multiple users, clients, and applications +- **Lightweight:** Efficient server that doesn't consume excessive resources +- **Open Source:** MIT licensed and community-maintained +- **Easy Integration:** Simple API makes it easy to integrate with existing applications and services + +## Use Cases + +Perfect for receiving notifications from: + +- Monitoring systems and alerts +- CI/CD pipelines +- Home automation services +- Custom scripts and applications +- Server and application monitoring +- Backup notifications + +## Screenshots + + + +## Links + +- [The official website](https://gotify.net/) +- [GitHub](https://github.com/gotify/server) +- [Documentation](https://gotify.net/docs/) +- [Android App (Google Play)](https://play.google.com/store/apps/details?id=com.github.gotify) +- [Android App (F-Droid)](https://f-droid.org/de/packages/com.github.gotify/) diff --git a/content/docs/services/gowa.mdx b/content/docs/services/gowa.mdx new file mode 100644 index 00000000..bb84e3b0 --- /dev/null +++ b/content/docs/services/gowa.mdx @@ -0,0 +1,20 @@ +--- +title: "GoWa" +description: "Golang WhatsApp - Built with Go for efficient memory use." +og: + description: "Host Gowa analytics on Coolify for website traffic tracking, visitor insights, and privacy-respecting web analytics without cookies or tracking." +category: "Communication" +icon: "/docs/images/services/gowa-logo.svg" +--- + +# GoWa + + + +## What is GoWa? + +GoWa (Golang WhatsApp) is a WhatsApp Web API service built with Go for efficient memory usage and performance. It provides multi-device support and allows you to integrate WhatsApp functionality into your applications through a REST API. GoWa is designed to be lightweight and scalable, making it ideal for businesses that need WhatsApp automation and integration capabilities. + +## Links + +- [GitHub](https://github.com/aldinokemal/go-whatsapp-web-multidevice?utm_source=coolify.io) diff --git a/content/docs/services/grafana.mdx b/content/docs/services/grafana.mdx new file mode 100644 index 00000000..b3660b95 --- /dev/null +++ b/content/docs/services/grafana.mdx @@ -0,0 +1,47 @@ +--- +title: "Grafana" +description: "The open platform for beautiful analytics and monitoring." +og: + description: "Deploy Grafana on Coolify for data visualization, monitoring dashboards, alerting, and metric analysis from multiple data sources and databases." +category: "Monitoring" +icon: "/docs/images/services/grafana-logo.svg" +--- + + + +## What is Grafana? + +The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more. + +## Deployment Variants + +Grafana is available in two deployment configurations in Coolify: + +### Grafana (Default) +- **Database:** Embedded (SQLite) +- **Use case:** Simple monitoring setups, testing, or temporary dashboards +- **Components:** Single Grafana container with built-in database + +### Grafana with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring persistent data storage, high availability, and better performance +- **Components:** + - Grafana container + - PostgreSQL 16 container + - Automatic database configuration and health checks + +## Features + +Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture: + +- **Visualizations:** Fast and flexible client side graphs with a multitude of options. Panel plugins offer many different ways to visualize metrics and logs. +- **Dynamic Dashboards:** Create dynamic & reusable dashboards with template variables that appear as dropdowns at the top of the dashboard. +- **Explore Metrics:** Explore your data through ad-hoc queries and dynamic drilldown. Split view and compare different time ranges, queries and data sources side by side. +- **Explore Logs:** Experience the magic of switching from metrics to logs with preserved label filters. Quickly search through all your logs or streaming them live. +- **Alerting:** Visually define alert rules for your most important metrics. Grafana will continuously evaluate and send notifications to systems like Slack, PagerDuty, VictorOps, OpsGenie. +- **Mixed Data Sources:** Mix different data sources in the same graph! You can specify a data source on a per-query basis. This works for even custom datasources. + +## Links + +- [The official website](https://grafana.com/) +- [GitHub](https://github.com/grafana/grafana) diff --git a/content/docs/services/gramps-web.mdx b/content/docs/services/gramps-web.mdx new file mode 100644 index 00000000..14293750 --- /dev/null +++ b/content/docs/services/gramps-web.mdx @@ -0,0 +1,27 @@ +--- +title: "Gramps Web" +description: "The free, open-source genealogy system." +og: + description: "Deploy Gramps Web genealogy system on Coolify for building your family tree." +category: "Family" +icon: "/docs/images/services/grampsweb-logo.svg" +--- + +# Gramps Web + +{ width=64px } + +## What is Gramps Web? + +The free, open-source genealogy system for building your family tree – together. Use it standalone +or as a companion to Gramps Desktop, with full control over your data and privacy as the top priority. + +## Screenshots + + + +## Links + +- [Official website](https://www.grampsweb.org/?utm_source=coolify.io) +- [GitHub](https://github.com/gramps-project/gramps-web?utm_source=coolify.io) diff --git a/content/docs/services/grimmory.mdx b/content/docs/services/grimmory.mdx new file mode 100644 index 00000000..7f8124d8 --- /dev/null +++ b/content/docs/services/grimmory.mdx @@ -0,0 +1,25 @@ +--- +title: "Grimmory" +description: "A self-hosted ebook library manager and reader, successor to Booklore." +og: + description: "Here you can find the documentation for hosting Grimmory with Coolify." +category: "Media" +icon: "/docs/images/services/grimmory.svg" +--- + +# Grimmory + +Grimmory Logo + +## What is Grimmory? + +Grimmory is a self-hosted ebook library manager and reader, and the successor +to Booklore. It allows you to organize, manage, and read your ebook collection +from a clean web interface, with support for auto-importing books via a +bookdrop folder. + +## Links + +- [Official website](https://grimmory.org/) +- [GitHub](https://github.com/grimmory-tools/grimmory?utm_source=coolify.io) +- [Docker Hub](https://hub.docker.com/r/grimmory/grimmory?utm_source=coolify.io) diff --git a/content/docs/services/grist.mdx b/content/docs/services/grist.mdx new file mode 100644 index 00000000..e2e33c47 --- /dev/null +++ b/content/docs/services/grist.mdx @@ -0,0 +1,19 @@ +--- +title: "Grist" +description: "Modern relational spreadsheet combining flexibility and database robustness." +og: + description: "Run Grist spreadsheet on Coolify combining spreadsheets and databases with relational data, forms, automation, and collaborative data management." +category: "Productivity" +icon: "/docs/images/services/grist-logo.svg" +--- + + + +## What is Grist? + +Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database. + +## Links + +- [The official website](https://getgrist.com/?utm_source=coolify.io) +- [GitHub](https://github.com/gristlabs/grist-core?utm_source=coolify.io) diff --git a/content/docs/services/grocy.mdx b/content/docs/services/grocy.mdx new file mode 100644 index 00000000..18e0b109 --- /dev/null +++ b/content/docs/services/grocy.mdx @@ -0,0 +1,21 @@ +--- +title: "Grocy" +description: "A self-hosted groceries & household management solution for your home." +og: + description: "Manage household on Coolify with Grocy for grocery inventory, recipe management, chore tracking, and smart shopping lists for home organization." +category: "Home" +icon: "/docs/images/services/grocy-logo.svg" +--- + + + +## What is Grocy? + +Grocy is a web-based self-hosted groceries & household management solution for your home. +After installation your default credentials will be username: `admin`, password: `admin`. +Make sure to update these ASAP by logging in and editing the `admin` user in the settings, which can be found in the top right of your screen. + +## Links + +- [The official website](https://grocy.info) +- [GitHub](https://github.com/grocy/grocy) diff --git a/content/docs/services/hatchet.mdx b/content/docs/services/hatchet.mdx new file mode 100644 index 00000000..b105fedf --- /dev/null +++ b/content/docs/services/hatchet.mdx @@ -0,0 +1,22 @@ +--- +title: "Hatchet" +description: "Platform for running background tasks and durable workflows built on Postgres." +og: + description: "Hatchet allows you to run background tasks at scale with a high-throughput, low-latency computing service built on an open-source, fault-tolerant queue." +category: "Development" +icon: "/docs/images/services/hatchet-logo.svg" +--- + +# Hatchet + + + +## What is Hatchet? + +Hatchet is a platform for running background tasks and durable workflows, built on top of Postgres. It bundles a durable task queue, observability, alerting, a dashboard, and a CLI into a single platform. + +## Links + +- [Official website](https://hatchet.run/?utm_source=coolify.io) +- [Documentation](https://docs.hatchet.run/self-hosting/docker-compose?utm_source=coolify.io) +- [GitHub](https://github.com/hatchet-dev/hatchet?utm_source=coolify.io) diff --git a/content/docs/services/heimdall.mdx b/content/docs/services/heimdall.mdx new file mode 100644 index 00000000..0429c2a2 --- /dev/null +++ b/content/docs/services/heimdall.mdx @@ -0,0 +1,27 @@ +--- +title: "Heimdall" +description: "An elegant solution to organize all your web applications." +og: + description: "Deploy Heimdall dashboard on Coolify for application launcher, bookmark manager, and organized access point to all your self-hosted services." +category: "Administration" +icon: "/docs/images/services/heimdall-logo.svg" +--- + + + +## What is Heimdall? + +As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like. + +Heimdall is an elegant solution to organise all your web applications. It’s dedicated to this purpose so you won’t lose your links in a sea of bookmarks. + +Why not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo. + +## Screenshots + + + +## Links + +- [The official website](https://heimdall.site/) +- [GitHub](https://github.com/linuxserver/Heimdall) diff --git a/content/docs/services/heyform.mdx b/content/docs/services/heyform.mdx new file mode 100644 index 00000000..9c7dbb9b --- /dev/null +++ b/content/docs/services/heyform.mdx @@ -0,0 +1,20 @@ +--- +title: Heyform +description: "Open-source form builder for conversational forms." +og: + description: "Build forms on Coolify with HeyForm featuring conversational forms, conditional logic, integrations, and beautiful form experiences without coding." +category: "Development" +icon: "/docs/images/services/heyform-logo.svg" +--- + +# Heyform + + + +## What is Heyform + +Allows anyone to create engaging conversational forms for surveys, questionnaires, quizzes, and polls. No coding skills required. + +## Links + +- [Official Documentation](https://docs.heyform.net/open-source/self-hosting?utm_source=coolify.io) diff --git a/content/docs/services/hoarder.mdx b/content/docs/services/hoarder.mdx new file mode 100644 index 00000000..6ef325f3 --- /dev/null +++ b/content/docs/services/hoarder.mdx @@ -0,0 +1,28 @@ +--- +title: Hoarder +description: "Self-hosted bookmark manager with AI-powered tagging." +og: + description: "Host Hoarder bookmark manager on Coolify for saving links, organizing collections, tagging, and personal knowledge management with search." +category: "Bookmarks" +icon: "/docs/images/services/hoarder-logo.png" +--- + + + + +This service is currently not available in Coolify's service catalog. + + + + +# Hoarder + + + +## What is Hoarder + +an open source "Bookmark Everything" app that uses AI for automatically tagging the content you throw at it. + +## Links + +- [Official Documentation](https://docs.hoarder.app/?utm_source=coolify.io) diff --git a/content/docs/services/homarr.mdx b/content/docs/services/homarr.mdx new file mode 100644 index 00000000..c4777c64 --- /dev/null +++ b/content/docs/services/homarr.mdx @@ -0,0 +1,20 @@ +--- +title: Homarr +description: "Customizable browser homepage and dashboard." +og: + description: "Run Homarr dashboard on Coolify for service management, monitoring, quick access, widgets, and customizable homepage for self-hosted applications." +category: "Administration" +icon: "/docs/images/services/homarr-logo.svg" +--- + +# Homarr + + + +## What is Homarr + +Homarr is a self-hosted homepage for your services. + +## Links + +- [Official Documentation](https://homarr.dev?utm_source=coolify.io) diff --git a/content/docs/services/home-assistant.mdx b/content/docs/services/home-assistant.mdx new file mode 100644 index 00000000..541bb703 --- /dev/null +++ b/content/docs/services/home-assistant.mdx @@ -0,0 +1,32 @@ +--- +title: "Home Assistant" +description: "Open-source home automation platform focused on local control and privacy." +og: + description: "Run Home Assistant on Coolify—your open-source home automation platform with integrations for hundreds of devices." +category: "Home" +icon: "/docs/images/services/homeassistant-logo.svg" +--- + +# Home Assistant + + + +## What is Home Assistant? + +Home Assistant is an open‑source home automation platform focused on local control and privacy. It connects lights, sensors, cameras, media players, and more—so you can automate routines, build dashboards, and control everything from a single place. + +## Features + +- **1,000+ Integrations**: Support for thousands of smart home devices and services +- **Local Control**: Runs privately in your environment without cloud dependencies +- **Powerful Automations**: Create complex routines with YAML configuration or visual UI +- **Multi-Platform Access**: Mobile apps, web dashboards, voice control, and remote access +- **Privacy-Focused**: Your data stays on your server with no tracking or telemetry +- **Extensible**: Add-ons, custom integrations, and active community support + +## Links + +- [Official Website](https://www.home-assistant.io/?utm_source=coolify.io) +- [Documentation](https://www.home-assistant.io/docs/?utm_source=coolify.io) +- [GitHub](https://github.com/home-assistant/core?utm_source=coolify.io) +- [Community Forums](https://community.home-assistant.io/?utm_source=coolify.io) diff --git a/content/docs/services/homebox.mdx b/content/docs/services/homebox.mdx new file mode 100644 index 00000000..86280363 --- /dev/null +++ b/content/docs/services/homebox.mdx @@ -0,0 +1,25 @@ +--- +title: "Homebox" +description: "Inventory and organization system built for the Home User." +og: + description: "Manage home inventory on Coolify with Homebox for asset tracking, warranty management, location organization, and household item cataloging." +category: "Home" +icon: "/docs/images/services/homebox-logo.svg" +--- + +# Homebox + + + +## What is Homebox? + +Homebox is an inventory and organization system built specifically for home users. It allows you to catalog and track your belongings, create locations and categories, manage warranties and receipts, and keep detailed records of your household items. Homebox is perfect for insurance purposes, organizing collections, and general home inventory management with features like photo attachments, search functionality, and reporting capabilities. + +## Configuration + +In order to create your first account you will have to head to the environment variables for Homebox and set `HBOX_OPTIONS_ALLOW_REGISTRATION` to true and restart your docker for the change to take effect. +You are now able to create your first account, after which you can set `HBOX_OPTIONS_ALLOW_REGISTRATION` to false again to prevent new registrations, or keep them opened for other users to join your homebox. + +## Links + +- [GitHub](https://github.com/hay-kot/homebox?utm_source=coolify.io) diff --git a/content/docs/services/homepage.mdx b/content/docs/services/homepage.mdx new file mode 100644 index 00000000..4f19452d --- /dev/null +++ b/content/docs/services/homepage.mdx @@ -0,0 +1,22 @@ +--- +title: "Homepage" +description: "A modern homepage for your server." +og: + description: "Deploy Homepage dashboard on Coolify for service bookmarks, status monitoring, widgets integration, and organized homepage for self-hosted tools." +category: "Administration" +icon: "/docs/images/services/homepage-logo.png" +--- + + + +## What is Homepage? + +A modern, fully static, fast, secure fully proxied, highly customizable application dashboard + +## Screenshots + + + +## Links + +- [The official website](https://gethomepage.dev/latest/) diff --git a/content/docs/services/hoppscotch.mdx b/content/docs/services/hoppscotch.mdx new file mode 100644 index 00000000..6f66715b --- /dev/null +++ b/content/docs/services/hoppscotch.mdx @@ -0,0 +1,20 @@ +--- +title: Hoppscotch +description: "Open-source API development ecosystem." +og: + description: "Run Hoppscotch API testing on Coolify as open-source Postman alternative with REST, GraphQL, WebSocket testing, and API development tools." +category: "Development" +icon: "/docs/images/services/hoppscotch-logo.png" +--- + +# Hoppscotch + + + +## What is Hoppscotch + +The Open Source API Development Platform + +## Links + +- [Official Documentation](https://docs.hoppscotch.io?utm_source=coolify.io) diff --git a/content/docs/services/imgcompress.mdx b/content/docs/services/imgcompress.mdx new file mode 100644 index 00000000..829e5c66 --- /dev/null +++ b/content/docs/services/imgcompress.mdx @@ -0,0 +1,31 @@ +--- +title: "Imgcompress" +description: "Image tool for compression, format conversion, and AI background removal" +og: + description: "Run Imgcompress on Coolify for self-hosted image compression, format conversion across 70+ formats, and AI-powered background removal without uploading to third-party services." +category: "Media" +icon: "/docs/images/services/imgcompress-logo.webp" +--- + +# Imgcompress + + + + +## What is Imgcompress? + +Imgcompress is a self-hosted image processing toolbox that handles compression, format conversion, and AI background removal in a single web interface. It supports over **70 input formats** (including PSD, HEIC, and RAW) and can output common formats or generate PDFs, all without sending files to external services. + + + +Key capabilities: + +- **Format conversion**: PSD, HEIC, RAW, and 70+ other formats converted in one place +- **Image compression**: Reduce file sizes for photos and screenshots without quality loss +- **PDF export**: Convert images to PDF directly from the browser +- **AI background removal**: Remove backgrounds locally, keeping files private + +## Links + +- [The official website](https://imgcompress.karimzouine.com?utm_source=coolify.io) +- [GitHub](https://github.com/karimz1/imgcompress?utm_source=coolify.io) diff --git a/content/docs/services/immich.mdx b/content/docs/services/immich.mdx new file mode 100644 index 00000000..e50a9726 --- /dev/null +++ b/content/docs/services/immich.mdx @@ -0,0 +1,20 @@ +--- +title: Immich +description: "Self-hosted photo and video backup solution." +og: + description: "Host Immich photo management on Coolify for Google Photos alternative with mobile backup, ML-powered search, face recognition, and sharing." +category: "Media" +icon: "/docs/images/services/immich-logo.svg" +--- + +# Immich + + + +## What is Immich + +Self-hosted photo and video management solution. + +## Links + +- [Official Documentation](https://immich.app/docs/overview/introduction?utm_source=coolify.io) diff --git a/content/docs/services/infisical.mdx b/content/docs/services/infisical.mdx new file mode 100644 index 00000000..ec3ba00c --- /dev/null +++ b/content/docs/services/infisical.mdx @@ -0,0 +1,28 @@ +--- +title: "Infisical" +description: "Open source secret management platform." +og: + description: "Deploy Infisical secrets management on Coolify for environment variables, API keys, secure sharing, and centralized secrets across development teams." +category: "Security" +icon: "/docs/images/services/infisical-logo.svg" +--- + + + +## What is Infisical? + +Infisical is the open source security infrastructure platform that engineers use for secrets management, internal PKI, key management, and SSH workflow orchestration. + +- Secrets Management: Infisical's secrets management module lets developers centralize and securely manage application configuration, API keys, database credentials, and other sensitive data. +- Public Key Infrastructure (PKI): Infisical PKI lets you operate an internal certificate authority and manage the full X.509 certificate lifecycle for services, applications, and devices. +- Key Management System (KMS): Infisical KMS helps you generate and securely manage encryption keys to encrypt/decrypt data. +- SSH Certificate Management: Infisical SSH lets you provision engineers short-lived, secure SSH access to infrastructure by replacing traditional static SSH keys with ephemeral certificate-based authentication. + +## Screenshots + + + +## Links + +- [The official website](https://infisical.com/?utm_source=coolify.io) +- [GitHub](https://github.com/Infisical/infisical?utm_source=coolify.io) diff --git a/content/docs/services/introduction.mdx b/content/docs/services/introduction.mdx new file mode 100644 index 00000000..b3290e32 --- /dev/null +++ b/content/docs/services/introduction.mdx @@ -0,0 +1,69 @@ +--- +title: "Services" +description: Deploy 200+ pre-configured open-source applications instantly with Coolify's one-click services, from development tools to databases. +--- + +# Services + +## What are Services? + +Services in Coolify are deployments based on **Docker Compose files** that are stored directly on your server. Unlike [Applications](/applications), Services are **not connected to a Git source** — they don't pull code from a repository or rebuild on commits. + +There are two types of Services in Coolify: + +### User-Defined Services + +These are Docker Compose files that **you manually provide**. You can paste your own `docker-compose.yml` configuration directly into Coolify, and it will deploy and manage it for you. This gives you complete flexibility to deploy any containerized application or stack that you've configured yourself. + +To do so, you select the `Docker Compose Empty` option when creating a new Resource. + +### One-Click Services + +One-Click Services are a curated collection of 200+ popular open-source applications and tools that you can deploy instantly with just a few clicks. These are **pre-configured Docker Compose templates** provided by Coolify, eliminating the complexity of manual setup and configuration. + +Instead of writing your own compose file from scratch, you can select from ready-to-use templates that are automatically filled in for you, making self-hosting accessible to everyone. + +#### How They Work + +Each template has been: + +- **Pre-tested and optimized** for reliable deployment +- **Configured with sensible defaults** to work out of the box +- **Integrated with Coolify's features** like automatic SSL and backups + +#### What's Included + +Our service library includes a wide variety of applications developed by the open-source community: + +- **Development Tools**: Code editors, Git platforms, CI/CD solutions +- **Productivity Apps**: Project management, note-taking, collaboration tools +- **Media & Entertainment**: Media servers, photo management, streaming platforms +- **Business Applications**: CRM systems, accounting software, e-commerce platforms +- **Databases & Analytics**: Various database engines, monitoring, and analytics tools +- **Communication**: Chat platforms, email servers, forums +- **And many more...** + +#### Key Benefits + +- **Instant Deployment**: No need to write Docker Compose files from scratch +- **Automatic Updates**: Services can be updated with a single click +- **Integrated Features**: Automatic SSL certificates and backups +- **Community Tested**: All services are tested and maintained by the community +- **Full Control**: You maintain complete control over your data and infrastructure + +#### Contributing New Services + +Want to add a service to Coolify's library? We welcome contributions from the community! + +You can help by: + +- **Suggesting new services** that would benefit the community +- **Contributing Docker Compose configurations** for applications you use +- **Improving existing service configurations** with better defaults or features +- **Writing documentation** to help others use the services effectively + +Learn how to contribute new services in our [contribution guide](/get-started/contribute/service). + +--- + +Ready to explore what's available? Check out [all services](/services/overview) in our library. diff --git a/content/docs/services/invoice-ninja.mdx b/content/docs/services/invoice-ninja.mdx new file mode 100644 index 00000000..db249f94 --- /dev/null +++ b/content/docs/services/invoice-ninja.mdx @@ -0,0 +1,20 @@ +--- +title: "Invoice Ninja" +description: "Invoice management system." +og: + description: "Run Invoice Ninja on Coolify for invoicing, expense tracking, time billing, payment processing, and client management for freelancers." +category: "Business" +icon: "/docs/images/services/invoiceninja-logo.png" +--- + +# Invoice Ninja + +A self-hosted invoicing platform for small businesses. + +## Screenshots + + + +## Links + +- [The official website](https://www.invoiceninja.com/) diff --git a/content/docs/services/it-tools.mdx b/content/docs/services/it-tools.mdx new file mode 100644 index 00000000..9cd302cc --- /dev/null +++ b/content/docs/services/it-tools.mdx @@ -0,0 +1,20 @@ +--- +title: It Tools +description: "Collection of handy online tools for developers." +og: + description: "Host IT Tools collection on Coolify with 80+ developer utilities for encoding, hashing, formatting, and text transformation in web interface." +category: "Development" +icon: "/docs/images/services/ittools-logo.svg" +--- + +# It Tools + + + +## What is It Tools + +IT Tools is a self-hosted solution for managing various IT tasks. + +## Links + +- [Official Documentation](https://github.com/corentinth/it-tools?utm_source=coolify.io) diff --git a/content/docs/services/jellyfin.mdx b/content/docs/services/jellyfin.mdx new file mode 100644 index 00000000..3b464b86 --- /dev/null +++ b/content/docs/services/jellyfin.mdx @@ -0,0 +1,21 @@ +--- +title: "Jellyfin" +description: "The Free Software Media System." +og: + description: "Deploy Jellyfin media server on Coolify for streaming movies, TV shows, music with no licensing, transcoding, and mobile app support." +category: "Media" +icon: "/docs/images/services/jellyfin-logo.svg" +--- + + + +## What is Jellyfin? + +Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. + +There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! + +## Links + +- [The official website](https://jellyfin.org/) +- [GitHub](https://github.com/jellyfin/jellyfin) diff --git a/content/docs/services/jenkins.mdx b/content/docs/services/jenkins.mdx new file mode 100644 index 00000000..efe89a6e --- /dev/null +++ b/content/docs/services/jenkins.mdx @@ -0,0 +1,19 @@ +--- +title: "Jenkins" +description: "Open-source automation server." +og: + description: "Run Jenkins CI/CD on Coolify for automated builds, testing, deployment pipelines, and continuous integration workflows with extensive plugins." +category: "Development" +icon: "/docs/images/services/jenkins-logo.svg" +--- + + + +## What is Jenkins? + +Jenkins is a popular open-source automation server used for continuous integration and continuous delivery (CI/CD). It allows developers to build, test, and deploy software projects reliably. + +## Links + +- [The official website](https://www.jenkins.io/) +- [GitHub](https://github.com/jenkinsci/jenkins) diff --git a/content/docs/services/joomla.mdx b/content/docs/services/joomla.mdx new file mode 100644 index 00000000..70057f6e --- /dev/null +++ b/content/docs/services/joomla.mdx @@ -0,0 +1,20 @@ +--- +title: Joomla +description: "Open-source content management system." +og: + description: "Host Joomla CMS on Coolify for flexible content management, extensions, multilingual sites, and powerful website building with PHP framework." +category: "CMS" +icon: "/docs/images/services/joomla-logo.svg" +--- + +# Joomla + + + +## What is Joomla + +Joomla! is the mobile-ready and user-friendly way to build your website. Choose from thousands of features and designs. Joomla! is free and open source. + +## Links + +- [Official Documentation](https://joomla.org?utm_source=coolify.io) diff --git a/content/docs/services/joplin.mdx b/content/docs/services/joplin.mdx new file mode 100644 index 00000000..6d3036e9 --- /dev/null +++ b/content/docs/services/joplin.mdx @@ -0,0 +1,20 @@ +--- +title: Joplin +description: "Open-source note taking and to-do application." +og: + description: "Deploy Joplin notes on Coolify for markdown note-taking, to-do lists, synchronization, end-to-end encryption, and cross-platform organization." +category: "Productivity" +icon: "/docs/images/services/joplin-logo.png" +--- + +# Joplin + + + +## What is Joplin + +Self-hosted sync server for Joplin + +## Links + +- [Official Documentation](https://github.com/laurent22/joplin/blob/dev/packages/server/README.md?utm_source=coolify.io) diff --git a/content/docs/services/jupyter-notebook-python.mdx b/content/docs/services/jupyter-notebook-python.mdx new file mode 100644 index 00000000..76e042da --- /dev/null +++ b/content/docs/services/jupyter-notebook-python.mdx @@ -0,0 +1,20 @@ +--- +title: Jupyter Notebook Python +description: "Interactive computing environment for Python." +og: + description: "Run Jupyter Notebook on Coolify for interactive Python development, data science workflows, visualization, and collaborative computational notebooks." +category: "Development" +icon: "/docs/images/services/jupyternotebook-logo.svg" +--- + +# Jupyter Notebook Python + + + +## What is Jupyter Notebook Python + +Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations, and narrative text. + +## Links + +- [Official Documentation](https://jupyter.org/?utm_source=coolify.io) diff --git a/content/docs/services/karakeep.mdx b/content/docs/services/karakeep.mdx new file mode 100644 index 00000000..472a9668 --- /dev/null +++ b/content/docs/services/karakeep.mdx @@ -0,0 +1,21 @@ +--- +title: "KaraKeep" +description: "Self-hostable bookmark-everything app with AI-based automatic tagging." +og: + description: "Host KaraKeep password manager on Coolify for secure credential storage, team sharing, encrypted vaults, and self-hosted password management." +category: "Productivity" +icon: "/docs/images/services/karakeep-logo.svg" +--- + +# KaraKeep + + + +## What is KaraKeep? + +KaraKeep is a self-hostable bookmark-everything app with AI-based automatic tagging. It serves as a comprehensive read-it-later service and alternative to Pocket or Omnivore. KaraKeep can automatically categorize and tag your saved content using AI, making it easy to organize and rediscover articles, videos, and other web content you want to save for later. + +## Links + +- [The official website](https://docs.karakeep.app?utm_source=coolify.io) +- [GitHub](https://github.com/karakeep-app/karakeep?utm_source=coolify.io) diff --git a/content/docs/services/keycloak.mdx b/content/docs/services/keycloak.mdx new file mode 100644 index 00000000..bc8ec3e1 --- /dev/null +++ b/content/docs/services/keycloak.mdx @@ -0,0 +1,37 @@ +--- +title: Keycloak +description: "Open-source identity and access management solution." +og: + description: "Deploy Keycloak on Coolify for identity and access management with SSO, OAuth2, SAML, user federation, and centralized authentication." +category: "Security" +icon: "/docs/images/services/keycloak-logo.svg" +--- + +# Keycloak + + + +## What is Keycloak + +Keycloak is an open-source Identity and Access Management tool. + +## Deployment Variants + +Keycloak is available in two deployment configurations in Coolify: + +### Keycloak (Default) +- **Database:** Embedded H2 (development) +- **Use case:** Development, testing, or evaluation purposes +- **Components:** Single Keycloak container with built-in H2 database + +### Keycloak with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring reliability, performance, and data persistence +- **Components:** + - Keycloak container + - PostgreSQL container + - Automatic database configuration and health checks + +## Links + +- [Official Documentation](https://www.keycloak.org?utm_source=coolify.io) diff --git a/content/docs/services/kimai.mdx b/content/docs/services/kimai.mdx new file mode 100644 index 00000000..7959f5ee --- /dev/null +++ b/content/docs/services/kimai.mdx @@ -0,0 +1,25 @@ +--- +title: "Kimai" +description: "An open-source time-tracking solution for teams of all sizes." +og: + description: "Track time on Coolify with Kimai for project time tracking, invoicing, reporting, and team productivity management with mobile support." +category: "Business" +icon: "/docs/images/services/kimai-logo.svg" +--- + + + +## What is Kimai? + +Kimai makes time-tracking easy. An open-source solution for teams of all sizes. + +## Screenshots + + + + + +## Links + +- [The official website](https://www.kimai.org/?utm_source=coolify.io) +- [GitHub](https://github.com/kimai/kimai) diff --git a/content/docs/services/kuzzle.mdx b/content/docs/services/kuzzle.mdx new file mode 100644 index 00000000..20a9c5c9 --- /dev/null +++ b/content/docs/services/kuzzle.mdx @@ -0,0 +1,32 @@ +--- +title: "Kuzzle" +description: "A powerful backend that enables you to build modern apps faster." +og: + description: "Run Kuzzle backend on Coolify for real-time APIs, authentication, data storage, geofencing, and IoT platform with pub/sub messaging." +category: "Development" +icon: "/docs/images/services/kuzzle-logo.png" +--- + + + +## What is Kuzzle? + +Kuzzle is a generic backend offering the basic building blocks common to every application. + +Rather than developing the same standard features over and over again each time you create a new application, Kuzzle proposes them off the shelf, allowing you to focus on building high-level, high-value business functionalities. + +## Features + +Kuzzle enables you to build modern web applications and complex IoT networks in no time. + +- API First: use a standardised multi-protocol API. +- Persisted Data: store your data and perform advanced searches on it. +- Realtime Notifications: use the pub/sub system or subscribe to database notifications. +- User Management: login, logout and security rules are no more a burden. +- Extensible: develop advanced business feature directly with the integrated framework. +- Client SDKs: use our SDKs to accelerate the frontend development. + +## Links + +- [The official website](https://kuzzle.io/) +- [GitHub](https://github.com/kuzzleio/kuzzle) diff --git a/content/docs/services/labelstudio.mdx b/content/docs/services/labelstudio.mdx new file mode 100644 index 00000000..ed4caa1b --- /dev/null +++ b/content/docs/services/labelstudio.mdx @@ -0,0 +1,24 @@ +--- +title: "Label Studio" +description: "Open source data labeling platform." +og: + description: "Deploy Label Studio on Coolify for ML data labeling, annotation workflows, image tagging, NLP tasks, and AI training dataset preparation." +category: "AI" +icon: "/docs/images/services/labelstudio-logo.png" +--- + +# What is Label Studio? + + +Label Studio is an open-source data labeling platform that streamlines the process of annotating and labeling data for machine learning and AI applications. + +## Screenshots + +
+ +
+ + +## Links + +- [The official website](https://labelstud.io/) diff --git a/content/docs/services/langflow.mdx b/content/docs/services/langflow.mdx new file mode 100644 index 00000000..cac2b014 --- /dev/null +++ b/content/docs/services/langflow.mdx @@ -0,0 +1,33 @@ +--- +title: "Langflow" +description: "Open source Python-based framework for building AI applications." +og: + description: "Host Langflow on Coolify to build and deploy AI-powered agents and workflows with a visual drag-and-drop interface and Python extensibility." +category: "AI" +icon: "/docs/images/services/langflow.svg" +--- + +# Langflow + + + +## What is Langflow? + +Langflow is an open-source Python-based framework for building AI applications. It combines a visual authoring experience with full programmatic access, enabling teams to prototype, test, and deploy AI-powered agents and workflows. + +It accelerates development by providing a **drag-and-drop interface** while maintaining the flexibility of **custom Python components** for advanced use cases. + +## Credentials + +After deploying Langflow on Coolify you can login to the dashboard with the autogenerated credentials stored in the following environment variables: + +| Variable | Description | +|--------------------------------|----------------------------------| +| `LANGFLOW_SUPERUSER` | Username for the admin account | +| `LANGFLOW_SUPERUSER_PASSWORD` | Password for the admin account | + +## Links + +- [Langflow Website](https://www.langflow.org/?utm_source=coolify.io) +- [Documentation](https://docs.langflow.org/?utm_source=coolify.io) +- [GitHub Repository](https://github.com/langflow-ai/langflow) diff --git a/content/docs/services/langfuse.mdx b/content/docs/services/langfuse.mdx new file mode 100644 index 00000000..01012656 --- /dev/null +++ b/content/docs/services/langfuse.mdx @@ -0,0 +1,39 @@ +--- +title: "Langfuse" +description: "Open source LLM engineering platform." +og: + description: "Host Langfuse LLM observability on Coolify for prompt management, tracing, debugging, and analytics for LangChain and OpenAI applications." +category: "AI" +icon: "/docs/images/services/langfuse-logo.svg" +--- + +# What is Langfuse? + +[Langfuse](https://langfuse.com/) is an **[open-source](https://github.com/langfuse/langfuse) LLM engineering platform** that empowers teams to collaboratively **debug**, **analyze**, and **iterate** on their LLM applications. + +It accelerates the development workflow by providing tools for **observability**, **tracing**, **prompt management**, **evaluation**, and **analytics**. + +## Key Features + +### Observability and Tracing + +- **Insights**: Gain a granular understanding of your LLM's behavior with detailed tracing capabilities. +- **Integrations**: Seamlessly integrate with popular frameworks like [LangChain](https://langfuse.com/docs/integrations/langchain), [Llama Index](https://langfuse.com/docs/integrations/llama-index), and [OpenAI](https://langfuse.com/docs/integrations/openai). + +### Prompt Management + +- **Linked Tracing**: Connect prompt versions with tracing data for a holistic view of interactions. +- **Zero Latency**: Experience prompt management without added latency in your applications. +- **Efficient Management**: Organize and version your prompts to optimize model performance. + +### Evaluation and Analytics + +- **Model-Based Evaluations**: Utilize built-in tools or integrate external pipelines like [UpTrain](https://langfuse.com/guides/cookbook/evaluation_with_uptrain) and [Ragas](https://langfuse.com/guides/cookbook/evaluation_of_rag_with_ragas). +- **Custom Metrics**: Define and track custom scores and annotations to measure performance. +- **Analytics Dashboard**: Access visualizations and reports to monitor usage, costs, and model effectiveness. + +## Get Started + +- Visit the [Langfuse docs](https://langfuse.com/docs) to get started. +- + diff --git a/content/docs/services/leantime.mdx b/content/docs/services/leantime.mdx new file mode 100644 index 00000000..1f233605 --- /dev/null +++ b/content/docs/services/leantime.mdx @@ -0,0 +1,23 @@ +--- +title: "Leantime" +description: "Lean project management system for innovators." +og: + description: "Manage projects on Coolify with Leantime featuring tasks, gantt charts, time tracking, ideas management, and lean project management approach." +category: "Project Management" +icon: "/docs/images/services/leantime-logo.svg" +--- + + + +## What is Leantime? + +Leantime is a goals focused project management system for non-project managers. Building with ADHD, Autism, and dyslexia in mind. + +## Screenshots + + + +## Links + +- [The official website](https://leantime.io?utm_source=coolify.io) +- [GitHub](https://github.com/leantime/leantime?utm_source=coolify.io) diff --git a/content/docs/services/librechat.mdx b/content/docs/services/librechat.mdx new file mode 100644 index 00000000..7fbdc8b4 --- /dev/null +++ b/content/docs/services/librechat.mdx @@ -0,0 +1,21 @@ +--- +title: "LibreChat" +description: "Self-hosted, powerful, and privacy-focused chat UI for multiple AI models." +og: + description: "Deploy LibreChat on Coolify for unified AI chat interface supporting GPT-4, Claude, Gemini, and local models with conversation management." +category: "AI" +icon: "/docs/images/services/librechat-logo.svg" +--- + +# LibreChat + + + +## What is LibreChat? + +LibreChat is a self-hosted, powerful, and privacy-focused chat UI for multiple AI models including OpenAI GPT, Anthropic Claude, Azure OpenAI, and many others. It provides a unified interface to interact with various AI providers while keeping your conversations private and under your control. LibreChat supports conversation threading, message editing, plugin integration, and customizable presets. + +## Links + +- [The official website](https://librechat.ai?utm_source=coolify.io) +- [GitHub](https://github.com/danny-avila/LibreChat?utm_source=coolify.io) diff --git a/content/docs/services/libreoffice.mdx b/content/docs/services/libreoffice.mdx new file mode 100644 index 00000000..787412f8 --- /dev/null +++ b/content/docs/services/libreoffice.mdx @@ -0,0 +1,20 @@ +--- +title: Libreoffice +description: "Free and open-source office suite." +og: + description: "Run LibreOffice Online on Coolify for collaborative document editing, spreadsheets, presentations with web-based office suite interface." +category: "Productivity" +icon: "/docs/images/services/libreoffice-logo.svg" +--- + +# Libreoffice + + + +## What is Libreoffice + +LibreOffice is a free and powerful office suite. + +## Links + +- [Official Documentation](https://docs.linuxserver.io/images/docker-libreoffice/?utm_source=coolify.io) diff --git a/content/docs/services/librespeed.mdx b/content/docs/services/librespeed.mdx new file mode 100644 index 00000000..ff7a1ed3 --- /dev/null +++ b/content/docs/services/librespeed.mdx @@ -0,0 +1,20 @@ +--- +title: Librespeed +description: "Deploy Librespeed on Coolify for self-hosted lightweight speed test." +og: + description: "Deploy Librespeed on Coolify for self-hosted lightweight speed test." +category: "Networking" +icon: "/docs/images/services/librespeed.png" +--- + +# Librespeed + + + +## What is Librespeed + +Self-hosted lightweight speed test implemented in Javascript, using XMLHttpRequest and Web Workers. + +## Links + +- [GitHub](https://github.com/librespeed/speedtest) diff --git a/content/docs/services/libretranslate.mdx b/content/docs/services/libretranslate.mdx new file mode 100644 index 00000000..1cf53b13 --- /dev/null +++ b/content/docs/services/libretranslate.mdx @@ -0,0 +1,20 @@ +--- +title: Libretranslate +description: "Free and open-source machine translation API." +og: + description: "Host LibreTranslate on Coolify for self-hosted translation API supporting 40+ languages with privacy-focused machine translation service." +category: "AI" +icon: "/docs/images/services/libretranslate-logo.svg" +--- + +# Libretranslate + + + +## What is Libretranslate + +Free and open-source machine translation API, entirely self-hosted. + +## Links + +- [Official Documentation](https://libretranslate.com/docs/?utm_source=coolify.io) diff --git a/content/docs/services/limesurvey.mdx b/content/docs/services/limesurvey.mdx new file mode 100644 index 00000000..05bd5959 --- /dev/null +++ b/content/docs/services/limesurvey.mdx @@ -0,0 +1,21 @@ +--- +title: "LimeSurvey" +description: "The most popular FOSS online survey tool on the web." +og: + description: "Create surveys on Coolify with LimeSurvey featuring questionnaire design, data collection, analysis, and professional survey research tools." +category: "Business" +icon: "/docs/images/services/limesurvey-logo.svg" +--- + + + +## What is LimeSurvey? + +A powerful, open-source survey platform. + +A free alternative to SurveyMonkey, Typeform, Qualtrics, and Google Forms, making it simple to create online surveys and forms with unmatched flexibility. + +## Links + +- [The official website](https://www.limesurvey.org/?utm_source=coolify.io) +- [GitHub](https://github.com/LimeSurvey/LimeSurvey?utm_source=coolify.io) diff --git a/content/docs/services/linkding.mdx b/content/docs/services/linkding.mdx new file mode 100644 index 00000000..c7eb186b --- /dev/null +++ b/content/docs/services/linkding.mdx @@ -0,0 +1,31 @@ +--- +title: "Linkding" +description: "A self-hosted bookmark manager designed to be minimal, fast, and easy to set up." +og: + description: "A self-hosted bookmark manager designed to be minimal, fast, and easy to set up." +category: "Bookmarks" +icon: "/docs/images/services/linkding-logo.svg" +--- + +# Linkding + + + +## What is Linkding? + +Linkding is a minimalist, self-hosted bookmark manager that focuses on simplicity and performance. It provides a clean interface for saving, organizing, and searching your bookmarks. + +## Different Versions of Linkding + +Linkding is available in two versions: + +| Version | Description | +|-----------------|-------------| +| `latest` | Provides the basic functionality of linkding | +| `plus` | Includes feature for archiving websites as HTML snapshots. Note: This version has a significantly larger image size as it includes a Chromium installation, requires more runtime memory to run Chromium, and requires more disk space for storing HTML snapshots | + +## Links + +- [Official website](https://linkding.link/?utm_source=coolify.io) +- [Documentation](https://linkding.link/installation/) +- [GitHub](https://github.com/sissbruecker/linkding?utm_source=coolify.io) diff --git a/content/docs/services/listmonk.mdx b/content/docs/services/listmonk.mdx new file mode 100644 index 00000000..d6e7d2bd --- /dev/null +++ b/content/docs/services/listmonk.mdx @@ -0,0 +1,23 @@ +--- +title: "Listmonk" +description: "Self-hosted newsletter and mailing list manager." +og: + description: "Run Listmonk newsletter on Coolify for email campaigns, subscriber management, templates, analytics, and high-performance mailing lists." +category: "Marketing" +icon: "/docs/images/services/listmonk-logo.svg" +--- + + + +## What is Listmonk? + +Self-hosted newsletter and mailing list manager. + +## Screenshots + + + +## Links + +- [The official website](https://listmonk.app/) +- [GitHub](https://github.com/knadh/listmonk) diff --git a/content/docs/services/litellm.mdx b/content/docs/services/litellm.mdx new file mode 100644 index 00000000..c0f2c14f --- /dev/null +++ b/content/docs/services/litellm.mdx @@ -0,0 +1,27 @@ +--- +title: "Litellm" +description: "Open source LLM Gateway to manage authentication, loadbalancing, and spend tracking across 100+ LLMs. All in the OpenAI format." +og: + description: "Deploy LiteLLM proxy on Coolify for unified LLM API with 100+ models, load balancing, fallbacks, and standardized OpenAI-compatible interface." +category: "AI" +icon: "/docs/images/services/litellm-logo.svg" +--- + +# What is Litellm? + + + +LiteLLM is an open-source LLM Gateway to manage authentication, loadbalancing, and spend tracking across 100+ LLMs. All in the OpenAI format. + +## Screenshots + +
+ +
+ +
+ + +## Links + +- [The official website](https://docs.litellm.ai?utm_source=coolify.io) diff --git a/content/docs/services/litequeen.mdx b/content/docs/services/litequeen.mdx new file mode 100644 index 00000000..c1e3cbdb --- /dev/null +++ b/content/docs/services/litequeen.mdx @@ -0,0 +1,20 @@ +--- +title: Litequeen +description: "Lightweight service management platform." +og: + description: "Host LiteQueen lightweight CMS on Coolify for fast content management, blogging, and simple website administration with minimal resource usage." +category: "Administration" +icon: "/docs/images/services/litequeen-logo.svg" +--- + +# Litequeen + + + +## What is Litequeen + +Lite Queen is an open-source SQLite database management software that runs on your server. + +## Links + +- [Official Documentation](https://litequeen.com/?utm_source=coolify.io) diff --git a/content/docs/services/lobe-chat.mdx b/content/docs/services/lobe-chat.mdx new file mode 100644 index 00000000..d87f420b --- /dev/null +++ b/content/docs/services/lobe-chat.mdx @@ -0,0 +1,33 @@ +--- +title: LobeChat +description: "Open-source, modern AI chat framework with multi-provider support and knowledge base management." +og: + description: "Here you can find the documentation for hosting LobeChat with Coolify." +category: "AI" +icon: "/docs/images/services/lobechat-logo.webp" +--- + +# LobeChat + + + + +## What is LobeChat? + +LobeChat is an open-source, modern AI chat framework built for everyone. It supports multi AI providers, knowledge base management, and plugin system to provide a comprehensive AI chat experience. + + +## Features + +- **Multi-Provider Support**: Compatible with OpenAI, Claude, Gemini, and many other AI providers +- **Knowledge Base**: Built-in knowledge base management for enhanced AI responses +- **Plugin System**: Extensible plugin architecture for custom functionality +- **Modern UI**: Beautiful and responsive user interface +- **Self-Hosted**: Full control over your data and privacy +- **Multi-Modal**: Support for text, image, and file inputs + +## Links + +- [Official Website](https://chat.lobehub.com?utm_source=coolify.io) +- [Official Documentation](https://lobehub.com/docs?utm_source=coolify.io) +- [GitHub Repository](https://github.com/lobehub/lobe-chat?utm_source=coolify.io) \ No newline at end of file diff --git a/content/docs/services/logto.mdx b/content/docs/services/logto.mdx new file mode 100644 index 00000000..647f16c7 --- /dev/null +++ b/content/docs/services/logto.mdx @@ -0,0 +1,40 @@ +--- +title: "Logto" +description: "Logto is an Auth0 alternative designed for modern apps and SaaS products." +og: + description: "Deploy Logto Auth0 alternative on Coolify with OIDC authentication, passwordless sign-in, RBAC, multi-tenancy, and customer identity management." +category: "Security" +icon: "/docs/images/services/logto-logo.svg" +--- + + + +## What is Logto? + +Logto is an Auth0 alternative designed for modern apps and SaaS products. It offers a seamless developer experience and is well-suited for individuals and growing companies. + +🧑‍💻 **Comprehensive frontend-to-backend identity solution** + +- Enables OIDC-based authentication with Logto SDKs. +- Supports passwordless sign-in, along with various options like email, phone number, username, Google, Facebook, and other social sign-in methods. +- Offers beautiful UI components with customizable CSS to suit your business needs. + +📦 **Out-of-the-box infrastructure** + +- Includes a ready-to-use Management API, serving as your authentication provider, thus eliminating the need for extra implementation. +- Provides SDKs that seamlessly integrate your apps with Logto across multiple platforms and languages, tailored to your development environment. +- Offers flexible connectors that can be scaled with community contributions and customized with SAML, OAuth, and OIDC protocols. + +💻 **Enterprise-ready solutions** + +- Implements role-based access control (RBAC) for scalable role authorization, catering to a wide range of use cases. +- Facilitates user management and provides audit logs for understanding identity-related user information and maintaining security. +- Enables single sign-on (SSO) and multi-factor authentication (MFA) without extra coding. +- Leverages Logto Organizations to build multi-tenancy apps with ease. + +In a more approachable way, we refer to this solution as "[Customer Identity Access Management (CIAM)](https://en.wikipedia.org/wiki/Customer_identity_access_management)" or simply, the "Customer Identity Solution." + +## Links + +- [The official website](https://logto.io) +- [GitHub](https://github.com/logto-io/logto) diff --git a/content/docs/services/lowcoder.mdx b/content/docs/services/lowcoder.mdx new file mode 100644 index 00000000..c6d606d7 --- /dev/null +++ b/content/docs/services/lowcoder.mdx @@ -0,0 +1,20 @@ +--- +title: Lowcoder +description: "Open-source low-code platform for building internal tools." +og: + description: "Build internal tools on Coolify with Lowcoder low-code platform featuring drag-and-drop UI, database queries, and custom application development." +category: "Development" +icon: "/docs/images/services/lowcoder-logo.svg" +--- + +# Lowcoder + + + +## What is Lowcoder + +Lowcoder (forked from OpenBlocks) is a self-hosted, open-source, low-code platform for building internal tools. + +## Links + +- [Official Documentation](https://docs.lowcoder.cloud/?utm_source=coolify.io) diff --git a/content/docs/services/mage-ai.mdx b/content/docs/services/mage-ai.mdx new file mode 100644 index 00000000..1aebf2e6 --- /dev/null +++ b/content/docs/services/mage-ai.mdx @@ -0,0 +1,45 @@ +--- +title: "Mage AI" +description: "Build, run, and manage data pipelines for integrating and transforming data." +og: + description: "Build, run, and manage data pipelines for integrating and transforming data." +category: "Automation" +icon: "/docs/images/services/mage-ai.svg" +--- + + + +## What is Mage AI? + +Mage AI (Mage OSS) is a self-hosted development environment designed to help +teams create production-grade data pipelines with confidence. + +Ideal for automating ETL tasks, architecting data flow, or orchestrating +transformations — all in a fast, notebook-style interface powered by modular +code. + +## Default Credentials + +On a fresh deployment, you can log in with the following details: + +``` +USERNAME: admin@admin.com +PASSWORD: admin +``` + +## Issue with Older CPUs + +Mage AI requires modern CPU features to be available. On older +devices, you may see the error: + +``` +The following required CPU features were not detected: + sse4.2, popcnt, avx, avx2, fma, bmi1, bmi2, lzcnt, pclmulqdq +``` + +For more details, refer to the [following issue](https://github.com/pola-rs/polars/issues/15404). + +## Links + +- [Official website](https://mage.ai/?utm_source=coolify.io) +- [GitHub](https://github.com/mage-ai/mage-ai?utm_source=coolify.io) diff --git a/content/docs/services/mailpit.mdx b/content/docs/services/mailpit.mdx new file mode 100644 index 00000000..cd41b64d --- /dev/null +++ b/content/docs/services/mailpit.mdx @@ -0,0 +1,21 @@ +--- +title: "Mailpit" +description: "Self-hosted email and SMTP testing tool." +og: + description: "Run Mailpit SMTP testing on Coolify for email testing, preview, debugging with web UI for development environments without sending real emails." +category: "Development" +icon: "/docs/images/services/mailpit-logo.svg" +--- + +# What is Mailpit? + +Mailpit is a self-hosted email and SMTP testing tool with a web interface. + +## Screenshots + + + +## Links + +- [The official website](https://mailpit.axllent.org) +- [GitHub](https://github.com/axllent/mailpit) diff --git a/content/docs/services/marimo.mdx b/content/docs/services/marimo.mdx new file mode 100644 index 00000000..60b9fe77 --- /dev/null +++ b/content/docs/services/marimo.mdx @@ -0,0 +1,19 @@ +--- +title: "Marimo" +description: "Open-source reactive notebook for Python." +og: + description: "Deploy Marimo reactive notebooks on Coolify for Python data science with interactive notebooks, reproducible execution, and git-friendly format." +category: "Development" +icon: "/docs/images/services/marimo.svg" +--- + + + +## What is Marimo? + +Marimo is an open-source reactive notebook for Python — reproducible, git-friendly, SQL built-in, executable as a script, and shareable as an app. + +## Links + +- [The official website](https://marimo.io/?utm_source=coolify.io) +- [GitHub](https://github.com/marimo-team/marimo?utm_source=coolify.io) diff --git a/content/docs/services/martin.mdx b/content/docs/services/martin.mdx new file mode 100644 index 00000000..4b73c6f1 --- /dev/null +++ b/content/docs/services/martin.mdx @@ -0,0 +1,20 @@ +--- +title: Martin +description: "PostGIS vector tile server." +og: + description: "Host Martin tile server on Coolify for serving PostGIS vector tiles, MBTiles, PMTiles with high performance for web mapping applications." +category: "Development" +icon: "/docs/images/services/martin-logo.png" +--- + +# Martin + + + +## What is Martin + +Martin is a tile server able to generate and serve vector tiles on the fly from large PostGIS databases, PMTiles (local or remote), and MBTiles files, allowing multiple tile sources to be dynamically combined into one. + +## Links + +- [Official Documentation](https://maplibre.org/martin/introduction.html?utm_source=coolify.io) diff --git a/content/docs/services/matrix.mdx b/content/docs/services/matrix.mdx new file mode 100644 index 00000000..c5079025 --- /dev/null +++ b/content/docs/services/matrix.mdx @@ -0,0 +1,107 @@ +--- +title: "Matrix" +description: "Chat securely with your family, friends, community." +og: + description: "Run Matrix Synapse server on Coolify for decentralized chat, end-to-end encryption, federation, and secure real-time communication platform." +category: "Communication" +icon: "/docs/images/services/matrix-logo.svg" +--- + +# Matrix (Synapse) + + + +## What is Matrix? + +Matrix is an open-source, decentralized communication protocol that enables secure, real-time communication. It provides end-to-end encrypted messaging, voice and video calls, file sharing, and room-based conversations. Matrix serves as an excellent alternative to proprietary platforms like Slack or Discord, offering federation capabilities that allow different Matrix servers to communicate with each other. + +## What is Synapse? + +Synapse is a [Matrix homeserver](https://matrix.org/ecosystem/servers/) written in Python/Twisted, [developed and maintained](https://github.com/element-hq/synapse) by the team [Element](https://element.io/), creators of Matrix. + +## Deployment Variants + +Synapse Matrix server is available in two deployment configurations in Coolify: + +### Synapse with SQlite + +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal Matrix hosting +- **Components:** Single Synapse container with built-in SQLite database + +### Synapse with PostgreSQL (recommended) + +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and scalability +- **Components:** + - Synapse container + - PostgreSQL container + - Automatic database configuration and health checks + +## Installation Steps + +For all deployment variants the installation steps are the same. + +### Matrix domain setup (important) + +Matrix uses a value called the **server name** to generate user IDs and room +aliases. + +- Server name `example.org` results in: + - `@user:example.org` + - `#room:example.org` + +The Matrix server itself can run on a different domain, for example +`matrix.example.org`. + +### Recommended setup + +- Matrix server name: `example.org` +- Matrix Synapse server service domain: `matrix.example.org` + +This allows users and rooms to use `:example.org` while hosting Synapse on a +subdomain. + +### Coolify configuration + +#### Domains + +In the service configuration, set the domain to `matrix.example.org:8008` + +#### Environment variables + +Set the following environment variable: + +- `SYNAPSE_SERVER_NAME=example.org` + +### Delegation (required) + +Because Synapse runs on `matrix.example.org` but identifies as `example.org`, +[delegation](https://element-hq.github.io/synapse/latest/delegate.html) is required. + +On `https://example.org`, serve the following files: + +- `/.well-known/matrix/client` for server delegation + +```json +{ + "m.homeserver": { + "base_url": "https://matrix.example.org" + } +} +``` + +- `/.well-known/matrix/server` for Federation discovery + +```json +{ + "m.server": "matrix.example.org:443" +} +``` + +## Links + +- [The official website](https://matrix.org?utm_source=coolify.io) +- [GitHub](https://github.com/matrix-org/synapse?utm_source=coolify.io) +- [Docker image](https://hub.docker.com/r/matrixdotorg/synapse?utm_source=coolify.io) +- [Matrix Federation Tester](https://federationtester.matrix.org?utm_source=coolify.io) diff --git a/content/docs/services/mattermost.mdx b/content/docs/services/mattermost.mdx new file mode 100644 index 00000000..bae02a32 --- /dev/null +++ b/content/docs/services/mattermost.mdx @@ -0,0 +1,20 @@ +--- +title: Mattermost +description: "Open-source messaging platform for teams." +og: + description: "Deploy Mattermost team chat on Coolify for secure messaging, file sharing, integrations, and Slack alternative with on-premises control." +category: "Communication" +icon: "/docs/images/services/mattermost-logo.svg" +--- + +# Mattermost + + + +## What is Mattermost + +Mattermost is an open source, self-hosted Slack-alternative. + +## Links + +- [Official Documentation](https://docs.mattermost.com?utm_source=coolify.io) diff --git a/content/docs/services/mautic.mdx b/content/docs/services/mautic.mdx new file mode 100644 index 00000000..ab08fd7a --- /dev/null +++ b/content/docs/services/mautic.mdx @@ -0,0 +1,40 @@ +--- +title: Mautic +description: "Open-source marketing automation platform." +og: + description: "Deploy Mautic open-source marketing automation platform on Coolify for email campaigns, lead nurturing, contact management, and privacy-focused marketing workflows." +category: "Marketing" +icon: "/docs/images/services/mautic-logo.svg" +--- + +# Mautic + + + + + + +This service has been removed from Coolify’s one-click service catalog because the official Docker images no longer include AMQP transport, so RabbitMQ integration does not work with our template. More info on https://github.com/coollabsio/coolify/pull/8088 + + + + +## What is Mautic + +Mautic is the world's largest open-source marketing automation project, trusted by over 200,000 organizations worldwide. It provides a privacy-focused, fully customizable marketing automation platform that gives you complete control over your data and marketing infrastructure. + +Key features include: + +- **Multi-channel Marketing**: Manage email campaigns, SMS, web notifications, and social media from one platform +- **Campaign Builder**: Create complex automation workflows with an intuitive drag-and-drop interface +- **Lead Management**: Track contacts, score leads, and segment audiences based on behavior and attributes +- **Self-hosted & Privacy-focused**: Full data sovereignty with compliance-ready features for GDPR and other regulations +- **Unlimited & Customizable**: No restrictions on users, contacts, or campaigns - extend functionality through plugins +- **CRM Integration**: Native integrations with HubSpot, Salesforce, Zoho CRM, Microsoft Dynamics, and more +- **API-driven**: Comprehensive REST API for automation and custom integrations + +## Links + +- [Official Website](https://www.mautic.org/?utm_source=coolify.io) +- [Official Documentation](https://docs.mautic.org/?utm_source=coolify.io) +- [GitHub Repository](https://github.com/mautic/mautic?utm_source=coolify.io) diff --git a/content/docs/services/maybe.mdx b/content/docs/services/maybe.mdx new file mode 100644 index 00000000..0542b881 --- /dev/null +++ b/content/docs/services/maybe.mdx @@ -0,0 +1,27 @@ +--- +title: Maybe +description: "Personal finance and wealth management application." +og: + description: "Manage finances with Maybe on Coolify for net worth tracking, investment portfolio, financial planning, and personal wealth management insights." +category: "Finance" +icon: "/docs/images/services/maybe-logo.svg" +--- + +# Maybe + + + +This service has been removed from Coolify’s one-click service catalog because the service is no longer maintained by the original authors. More info on https://github.com/coollabsio/coolify/pull/8167#issuecomment-3858014514 + + + + + + +## What is Maybe + +Maybe: The OS for your personal finances. + +## Links + +- [Official Documentation](https://github.com/maybe-finance/maybe?utm_source=coolify.io) diff --git a/content/docs/services/mealie.mdx b/content/docs/services/mealie.mdx new file mode 100644 index 00000000..8bb8154d --- /dev/null +++ b/content/docs/services/mealie.mdx @@ -0,0 +1,20 @@ +--- +title: Mealie +description: "Self-hosted recipe manager and meal planner." +og: + description: "Deploy Mealie recipe manager on Coolify for meal planning, grocery lists, recipe organization, and household cooking management with nutrition." +category: "Home" +icon: "/docs/images/services/mealie-logo.png" +--- + +# Mealie + + + +## What is Mealie + +A recipe manager and meal planner. + +## Links + +- [Official Documentation](https://docs.mealie.io/?utm_source=coolify.io) diff --git a/content/docs/services/mediawiki.mdx b/content/docs/services/mediawiki.mdx new file mode 100644 index 00000000..8f56c282 --- /dev/null +++ b/content/docs/services/mediawiki.mdx @@ -0,0 +1,31 @@ +--- +title: "Mediawiki" +description: "A free and open-source wiki software package." +og: + description: "Run MediaWiki on Coolify for Wikipedia-style documentation, knowledge bases, collaborative editing, and structured wiki content management." +category: "Documentation" +icon: "/docs/images/services/mediawiki-logo.svg" +--- + + + +## What is Mediawiki? + +Free and open source collaborative space for managing and sharing knowledge. + +## Installation Steps + +1. Comment out the shared volume for LocalSettings in your configuration. +2. Start the container. +3. Go to `http(s)://your-domain` to access the MediaWiki installation wizard. +4. Configure MediaWiki according to your needs through the wizard. +5. Download the generated `LocalSettings.php` file. +6. Stop the container. +7. Move the downloaded `LocalSettings.php` file to the specified file mount path on your server. +8. Uncomment the shared volume configuration to mount the `LocalSettings.php` file to the specified file mount path on your server. +9. Restart the container. + +## Links + +- [The official website](https://www.mediawiki.org/wiki/MediaWiki) +- [GitHub](https://github.com/wikimedia/mediawiki) diff --git a/content/docs/services/meilisearch.mdx b/content/docs/services/meilisearch.mdx new file mode 100644 index 00000000..e02d39de --- /dev/null +++ b/content/docs/services/meilisearch.mdx @@ -0,0 +1,40 @@ +--- +title: "Meilisearch" +description: "A powerful, fast, open-source, easy to use, and deploy search engine." +og: + description: "Deploy Meilisearch on Coolify for lightning-fast typo-tolerant search engine with instant results, filters, and developer-friendly REST API." +category: "Search" +icon: "/docs/images/services/meilisearch-logo.svg" +--- + + + +## What is Meilisearch? + +A lightning-fast search engine that fits effortlessly into your apps, websites, and workflow + +Meilisearch helps you shape a delightful search experience in a snap, offering features that work out-of-the-box to speed up your workflow. + +## Screenshot + + + +## ✨ Features + +- **Search-as-you-type:** find search results in less than 50 milliseconds +- **[Typo tolerance](https://www.meilisearch.com/docs/learn/configuration/typo_tolerance?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** get relevant matches even when queries contain typos and misspellings +- **[Filtering](https://www.meilisearch.com/docs/learn/fine_tuning_results/filtering?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features) and [faceted search](https://www.meilisearch.com/docs/learn/fine_tuning_results/faceted_search?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** enhance your users' search experience with custom filters and build a faceted search interface in a few lines of code +- **[Sorting](https://www.meilisearch.com/docs/learn/fine_tuning_results/sorting?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** sort results based on price, date, or pretty much anything else your users need +- **[Synonym support](https://www.meilisearch.com/docs/learn/configuration/synonyms?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** configure synonyms to include more relevant content in your search results +- **[Geosearch](https://www.meilisearch.com/docs/learn/fine_tuning_results/geosearch?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** filter and sort documents based on geographic data +- **[Extensive language support](https://www.meilisearch.com/docs/learn/what_is_meilisearch/language?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** search datasets in any language, with optimized support for Chinese, Japanese, Hebrew, and languages using the Latin alphabet +- **[Security management](https://www.meilisearch.com/docs/learn/security/master_api_keys?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** control which users can access what data with API keys that allow fine-grained permissions handling +- **[Multi-Tenancy](https://www.meilisearch.com/docs/learn/security/tenant_tokens?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** personalize search results for any number of application tenants +- **Highly Customizable:** customize Meilisearch to your specific needs or use our out-of-the-box and hassle-free presets +- **[RESTful API](https://www.meilisearch.com/docs/reference/api/overview?utm_campaign=oss&utm_source=github&utm_medium=meilisearch&utm_content=features):** integrate Meilisearch in your technical stack with our plugins and SDKs +- **Easy to install, deploy, and maintain** + +## Links + +- [The official website](https://www.meilisearch.com) +- [GitHub](https://github.com/meilisearch/meilisearch) diff --git a/content/docs/services/memos.mdx b/content/docs/services/memos.mdx new file mode 100644 index 00000000..c7b956b9 --- /dev/null +++ b/content/docs/services/memos.mdx @@ -0,0 +1,23 @@ +--- +title: "Memos" +description: "Open-source, self-hosted memo hub with knowledge management." +og: + description: "Host Memos note-taking on Coolify for quick thoughts, lightweight journaling, tagging, and privacy-focused personal knowledge management." +category: "Productivity" +icon: "/docs/images/services/memos-logo.png" +--- + + + +## What is Memos? + +An open-source, lightweight note-taking solution. The pain-less way to create your meaningful notes. Your Notes, Your Way. + +## Screenshots + + + +## Links + +- [The official website](https://usememos.com/?utm_source=coolify.io) +- [GitHub](https://github.com/usememos/memos?utm_source=coolify.io) diff --git a/content/docs/services/meta.json b/content/docs/services/meta.json new file mode 100644 index 00000000..233be536 --- /dev/null +++ b/content/docs/services/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Services", + "pages": [ + "overview", + "all" + ] +} \ No newline at end of file diff --git a/content/docs/services/metabase.mdx b/content/docs/services/metabase.mdx new file mode 100644 index 00000000..b1512408 --- /dev/null +++ b/content/docs/services/metabase.mdx @@ -0,0 +1,31 @@ +--- +title: "Metabase" +description: "The simplest, fastest way to share data and analytics inside your company." +og: + description: "Run Metabase analytics on Coolify for business intelligence, SQL querying, dashboards, and self-service data visualization without coding." +category: "Analytics" +icon: "/docs/images/services/metabase-logo.svg" +--- + + + +## What is Metabase? + +Metabase is the easy, open-source way for everyone in your company to ask questions and learn from data. + +## Features + +- [Set up in five minutes](https://www.metabase.com/docs/latest/setting-up-metabase.html) (we're not kidding). +- Let anyone on your team [ask questions](https://www.metabase.com/docs/latest/users-guide/04-asking-questions.html) without knowing SQL. +- Use the [SQL editor](https://www.metabase.com/docs/latest/questions/native-editor/writing-sql) for more complex queries. +- Build handsome, interactive [dashboards](https://www.metabase.com/docs/latest/users-guide/07-dashboards.html) with filters, auto-refresh, fullscreen, and custom click behavior. +- Create [models](https://www.metabase.com/learn/getting-started/models) that clean up, annotate, and/or combine raw tables. +- Define canonical [segments and metrics](https://www.metabase.com/docs/latest/administration-guide/07-segments-and-metrics.html) for your team to use. +- Send data to Slack or email on a schedule with [dashboard subscriptions](https://www.metabase.com/docs/latest/users-guide/dashboard-subscriptions). +- Set up [alerts](https://www.metabase.com/docs/latest/users-guide/15-alerts.html) to have Metabase notify you when your data changes. +- [Embed charts and dashboards](https://www.metabase.com/docs/latest/administration-guide/13-embedding.html) in your app, or even [your entire Metabase](https://www.metabase.com/docs/latest/enterprise-guide/full-app-embedding.html). + +## Links + +- [The official website](https://www.metabase.com/) +- [Github](https://github.com/metabase/metabase) diff --git a/content/docs/services/metamcp.mdx b/content/docs/services/metamcp.mdx new file mode 100644 index 00000000..b85def74 --- /dev/null +++ b/content/docs/services/metamcp.mdx @@ -0,0 +1,22 @@ +--- +title: "MetaMCP" +description: "MCP Aggregator, Orchestrator, Middleware, Gateway in one application." +og: + description: "Here you can find the documentation for hosting MetaMCP with Coolify." +category: "AI" +icon: "/docs/images/services/metamcp.png" +--- + + + +## What is MetaMCP? + +MetaMCP is an MCP aggregator/orchestrator that lets you group multiple MCP servers into namespaces, apply middleware, and expose a single unified endpoint. It supports SSE and Streamable HTTP transports (plus OpenAPI), works with popular MCP clients, and is built to simplify composing tools and hosting them behind API key or OAuth-based access. + + + +## Links + +- Official documentation › [https://docs.metamcp.com](https://docs.metamcp.com?utm_source=coolify.io) +- GitHub › [https://github.com/metatool-ai/metamcp](https://github.com/metatool-ai/metamcp?utm_source=coolify.io) + diff --git a/content/docs/services/metube.mdx b/content/docs/services/metube.mdx new file mode 100644 index 00000000..5f96b639 --- /dev/null +++ b/content/docs/services/metube.mdx @@ -0,0 +1,18 @@ +--- +title: "Metube" +description: "A self-hosted video sharing platform." +og: + description: "Deploy MeTube on Coolify for YouTube video downloading with web interface supporting playlists, quality selection, and multiple video platforms." +category: "Media" +icon: "/docs/images/services/metube-logo.svg" +--- + + + +## What is Metube? + +Web GUI for youtube-dl (using the yt-dlp fork) with playlist support. Allows you to download videos from YouTube and dozens of other sites. + +## Links + +- [GitHub](https://github.com/alexta69/metube) diff --git a/content/docs/services/mindsdb.mdx b/content/docs/services/mindsdb.mdx new file mode 100644 index 00000000..44946b9c --- /dev/null +++ b/content/docs/services/mindsdb.mdx @@ -0,0 +1,20 @@ +--- +title: Mindsdb +description: "Machine learning platform that brings AI to databases." +og: + description: "Host MindsDB on Coolify for AI-powered database with ML predictions, AutoML, model deployment, and SQL-based machine learning integration." +category: "AI" +icon: "/docs/images/services/mindsdb-logo.svg" +--- + +# Mindsdb + + + +## What is Mindsdb + +MindsDB is the platform for building AI from enterprise data, enabling smarter organizations. + +## Links + +- [Official Documentation](https://docs.mindsdb.com/what-is-mindsdb?utm_source=coolify.io) diff --git a/content/docs/services/minecraft.mdx b/content/docs/services/minecraft.mdx new file mode 100644 index 00000000..ca251b5c --- /dev/null +++ b/content/docs/services/minecraft.mdx @@ -0,0 +1,18 @@ +--- +title: "Minecraft" +description: "Minecraft game server." +og: + description: "Run Minecraft server on Coolify for multiplayer gaming, custom worlds, mods support, and community gameplay with dedicated server hosting." +category: "Gaming" +icon: "/docs/images/services/minecraft-logo.svg" +--- + +# What is Minecraft? + +Minecraft is a sandbox video game developed by Mojang Studios. The game was created by Markus "Notch" Persson in the Java programming language. + +It is a single-player and multiplayer game that allows players to explore, build, and mine in a procedurally generated world. + +## Links + +- [GitHub](https://github.com/itzg/docker-minecraft-server) diff --git a/content/docs/services/miniflux.mdx b/content/docs/services/miniflux.mdx new file mode 100644 index 00000000..79b18dcf --- /dev/null +++ b/content/docs/services/miniflux.mdx @@ -0,0 +1,21 @@ +--- +title: "Miniflux" +description: "Minimalist and opinionated feed reader." +og: + description: "Deploy Miniflux RSS reader on Coolify for minimalist feed aggregation, reading, filtering, and distraction-free news consumption with speed." +category: "RSS" +icon: "/docs/images/services/miniflux-logo.svg" +--- + +# Miniflux + + + +## What is Miniflux? + +Miniflux is a minimalist and opinionated feed reader that focuses on simplicity and performance. It supports RSS, Atom, and JSON feeds with features like full-text search, keyboard shortcuts, mobile-responsive design, and integration with read-it-later services. Miniflux is designed to be fast, lightweight, and distraction-free, making it perfect for users who want a clean RSS reading experience. + +## Links + +- [The official website](https://miniflux.app?utm_source=coolify.io) +- [GitHub](https://github.com/miniflux/v2?utm_source=coolify.io) diff --git a/content/docs/services/minio-community-edition.mdx b/content/docs/services/minio-community-edition.mdx new file mode 100644 index 00000000..25d6b727 --- /dev/null +++ b/content/docs/services/minio-community-edition.mdx @@ -0,0 +1,38 @@ +--- +title: "MinIO" +description: "A high-performance, distributed object storage system." +og: + description: "Host MinIO object storage on Coolify as S3-compatible high-performance storage for backups, data lakes, and cloud-native application storage." +category: "Storage" +icon: "/docs/images/services/minio-logo.svg" +--- + +# MinIO Community Edition + + + + + +This service has been removed from Coolify’s one-click service catalog because it is no longer maintained by its original author. + +The community-maintained MinIO service on Coolify was an effort by the Coolify team to automatically build Docker images and publish them to both GitHub Container Registry and Docker Hub, using the official MinIO codebase on GitHub as the source. + +However, since the original upstream repository is no longer actively maintained, this community service will not receive any further updates. + + + + +## What is MinIO? +MinIO is a high-performance, distributed object storage system compatible with Amazon S3 APIs. It is software-defined, runs on industry-standard hardware, and is 100% open source under the AGPL v3.0 license. MinIO delivers high-performance, Kubernetes-native object storage that is designed for large scale AI/ML, data lake and database workloads. + +## Links + +- [The official website](https://min.io?utm_source=coolify.io) +- [MinIO GitHub](https://github.com/minio/minio?utm_source=coolify.io) +- [Community Edition Github](https://github.com/coollabsio/minio?utm_source=coolify.io) + +## FAQ + +### Invalid login credentials + +You need to run MinIO on `https` (not self-signed) to avoid this issue. MinIO doesn't support http based authentication. diff --git a/content/docs/services/minio.mdx b/content/docs/services/minio.mdx new file mode 100644 index 00000000..ab16f041 --- /dev/null +++ b/content/docs/services/minio.mdx @@ -0,0 +1,37 @@ +--- +title: "MinIO" +description: "A high-performance, distributed object storage system." +og: + description: "Host MinIO object storage on Coolify as S3-compatible high-performance storage for backups, data lakes, and cloud-native application storage." +category: "Storage" +icon: "/docs/images/services/minio-logo.svg" +--- + +# MinIO Community Edition + + + + + + +This service has been removed from Coolify’s one-click service catalog because it is no longer maintained by its original author. More info on https://github.com/minio/minio/blob/master/README.md + + + + +## What is MinIO? + +MinIO is a high-performance, distributed object storage system compatible with Amazon S3 APIs. It is software-defined, runs on industry-standard hardware, and is 100% open source under the AGPL v3.0 license. MinIO delivers high-performance, Kubernetes-native object storage that is designed for large scale AI/ML, data lake and database workloads. + +## Links + +- [The official website](https://min.io?utm_source=coolify.io) +- [Documentation](https://min.io/docs/minio/linux/index.html?utm_source=coolify.io) +- [GitHub](https://github.com/minio/minio?utm_source=coolify.io) +- [Community Edition Info](https://github.com/coollabsio/minio?utm_source=coolify.io) + +## FAQ + +### Invalid login credentials + +You need to run MinIO on `https` (not self-signed) to avoid this issue. MinIO doesn't support http based authentication. diff --git a/content/docs/services/mixpost.mdx b/content/docs/services/mixpost.mdx new file mode 100644 index 00000000..11af2552 --- /dev/null +++ b/content/docs/services/mixpost.mdx @@ -0,0 +1,19 @@ +--- +title: "Mixpost" +description: "Self-hosted social media management software (Buffer alternative)." +og: + description: "Run Mixpost social media on Coolify for scheduling, analytics, content calendar, and multi-platform social media management self-hosted solution." +category: "Social Media" +icon: "/docs/images/services/mixpost-logo.svg" +--- + + + +## What is Mixpost? + +Self-hosted social media management software (Buffer alternative). + +## Links + +- [The official Mixpost website](https://mixpost.app/) +- [GitHub](https://github.com/inovector/mixpost) diff --git a/content/docs/services/moodle.mdx b/content/docs/services/moodle.mdx new file mode 100644 index 00000000..3780bbf9 --- /dev/null +++ b/content/docs/services/moodle.mdx @@ -0,0 +1,19 @@ +--- +title: "Moodle" +description: "Open-source learning platform." +og: + description: "Deploy Moodle LMS on Coolify for online learning, course management, assignments, quizzes, and educational platform with extensive plugins." +category: "Education" +icon: "/docs/images/services/moodle-logo.png" +--- + + + +## What is Moodle? + +Moodle is an open-source learning platform that provides a secure and private alternative to popular cloud storage services like Google Drive and Dropbox. It allows you to store, sync, and share files, photos, and videos across multiple devices, and offers features like file versioning, password-protected sharing, and collaboration tools. + +## Links + +- [The official website](https://moodle.com/) +- [GitHub](https://github.com/moodle/moodle) diff --git a/content/docs/services/mosquitto.mdx b/content/docs/services/mosquitto.mdx new file mode 100644 index 00000000..668a4b10 --- /dev/null +++ b/content/docs/services/mosquitto.mdx @@ -0,0 +1,19 @@ +--- +title: "Mosquitto" +description: "Open-source MQTT broker." +og: + description: "Host Eclipse Mosquitto on Coolify for MQTT message broker supporting IoT device communication, pub/sub messaging, and lightweight protocols." +category: "IoT" +icon: "/docs/images/services/mosquitto-logo.svg" +--- + + + +## What is Mosquitto? + +Mosquitto is an open-source MQTT (Message Queuing Telemetry Transport) broker that facilitates communication between IoT devices by implementing the lightweight MQTT protocol. It's designed to provide reliable message delivery in scenarios with limited bandwidth or unstable networks, making it a key component for IoT and home automation systems. + +## Links + +- [The official website](https://mosquitto.org/) +- [GitHub](https://github.com/eclipse/mosquitto) diff --git a/content/docs/services/n8n.mdx b/content/docs/services/n8n.mdx new file mode 100644 index 00000000..9796a87a --- /dev/null +++ b/content/docs/services/n8n.mdx @@ -0,0 +1,87 @@ +--- +title: "N8N" +description: "Workflow automation tool." +og: + description: "Build workflows on Coolify with n8n automation platform connecting 400+ apps, APIs, databases for no-code/low-code task automation and integration." +category: "Automation" +icon: "/docs/images/services/n8n-logo.png" +--- + + + +## What is N8N? + +N8N is an open-source workflow automation tool that allows you to connect different applications and services together. It is an open-source alternative to tools like Zapier or Make. + +## Deployment Variants + +N8N is available in three deployment configurations in Coolify: + +### n8n (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or low-volume workflows +- **Components:** Single n8n container with built-in SQLite database + +### n8n with PostgreSQL +- **Database:** PostgreSQL (external) +- **Use case:** Production deployments requiring better performance, scalability, and data persistence +- **Components:** + - n8n container + - PostgreSQL 16 container + - Automatic database configuration and health checks + +### n8n with PostgreSQL and Worker +- **Database:** PostgreSQL + Redis +- **Use case:** High-volume production deployments with queue-based execution and parallel workflow processing +- **Components:** + - n8n main container + - n8n-worker container for distributed execution + - PostgreSQL 16 container + - Redis container for queue management + - Automatic database configuration and health checks + +## Screenshots + + + +### Extending n8n with custom dependencies + +To extend n8n with custom dependencies, you can add them following the example below to your Dockerfile: + +```dockerfile +... +RUN apk add --no-cache ffmpeg +... +``` + +### Example Dockerfile + +```dockerfile +FROM n8nio/n8n:latest + +# Switch to root user to install packages and modify system directories +USER root + +# Install necessary system packages using apk +# build-base, python3-dev, geoip-dev are needed for potential native dependencies +# wget for downloading, git for source control (might be needed by Go), bash (useful shell) +RUN apk update && \ + apk add --no-cache \ + wget \ + ffmpeg + + +ENV N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME} +ENV N8N_PORT=5678 +ENV N8N_PROTOCOL=https +ENV NODE_ENV=production +ENV WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/ + +# Switch back to the non-root user that n8n runs as (typically 'node') +USER node +``` + +## Links + +- [The official website](https://n8n.io/) +- [GitHub](https://github.com/n8n-io/n8n) diff --git a/content/docs/services/navidrome.mdx b/content/docs/services/navidrome.mdx new file mode 100644 index 00000000..e3053a29 --- /dev/null +++ b/content/docs/services/navidrome.mdx @@ -0,0 +1,23 @@ +--- +title: "Navidrome" +description: "Modern music server and streamer compatible with Subsonic/Airsonic." +og: + description: "Stream music on Coolify with Navidrome personal server supporting Subsonic API, web player, mobile apps, and self-hosted music library." +category: "Media" +icon: "/docs/images/services/navidrome-logo.svg" +--- + + + +## What is Navidrome? + +Navidrome is an open source web-based music collection server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device. + +## Screenshots + + + +## Links + +- [The official website](https://www.navidrome.org/?utm_source=coolify.io) +- [GitHub](https://github.com/navidrome/navidrome/?utm_source=coolify.io) diff --git a/content/docs/services/neon-ws-proxy.mdx b/content/docs/services/neon-ws-proxy.mdx new file mode 100644 index 00000000..492c318e --- /dev/null +++ b/content/docs/services/neon-ws-proxy.mdx @@ -0,0 +1,20 @@ +--- +title: Neon Ws Proxy +description: "WebSocket proxy for Neon database." +og: + description: "Deploy Neon WebSocket proxy on Coolify for serverless Postgres connections, connection pooling, and edge database access optimization." +category: "Development" +icon: "/docs/images/services/neon-logo.svg" +--- + +# Neon Ws Proxy + + + +## What is Neon Ws Proxy + +The database you love, on a serverless platform designed to help you build reliable and scalable applications faster. + +## Links + +- [Official Documentation](https://neon.tech?utm_source=coolify.io) diff --git a/content/docs/services/netbird-client.mdx b/content/docs/services/netbird-client.mdx new file mode 100644 index 00000000..98879684 --- /dev/null +++ b/content/docs/services/netbird-client.mdx @@ -0,0 +1,19 @@ +--- +title: "Netbird-Client" +description: "Connect your devices into a secure WireGuard-based mesh network." +og: + description: "Run NetBird client on Coolify for WireGuard-based mesh VPN, zero-trust network access, and secure peer-to-peer connectivity." +category: "Networking" +icon: "/docs/images/services/netbird-logo.png" +--- + + + +## What is Netbird-Client? + +Connect your devices into a secure WireGuard®-based overlay network with SSO, MFA and granular access controls. + +## Links + +- [The official website](https://netbird.io/?utm_source=coolify.io) +- [GitHub](https://github.com/netbirdio/netbird?utm_source=coolify.io) diff --git a/content/docs/services/newapi.mdx b/content/docs/services/newapi.mdx new file mode 100644 index 00000000..3f174f10 --- /dev/null +++ b/content/docs/services/newapi.mdx @@ -0,0 +1,21 @@ +--- +title: "NewAPI" +description: "The next-generation LLM gateway and AI asset management system supports multiple languages." +og: + description: "The next-generation LLM gateway and AI asset management system supports multiple languages." +category: "AI" +icon: "/docs/images/services/newapi-logo.png" +--- + +# NewAPI + + + +## What is NewAPI? + +The next-generation LLM gateway and AI asset management system supports multiple languages. + +## Links + +- [Official website](https://docs.newapi.pro/en/getting-started?utm_source=coolify.io) +- [GitHub](https://github.com/QuantumNous/new-api?utm_source=coolify.io) diff --git a/content/docs/services/newt-pangolin.mdx b/content/docs/services/newt-pangolin.mdx new file mode 100644 index 00000000..86a2d8b0 --- /dev/null +++ b/content/docs/services/newt-pangolin.mdx @@ -0,0 +1,27 @@ +--- +title: "Newt-Pangolin" +description: "User space WireGuard tunnel client and TCP/UDP proxy for securely exposing private resources." +og: + description: "Here you can find the documentation for hosting Newt with Coolify." +category: "Networking" +icon: "/docs/images/services/pangolin_newt.svg" +--- + +Newt Pangolin + +## What is Newt? + +Newt is a fully user space WireGuard tunnel client and TCP/UDP proxy, designed to securely expose private resources controlled by Pangolin. By using Newt, you don't need to manage complex WireGuard tunnels and NATing. + +## Env Variables + +| Name | Description | Required | Default Value | +| ----------------- | ----------- | -------- | ------------- | +| NEWT ID | - | yes | +| NEWT SECRET | - | yes | +| PANGOLIN ENDPOINT | - | yes | domain.tld | + +## Links + +- [The official website](https://docs.fossorial.io/Newt/overview?utm_source=coolify.io) +- [GitHub](https://github.com/fosrl/newt?utm_source=coolify.io) diff --git a/content/docs/services/next-image-transformation.mdx b/content/docs/services/next-image-transformation.mdx new file mode 100644 index 00000000..29cf0994 --- /dev/null +++ b/content/docs/services/next-image-transformation.mdx @@ -0,0 +1,18 @@ +--- +title: Next Image Transformation +description: "Image transformation service for Next.js." +og: + description: "Host Next.js image optimizer on Coolify for dynamic image resizing, format conversion, CDN caching, and web performance optimization." +category: "Development" +icon: "/docs/images/services/nextimage-logo.svg" +--- + +# Next Image Transformation + +## What is Next Image Transformation + +Drop-in replacement for Vercel's Nextjs image optimization service. + +## Links + +- [Official Documentation](https://github.com/coollabsio/next-image-transformation?utm_source=coolify.io) diff --git a/content/docs/services/nextcloud.mdx b/content/docs/services/nextcloud.mdx new file mode 100644 index 00000000..5485c8ae --- /dev/null +++ b/content/docs/services/nextcloud.mdx @@ -0,0 +1,56 @@ +--- +title: "NextCloud" +description: "A safe home for all your data." +og: + description: "Deploy Nextcloud on Coolify for self-hosted cloud storage, file sync, calendar, contacts, office collaboration, and Google Drive alternative." +category: "Storage" +icon: "/docs/images/services/nextcloud-logo.svg" +--- + + + +## What is NextCloud? + +NextCloud is an open-source productivity platform that provides a secure and private alternative to popular cloud storage services like Google Drive and Dropbox. It allows you to store, sync, and share files, photos, and videos across multiple devices, and offers features like file versioning, password-protected sharing, and collaboration tools. + +## Deployment Variants + +Nextcloud is available in four deployment configurations in Coolify: + +### Nextcloud (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal file storage +- **Components:** Single Nextcloud container with built-in SQLite database + +### Nextcloud with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and scalability +- **Components:** + - Nextcloud container + - PostgreSQL container + - Automatic database configuration and health checks + +### Nextcloud with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - Nextcloud container + - MySQL container + - Automatic database configuration and health checks + +### Nextcloud with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference (recommended for most users) +- **Components:** + - Nextcloud container + - MariaDB container + - Automatic database configuration and health checks + +## Screenshots + + + +## Links + +- [The official website](https://nextcloud.com/) +- [GitHub](https://github.com/nextcloud/server) diff --git a/content/docs/services/nexus.mdx b/content/docs/services/nexus.mdx new file mode 100644 index 00000000..544dfb3c --- /dev/null +++ b/content/docs/services/nexus.mdx @@ -0,0 +1,42 @@ +--- +title: "Sonatype Nexus" +description: "A repository manager that allows you to store, manage, and distribute your software artifacts." +og: + description: "Run Nexus Repository on Coolify for artifact management, Docker registry, npm, Maven, PyPI package hosting, and DevOps dependency storage." +category: "Development" +icon: "/docs/images/services/nexus-logo.png" +--- + + + +## What is Sonatype Nexus + +Sonatype Nexus is a repository manager that allows you to store, manage, and distribute your software artifacts. It supports multiple package formats including Maven, npm, Docker, PyPI, and more. + +## Versions Available + +Coolify offers two versions of Nexus: + +- **Nexus (Standard)**: The official x86_64 architecture version +- **Nexus ARM**: Community Edition for ARM64 architecture, maintained and synced with the official repository + +## Setup + +- The setup relies on starting as default user "admin" with password "admin123". +- Once the service is running, login with the default credentials and change the password. +- After that, delete `NEXUS_SECURITY_RANDOMPASSWORD=false` line from the compose file and restart the service to apply the changes. + +Minimum requirements: + +- 4 vCPU +- 3 GB RAM + +## Screenshots + + + + +## Links + +- [The official website](https://help.sonatype.com/en/sonatype-nexus-repository.html?utm_source=coolify.io) +- [GitHub](https://github.com/sonatype/docker-nexus3?utm_source=coolify.io) diff --git a/content/docs/services/nitropage.mdx b/content/docs/services/nitropage.mdx new file mode 100644 index 00000000..6a92d015 --- /dev/null +++ b/content/docs/services/nitropage.mdx @@ -0,0 +1,59 @@ +--- +title: "Nitropage" +description: "Nitropage is an extensible, drag-and-drop website builder based on SolidStart, completely free and open source." +og: + description: "Host NitroPage website builder on Coolify for drag-and-drop page creation, templates, and simple website development without coding skills." +category: "Development" +icon: "/docs/images/services/nitropage-logo.svg" +--- + + + +## What is Nitropage? + +Nitropage is an extensible, visual website builder based on SolidStart, offering a growing library of versatile building blocks. + +## Deployment Variants + +Nitropage is available in two deployment configurations in Coolify: + +### Nitropage (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or small websites +- **Components:** Single Nitropage container with built-in SQLite database + +### Nitropage with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and scalability +- **Components:** + - Nitropage container + - PostgreSQL container + - Automatic database configuration and health checks + +## Features + +- Reusable element **Presets** and **Layouts** +- Publishing workflow with **Revisions** +- Starter kit with dozens of Blueprints +- Multiple websites on a single instance +- Image optimization with **focal point** cropping +- API for your custom [SolidJS](https://www.solidjs.com/?utm_source=coolify.io) page elements +- Powerful developer architecture with [Vite](https://vitejs.dev/?utm_source=coolify.io) +- Automatic sitemap.xml and Atom-feed handling + +## Video + + + +## Links + +- [The official website](https://nitropage.org/?utm_source=coolify.io) +- [GitHub](https://codeberg.org/nitropage/nitropage?utm_source=coolify.io) diff --git a/content/docs/services/nocobase.mdx b/content/docs/services/nocobase.mdx new file mode 100644 index 00000000..eba9b708 --- /dev/null +++ b/content/docs/services/nocobase.mdx @@ -0,0 +1,28 @@ +--- +title: NocoBase +description: "The most extensible AI-powered no-code platform with total control and infinite extensibility." +og: + description: "NocoBase is the most extensible AI-powered no-code platform. Total control. Infinite extensibility. AI collaboration." +category: "Development" +icon: "/docs/images/services/nocobase-logo.png" +--- + + + +## What is NocoBase + +NocoBase is the most extensible AI-powered no-code platform. Total control. Infinite extensibility. AI collaboration. Enable your team to adapt quickly and cut costs dramatically. No years of development. No millions wasted. Deploy NocoBase in minutes — and take control of everything. + +## Features + +- **Data model-driven**: Instead of being constrained by forms or tables, NocoBase adopts a data model–driven approach, separating data structure from user interface to unlock unlimited possibilities. +- **AI employees**: Embed AI capabilities seamlessly into your interfaces, workflows, and data context. +- **WYSIWYG**: Simple and intuitive interface. One-click switch between usage mode and configuration mode. +- **Plugin-based**: Built for extension through its plugin-based microkernel architecture. All functionalities are plugins. +- **Open Source**: Core and foundational plugins are fully open source. Written in TypeScript, using Node.js, React, Koa. + +## Links + +- [Official Website](https://www.nocobase.com/) +- [Documentation](https://docs.nocobase.com/) +- [GitHub Repository](https://github.com/nocobase/nocobase) diff --git a/content/docs/services/nocodb.mdx b/content/docs/services/nocodb.mdx new file mode 100644 index 00000000..fbdb1b72 --- /dev/null +++ b/content/docs/services/nocodb.mdx @@ -0,0 +1,26 @@ +--- +title: "NocoDB" +description: "Open Source Airtable Alternative." +og: + description: "Deploy NoCoDB on Coolify as Airtable alternative turning databases into smart spreadsheets with REST APIs, forms, and no-code interface." +category: "Database" +icon: "/docs/images/services/nocodb-logo.svg" +--- + +# What is NocoDB? + + + +NocoDB is an open source Airtable alternative. Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadsheet. + +## Screenshots + + + + + + +## Links + +- [The official website](https://nocodb.com/) +- [GitHub](https://github.com/nocodb/nocodb) diff --git a/content/docs/services/nodebb.mdx b/content/docs/services/nodebb.mdx new file mode 100644 index 00000000..09a9ed84 --- /dev/null +++ b/content/docs/services/nodebb.mdx @@ -0,0 +1,20 @@ +--- +title: Nodebb +description: "Node.js based forum software." +og: + description: "Run NodeBB forum on Coolify for modern community discussions, real-time chat, plugins, themes, and social networking platform features." +category: "Forum" +icon: "/docs/images/services/nodebb-logo.svg" +--- + +# Nodebb + + + +## What is Nodebb + +A next-generation discussion platform. + +## Links + +- [Official Documentation](https://docs.nodebb.org/?utm_source=coolify.io) diff --git a/content/docs/services/ntfy.mdx b/content/docs/services/ntfy.mdx new file mode 100644 index 00000000..98c672c0 --- /dev/null +++ b/content/docs/services/ntfy.mdx @@ -0,0 +1,20 @@ +--- +title: Ntfy +description: "Simple HTTP-based pub-sub notification service." +og: + description: "Host ntfy notification service on Coolify for simple pub/sub push notifications via HTTP, mobile apps, and scriptable alert delivery." +category: "Notifications" +icon: "/docs/images/services/ntfy-logo.svg" +--- + +# Ntfy + + + +## What is Ntfy + +ntfy is a simple HTTP-based pub-sub notification service. It allows you to send notifications to your phone or desktop via scripts from any computer, and/or using a REST API. + +## Links + +- [Official Documentation](https://docs.ntfy.sh/?utm_source=coolify.io) diff --git a/content/docs/services/observium.mdx b/content/docs/services/observium.mdx new file mode 100644 index 00000000..4d7f5ef8 --- /dev/null +++ b/content/docs/services/observium.mdx @@ -0,0 +1,22 @@ +--- +title: "Observium" +description: "Low-maintenance auto-discovering network monitoring platform." +og: + description: "Monitor networks on Coolify with Observium for SNMP monitoring, device discovery, performance graphs, and infrastructure health tracking." +category: "Monitoring" +icon: "/docs/images/services/observium-logo.webp" +--- + + + +## What is Observium? + +Observium is a comprehensive network monitoring platform designed to deliver powerful monitoring capabilities, combined with an elegant and intuitive user interface. + +## Screenshots + + + +## Links + +- [The official website](https://docs.observium.org/?utm_source=coolify.io) diff --git a/content/docs/services/odoo.mdx b/content/docs/services/odoo.mdx new file mode 100644 index 00000000..3fa08d80 --- /dev/null +++ b/content/docs/services/odoo.mdx @@ -0,0 +1,23 @@ +--- +title: "Odoo" +description: "Open source ERP and CRM." +og: + description: "Deploy Odoo ERP on Coolify for integrated business management with CRM, e-commerce, accounting, inventory, and 30+ modular applications." +category: "Business" +icon: "/docs/images/services/odoo-logo.svg" +--- + +# What is Odoo? + +Odoo is an open source ERP and CRM software. + +## Screenshots + + + + + +## Links + +- [The official website](https://www.odoo.com/) +- [GitHub](https://github.com/odoo/odoo) diff --git a/content/docs/services/ollama.mdx b/content/docs/services/ollama.mdx new file mode 100644 index 00000000..c060daee --- /dev/null +++ b/content/docs/services/ollama.mdx @@ -0,0 +1,25 @@ +--- +title: "Ollama" +description: "A lightweight and efficient server for running large language models (LLMs) on your local machine or in the cloud." +og: + description: "Run Ollama on Coolify for local LLM hosting supporting Llama, Mistral, Gemma, and custom models with REST API for AI applications." +category: "AI" +icon: "/docs/images/services/ollama-logo.svg" +--- + + + +## What is Ollama? + +Ollama is a lightweight and efficient server for running large language models (LLMs) on your local machine or in the cloud. + +It includes OpenWebUI, a web-based interface for interacting with the models. + +## Screenshots + + + +## Links + +- [The official website](https://ollama.com/?utm_source=coolify.io) +- [GitHub](https://github.com/ollama/ollama?utm_source=coolify.io) diff --git a/content/docs/services/once-campfire.mdx b/content/docs/services/once-campfire.mdx new file mode 100644 index 00000000..fe9e5ffa --- /dev/null +++ b/content/docs/services/once-campfire.mdx @@ -0,0 +1,45 @@ +--- +title: "Once Campfire" +description: "Web-based chat application." +og: + description: "Here you can find the documentation for hosting Once Campfire with Coolify." +category: "Communication" +icon: "/docs/images/services/oncecampfire-logo.png" +--- + + + +## What is Once Campfire? + +Once Campfire is a web-based chat application. It supports many of the features you'd +expect, including: + +- Multiple rooms, with access controls +- Direct messages +- File attachments with previews +- Search +- Notifications (via Web Push) +- @mentions +- API, with support for bot integrations + +## Links + +- [Official website](https://once.com/campfire?utm_source=coolify.io) +- [GitHub](https://github.com/basecamp/once-campfire?utm_source=coolify.io) + +## Configuration + +Once Campfire requires minimal configuration to get started: + +### Required Environment Variables + +- **SECRET_KEY_BASE** - A secure random key for encryption (automatically generated by Coolify) + +### Optional Environment Variables + +- **VAPID_PUBLIC_KEY** - For web push notifications +- **VAPID_PRIVATE_KEY** - For web push notifications +- **DISABLE_SSL** - Set to `true` to disable SSL (default: `true`) +- **SSL_DOMAIN** - Your domain for SSL configuration +- **SKIP_TELEMETRY** - Set to `true` to disable telemetry (default: `true`) +- **SENTRY_DSN** - For error reporting diff --git a/content/docs/services/onedev.mdx b/content/docs/services/onedev.mdx new file mode 100644 index 00000000..0fb3efcd --- /dev/null +++ b/content/docs/services/onedev.mdx @@ -0,0 +1,20 @@ +--- +title: Onedev +description: "Self-hosted Git server with integrated CI/CD and kanban." +og: + description: "Host OneDev on Coolify for self-hosted Git server with CI/CD pipelines, issue tracking, code review, and complete DevOps platform." +category: "Development" +icon: "/docs/images/services/onedev-logo.svg" +--- + +# Onedev + + + +## What is Onedev + +Git server with CI/CD, kanban, and packages. Seamless integration. Unparalleled experience. + +## Links + +- [Official Documentation](https://docs.onedev.io/?utm_source=coolify.io) diff --git a/content/docs/services/onetimesecret.mdx b/content/docs/services/onetimesecret.mdx new file mode 100644 index 00000000..763d0bf9 --- /dev/null +++ b/content/docs/services/onetimesecret.mdx @@ -0,0 +1,19 @@ +--- +title: "Onetime Secret" +description: "Share secrets securely with self-destructing links that can only be viewed once." +og: + description: "Share secrets securely on Coolify with One-Time Secret for encrypted message sharing that self-destructs after single viewing." +category: "Security" +icon: "/docs/images/services/onetimesecret-logo.svg" +--- + + + +## What is Onetime Secret? + +A onetime secret is a link that can be viewed only once. A single-use URL. + +## Links + +- [The official website](https://onetimesecret.com/?utm_source=coolify.io) +- [GitHub](https://github.com/onetimesecret/onetimesecret?utm_source=coolify.io) diff --git a/content/docs/services/open-archiver.mdx b/content/docs/services/open-archiver.mdx new file mode 100644 index 00000000..0e540b3c --- /dev/null +++ b/content/docs/services/open-archiver.mdx @@ -0,0 +1,22 @@ +--- +title: "Open Archiver" +description: "Self-hosted, open-source email archiving solution with full-text search." +og: + description: "A self-hosted, open-source email archiving solution with full-text search capability." +category: "Email" +icon: "/docs/images/services/openarchiver-logo.svg" +--- + +# Open Archiver + + + +## What is Open Archiver? + +Open Archiver is a secure, self-hosted email archiving solution, and it's completely open source. Get an email archiver that enables full-text search across email and attachments. Create a permanent, searchable, and compliant mail archive from Google Workspace, Microsoft 365, and any IMAP server. + +## Links + +- [Official website](https://openarchiver.com/?utm_source=coolify.io) +- [Documentation](https://docs.openarchiver.com/?utm_source=coolify.io) +- [GitHub](https://github.com/LogicLabs-OU/OpenArchiver?utm_source=coolify.io) diff --git a/content/docs/services/open-webui.mdx b/content/docs/services/open-webui.mdx new file mode 100644 index 00000000..c5e80f07 --- /dev/null +++ b/content/docs/services/open-webui.mdx @@ -0,0 +1,20 @@ +--- +title: Open Webui +description: "User-friendly WebUI for LLMs, formerly Ollama WebUI." +og: + description: "Deploy Open WebUI on Coolify for self-hosted ChatGPT interface supporting Ollama, OpenAI, and local LLMs with conversation management." +category: "AI" +icon: "/docs/images/services/openwebui-logo.svg" +--- + +# Open Webui +
+ + +## What is Open Webui + +User-friendly AI Interface (Supports Ollama, OpenAI API, ...) + +## Links + +- [Official Documentation](https://docs.openwebui.com?utm_source=coolify.io) diff --git a/content/docs/services/openblocks.mdx b/content/docs/services/openblocks.mdx new file mode 100644 index 00000000..f372e2c8 --- /dev/null +++ b/content/docs/services/openblocks.mdx @@ -0,0 +1,29 @@ +--- +title: "OpenBlocks" +description: "Open-source low code platform." +og: + description: "Build apps on Coolify with OpenBlocks low-code platform featuring drag-and-drop UI, database connectors, and rapid application development." +category: "Development" +icon: "/docs/images/services/openblocks-logo.svg" +--- + + + + +This service is currently not available in Coolify's service catalog. + + + + +# What is OpenBlocks? + +OpenBlocks is an open source low-code platform. + +## Screenshots + + + +## Links + +- [The official website](https://www.openblocks.dev/) +- [GitHub](https://github.com/openblocks-dev/openblocks) diff --git a/content/docs/services/openclaw.mdx b/content/docs/services/openclaw.mdx new file mode 100644 index 00000000..a85d4bbd --- /dev/null +++ b/content/docs/services/openclaw.mdx @@ -0,0 +1,104 @@ +--- +title: "OpenClaw" +description: "AI-powered coding assistant with multi-provider support and browser automation." +og: + description: "Deploy OpenClaw AI-powered coding assistant on Coolify with multi-provider support, browser automation, and chat integrations." +category: "AI" +icon: "/docs/images/services/openclaw-logo.svg" +--- + +# OpenClaw + + + +## What is OpenClaw? + +OpenClaw [Github](https://github.com/openclaw/openclaw?utm_source=coolify.io) is an AI-powered coding assistant. It supports over 20 AI providers, includes built-in browser automation, and integrates with chat platforms like Telegram, Discord, Slack, and WhatsApp. + + + + +OpenClaw requires HTTPS to function correctly. Make sure your deployment is configured with HTTPS enabled. + + + + +## Authentication + +OpenClaw uses HTTP Basic Auth. The `AUTH_USERNAME` and `AUTH_PASSWORD` environment variables are auto-generated by Coolify during deployment. + +A gateway token (`OPENCLAW_GATEWAY_TOKEN`) is also generated for API access. + +## AI Providers + +At least one AI provider API key is required. Set the corresponding environment variable for your provider: + +- **Anthropic** — `ANTHROPIC_API_KEY` +- **OpenAI** — `OPENAI_API_KEY` +- **Google Gemini** — `GEMINI_API_KEY` +- **OpenRouter** — `OPENROUTER_API_KEY` +- **Groq** — `GROQ_API_KEY` +- **Mistral** — `MISTRAL_API_KEY` +- **xAI** — `XAI_API_KEY` +- **Cerebras** — `CEREBRAS_API_KEY` +- **Amazon Bedrock** — `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION` +- **Ollama (local)** — `OLLAMA_BASE_URL` + +Use `OPENCLAW_PRIMARY_MODEL` to set the default model. + + + + +When using a proxy provider like **OpenRouter** or **OpenCode**, you must prefix the model name with the provider path. For example: + +- **OpenRouter**: `OPENCLAW_PRIMARY_MODEL=openrouter/google/gemini-2.5-flash` +- **OpenCode**: `OPENCLAW_PRIMARY_MODEL=opencode/google/gemini-2.5-flash` + +Using just `google/gemini-2.5-flash` without the provider prefix won't work. Always use the full `provider/model` path. + + + + +### Subscription-Based Authentication + +If you have an **Anthropic** (Claude) or **OpenAI** (Codex) subscription, you can authenticate using their CLI login flows instead of API keys. Open a terminal in your OpenClaw container and run: + +**Anthropic (Claude):** + +```bash +openclaw models auth login --provider anthropic +``` + +**OpenAI (Codex):** + +```bash +openclaw models auth login --provider openai +``` + +Alternatively, use the onboarding wizard to set up authentication interactively: + +```bash +openclaw onboard +``` + +You can verify your authentication status with: + +```bash +openclaw models status +``` + +For the full list of supported providers and configuration options, see the [GitHub repository](https://github.com/coollabsio/openclaw?utm_source=coolify.io). + +## Browser + +The `/browser` endpoint opens a remote browser controlled by OpenClaw via Chrome DevTools Protocol (CDP). This is useful for OAuth flows, 2FA, captcha solving, and authenticated web scraping. + +Browser sessions are persisted across restarts via a dedicated volume. You can configure the browser with these environment variables: + +- `BROWSER_DEFAULT_PROFILE` — Browser profile name (default: `openclaw`) +- `BROWSER_SNAPSHOT_MODE` — Snapshot mode (default: `efficient`) +- `BROWSER_EVALUATE_ENABLED` — Enable JavaScript evaluation (default: `true`) + +## Links + +- [GitHub](https://github.com/coollabsio/openclaw?utm_source=coolify.io) diff --git a/content/docs/services/openpanel.mdx b/content/docs/services/openpanel.mdx new file mode 100644 index 00000000..f4378ba2 --- /dev/null +++ b/content/docs/services/openpanel.mdx @@ -0,0 +1,21 @@ +--- +title: "OpenPanel" +description: "Open source alternative to Mixpanel and Plausible for product analytics." +og: + description: "Host OpenPanel analytics on Coolify for privacy-focused web analytics, event tracking, user insights without cookies or data collection." +category: "Analytics" +icon: "/docs/images/services/openpanel-logo.svg" +--- + +# OpenPanel + + + +## What is OpenPanel? + +OpenPanel is an open-source alternative to Mixpanel and Plausible for product analytics. It provides privacy-focused analytics with detailed insights about user behavior, events, and conversions. OpenPanel offers real-time analytics, custom event tracking, funnel analysis, and user segmentation while respecting user privacy and giving you full control over your data. + +## Links + +- [The official website](https://openpanel.dev?utm_source=coolify.io) +- [GitHub](https://github.com/Openpanel-dev/openpanel?utm_source=coolify.io) diff --git a/content/docs/services/opnform.mdx b/content/docs/services/opnform.mdx new file mode 100644 index 00000000..edb5c34e --- /dev/null +++ b/content/docs/services/opnform.mdx @@ -0,0 +1,33 @@ +--- +title: "OpnForm" +description: "Open-source form builder that lets you create beautiful forms and share them anywhere." +og: + description: "Build beautiful forms and share them anywhere with OpnForm, an open-source form builder that's super fast and requires no coding knowledge." +category: "Development" +icon: "/docs/images/services/opnform.svg" +--- + +# OpnForm + +OpnForm + +## What is OpnForm? + +OpnForm is an open-source form builder designed to empower developers and users alike. Create beautiful forms and share them anywhere - it's super fast and you don't need to know how to code. Get started for free with unlimited forms, fields, and submissions. + +## Features + +- Drag-and-drop form builder +- Custom themes and branding +- Conditional logic +- File uploads +- Form analytics +- Email notifications +- Custom domains +- No coding required + +## Links + +- [Official Website](https://opnform.com/?utm_source=coolify.io) +- [Documentation](https://docs.opnform.com/introduction?utm_source=coolify.io) +- [GitHub](https://github.com/opnform/opnform?utm_source=coolify.io) diff --git a/content/docs/services/orangehrm.mdx b/content/docs/services/orangehrm.mdx new file mode 100644 index 00000000..1e45818a --- /dev/null +++ b/content/docs/services/orangehrm.mdx @@ -0,0 +1,19 @@ +--- +title: "OrangeHRM" +description: "Free HR management system for businesses." +og: + description: "Manage HR on Coolify with OrangeHRM for employee records, leave management, time tracking, recruitment, and human resource administration." +category: "Business" +icon: "/docs/images/services/orangehrm-logo.svg" +--- + + + +## What is OrangeHRM? + +OrangeHRM is a comprehensive Human Resource Management (HRM) System that captures all the essential functionalities required for any enterprise. + +## Links + +- [The official website](https://orangehrm.com/?utm_source=coolify.io) +- [GitHub](https://github.com/orangehrm/orangehrm?utm_source=coolify.io) diff --git a/content/docs/services/organizr.mdx b/content/docs/services/organizr.mdx new file mode 100644 index 00000000..ea5d9c57 --- /dev/null +++ b/content/docs/services/organizr.mdx @@ -0,0 +1,20 @@ +--- +title: Organizr +description: "Homepage organizer for your server services." +og: + description: "Deploy Organizr dashboard on Coolify for unified homepage with service tabs, user management, SSO integration, and organized app access." +category: "Administration" +icon: "/docs/images/services/organizr-logo.png" +--- + +# Organizr + + + +## What is Organizr + +Homelab Services Organizer + +## Links + +- [Official Documentation](https://docs.organizr.app/?utm_source=coolify.io) diff --git a/content/docs/services/osticket.mdx b/content/docs/services/osticket.mdx new file mode 100644 index 00000000..210ef8df --- /dev/null +++ b/content/docs/services/osticket.mdx @@ -0,0 +1,20 @@ +--- +title: Osticket +description: "Open-source help desk ticketing system." +og: + description: "Run osTicket helpdesk on Coolify for ticket management, customer support, email integration, and IT service desk automation workflows." +category: "Business" +icon: "/docs/images/services/osticket-logo.png" +--- + +# Osticket + + + +## What is Osticket + +osTicket is a widely-used open source support ticket system. + +## Links + +- [Official Documentation](https://docs.osticket.com/en/latest/?utm_source=coolify.io) diff --git a/content/docs/services/overseerr.mdx b/content/docs/services/overseerr.mdx new file mode 100644 index 00000000..29241a6e --- /dev/null +++ b/content/docs/services/overseerr.mdx @@ -0,0 +1,23 @@ +--- +title: "Overseerr" +description: "A request management and media discovery tool built to work with your existing Plex ecosystem." +og: + description: "Deploy Overseerr on Coolify for Plex/Jellyfin media requests with user management, discovery, approval workflows, and integration automation." +category: "Media" +icon: "/docs/images/services/overseerr-logo.svg" +--- + + + +## What is Overseerr? + +Overseerr is a request management and media discovery tool built to work with your existing Plex ecosystem. + +## Screenshots + + + +## Links + +- [The official website](https://overseerr.dev/) +- [GitHub](https://github.com/sct/overseerr) diff --git a/content/docs/services/overview.mdx b/content/docs/services/overview.mdx new file mode 100644 index 00000000..d47b1f75 --- /dev/null +++ b/content/docs/services/overview.mdx @@ -0,0 +1,15 @@ +--- +title: Overview +description: Browse the complete directory of one-click services available in Coolify, including databases, development tools, and productivity apps. +layout: doc +--- + +# Services + +This list only includes services that are available as one-click services in Coolify. + + + +--- + +Looking for a complete list with direct links? View our [All Services Directory](/services/all) for a categorized list of all available services. \ No newline at end of file diff --git a/content/docs/services/owncloud.mdx b/content/docs/services/owncloud.mdx new file mode 100644 index 00000000..0082032a --- /dev/null +++ b/content/docs/services/owncloud.mdx @@ -0,0 +1,20 @@ +--- +title: Owncloud +description: "File synchronization and sharing platform." +og: + description: "Run ownCloud on Coolify for enterprise file sync, sharing, collaboration, encryption, and self-hosted cloud storage with desktop clients." +category: "Storage" +icon: "/docs/images/services/owncloud-logo.svg" +--- + +# Owncloud + + + +## What is Owncloud + +OwnCloud with Open Web UI integrates file management with a powerful, user-friendly interface. + +## Links + +- [Official Documentation](https://owncloud.com/docs-guides/?utm_source=coolify.io) diff --git a/content/docs/services/pairdrop.mdx b/content/docs/services/pairdrop.mdx new file mode 100644 index 00000000..7989b2d0 --- /dev/null +++ b/content/docs/services/pairdrop.mdx @@ -0,0 +1,19 @@ +--- +title: "Pairdrop" +description: "Local file sharing in your browser." +og: + description: "Share files on Coolify with PairDrop for local network file transfer, AirDrop alternative, and quick peer-to-peer file sharing via browser." +category: "File Sharing" +icon: "/docs/images/services/pairdrop-logo.png" +--- + + + +## What is Pairdrop? + +Pairdrop is a self-hosted file sharing and collaboration platform, offering secure file sharing and collaboration capabilities for efficient teamwork. + +## Links + +- [The official website](https://pairdrop.net/) +- [GitHub](https://github.com/schlagmichdoch/pairdrop) diff --git a/content/docs/services/palworld.mdx b/content/docs/services/palworld.mdx new file mode 100644 index 00000000..695dacfa --- /dev/null +++ b/content/docs/services/palworld.mdx @@ -0,0 +1,25 @@ +--- +title: "Palworld" +description: "Dedicated server for Palworld multiplayer survival game with creature collection and base building." +og: + description: "Host Palworld dedicated server on Coolify for multiplayer survival gameplay with creature collection, base building, and cooperative adventures." +category: "Gaming" +icon: "/docs/images/services/palworld-logo.webp" +--- + +## What is Palworld? + +Palworld is a multiplayer, open-world survival and crafting game where you can befriend and collect mysterious creatures called "Pals" in a vast world. This service allows you to host a dedicated Palworld server for you and your friends. + +## Features + +- Dedicated server hosting +- Multiplayer support +- Persistent world +- Custom server configuration +- Save game management + +## Links + +- [Official Website](https://www.pocketpair.jp/palworld) +- [Steam Page](https://store.steampowered.com/app/1623730/Palworld/) diff --git a/content/docs/services/paperless.mdx b/content/docs/services/paperless.mdx new file mode 100644 index 00000000..d273e181 --- /dev/null +++ b/content/docs/services/paperless.mdx @@ -0,0 +1,20 @@ +--- +title: Paperless +description: "Document management system that transforms physical documents into searchable online archives." +og: + description: "Manage documents on Coolify with Paperless-ngx for scanning, OCR, tagging, full-text search, and digital document management system." +category: "Documentation" +icon: "/docs/images/services/paperless-logo.png" +--- + +# Paperless + + + +## What is Paperless + +Paperless-ngx is a community-supported open-source document management system that transforms your physical documents into a searchable online archive so you can keep, well, less paper. + +## Links + +- [Official Documentation](https://docs.paperless-ngx.com/configuration/?utm_source=coolify.io) diff --git a/content/docs/services/passbolt.mdx b/content/docs/services/passbolt.mdx new file mode 100644 index 00000000..f526e04a --- /dev/null +++ b/content/docs/services/passbolt.mdx @@ -0,0 +1,25 @@ +--- +title: "Passbolt" +description: "Open source password manager for teams." +og: + description: "Deploy Passbolt on Coolify for team password management with end-to-end encryption, sharing, access control, and collaborative credentials." +category: "Security" +icon: "/docs/images/services/passbolt-logo.svg" +--- + + + +## What is Passbolt? + +Passbolt is an open source credential platform for modern teams. + +A versatile, battle-tested solution to manage and collaborate on passwords, accesses, and secrets. All in one. + +## Screenshots + + + +## Links + +- [The official website](https://www.passbolt.com/?utm_source=coolify.io) +- [GitHub](https://github.com/passbolt?utm_source=coolify.io) diff --git a/content/docs/services/paymenter.mdx b/content/docs/services/paymenter.mdx new file mode 100644 index 00000000..f42f43a4 --- /dev/null +++ b/content/docs/services/paymenter.mdx @@ -0,0 +1,37 @@ +--- +title: "Paymenter" +description: "Open-Source Billing, Built for Hosting Providers." +og: + description: "Host Paymenter billing on Coolify for web hosting invoicing, client management, automated provisioning, and service provider administration." +category: "Business" +icon: "/docs/images/services/paymenter-logo.svg" +--- + + + +## What is Paymenter? + +Paymenter is an open-source billing platform tailored for hosting companies. It simplifies the management of hosting services, providing a seamless experience for both providers and customers. Built on modern web technologies, Paymenter offers a flexible and robust solution for your hosting business needs. + +## How to configure Paymenter with Coolify + +1. Create a new resource using the **Paymenter** service. +2. Start the resource. +3. Set the correct app URL via the terminal: + +Select the Paymenter container and run the following command: + +```bash +php artisan app:init +``` + +4. Create the first admin user: + ```bash + php artisan app:user:create + ``` + +## Links + +- [The official website](https://paymenter.org/) +- [GitHub](https://github.com/Paymenter/Paymenter) +- [Demo](https://demo.paymenter.org/) diff --git a/content/docs/services/penpot.mdx b/content/docs/services/penpot.mdx new file mode 100644 index 00000000..f5271c48 --- /dev/null +++ b/content/docs/services/penpot.mdx @@ -0,0 +1,25 @@ +--- +title: "Penpot" +description: "Open Source design & prototyping platform." +og: + description: "Design on Coolify with Penpot open-source Figma alternative for prototyping, collaboration, SVG-based design, and web-based UI/UX workflows." +category: "Design" +icon: "/docs/images/services/penpot-logo.svg" +--- + + + +## What is Penpot? + +Penpot is an open-source design and prototyping tool that empowers teams to create beautiful, interactive prototypes and collaborate seamlessly. + +## Screenshot + + + + + +## Links + +- [The official website](https://penpot.app/) +- [GitHub](https://github.com/penpot/penpot) diff --git a/content/docs/services/pgadmin.mdx b/content/docs/services/pgadmin.mdx new file mode 100644 index 00000000..a95426c8 --- /dev/null +++ b/content/docs/services/pgadmin.mdx @@ -0,0 +1,22 @@ +--- +title: "pgAdmin" +description: "A web-based database management tool for administering your PostgreSQL databases through a user-friendly interface." +og: + description: "Here you can find the documentation for hosting pgAdmin with Coolify." +category: "Development" +icon: "/docs/images/services/pgadmin-logo.svg" +--- + +# pgAdmin + + + +## What is pgAdmin? + +pgAdmin is a web-based database management tool for administering your PostgreSQL databases through a user-friendly interface. It provides a comprehensive set of features for database administration, query development, and data visualization, making it the most popular and feature-rich Open Source administration and development platform for PostgreSQL. + +## Links + +- [The official website](https://www.pgadmin.org?utm_source=coolify.io) +- [Documentation](https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html?utm_source=coolify.io) +- [GitHub](https://github.com/pgadmin-org/pgadmin4?utm_source=coolify.io) diff --git a/content/docs/services/pgbackweb.mdx b/content/docs/services/pgbackweb.mdx new file mode 100644 index 00000000..1edd4e7c --- /dev/null +++ b/content/docs/services/pgbackweb.mdx @@ -0,0 +1,23 @@ +--- +title: "PG Back Web" +description: "Effortless PostgreSQL backups with a user-friendly web interface." +og: + description: "Backup PostgreSQL on Coolify with pgBackWeb for database backups, scheduling, restoration, and web-based backup management interface." +category: "Database" +icon: "/docs/images/services/pgbackweb-logo.png" +--- + + + +## What is PG Back Web? + +Effortless PostgreSQL backups with a user-friendly web interface! + +## Screenshots + + + +## Links + +- [The official website](https://github.com/eduardolat/pgbackweb?utm_source=coolify.io) +- [GitHub](https://github.com/eduardolat/pgbackweb?utm_source=coolify.io) diff --git a/content/docs/services/phpmyadmin.mdx b/content/docs/services/phpmyadmin.mdx new file mode 100644 index 00000000..01bc1ed1 --- /dev/null +++ b/content/docs/services/phpmyadmin.mdx @@ -0,0 +1,19 @@ +--- +title: "phpMyAdmin" +description: "MySQL database management tool." +og: + description: "Manage MySQL on Coolify with phpMyAdmin for database administration, SQL queries, table editing, and web-based database management." +category: "Development" +icon: "/docs/images/services/phpmyadmin-logo.svg" +--- + + + +## What is phpMyAdmin? + +phpMyAdmin is a free and open-source administration tool for MySQL and MariaDB. + +## Links + +- [The official website](https://www.phpmyadmin.net/) +- [GitHub](https://github.com/phpmyadmin/phpmyadmin) diff --git a/content/docs/services/pi-hole.mdx b/content/docs/services/pi-hole.mdx new file mode 100644 index 00000000..016714f7 --- /dev/null +++ b/content/docs/services/pi-hole.mdx @@ -0,0 +1,21 @@ +--- +title: "Pi-hole" +description: "Network-wide ad blocker that acts as a DNS sinkhole." +og: + description: "Block ads on Coolify with Pi-hole network-wide ad blocking, DNS filtering, tracking protection, and dashboard for home network privacy." +category: "Security" +icon: "/docs/images/services/pihole-logo.svg" +--- + +# Pi-hole + + + +## What is Pi-hole? + +Pi-hole is a network-wide ad blocker that acts as a DNS sinkhole, protecting your devices from unwanted content without installing client-side software. It blocks ads, trackers, and malware at the network level by filtering DNS requests. Pi-hole provides detailed analytics about your network's DNS queries and can significantly improve browsing speed by blocking unwanted content before it reaches your devices. + +## Links + +- [The official website](https://pi-hole.net?utm_source=coolify.io) +- [GitHub](https://github.com/pi-hole/pi-hole?utm_source=coolify.io) diff --git a/content/docs/services/pingvinshare.mdx b/content/docs/services/pingvinshare.mdx new file mode 100644 index 00000000..63a3af2a --- /dev/null +++ b/content/docs/services/pingvinshare.mdx @@ -0,0 +1,43 @@ +--- +title: "PingvinShare" +description: "Self-hosted file sharing platform that combines lightness and beauty." +og: + description: "Share files on Coolify with PingvinShare for temporary file sharing, expiring links, password protection, and self-hosted file transfer." +category: "File Sharing" +icon: "/docs/images/services/pingvinshare-logo.svg" +--- + +# PingvinShare + + + + +This service has been removed from Coolify’s one-click service catalog because it is no longer maintained by the original author. You can find more information about the project being archived [here](https://github.com/stonith404/pingvin-share?tab=readme-ov-file#%EF%B8%8F-project-archived) + +We still have the last known working Docker Compose file for this service, so you can deploy it manually by following the installation steps below. + + + + + +## What is PingvinShare? + +PingvinShare is a self-hosted file sharing platform that combines lightness and beauty. It allows you to easily share files with others through temporary links, supports password protection, expiration dates, and provides a clean, modern interface. PingvinShare is designed to be a lightweight alternative to commercial file sharing services while giving you complete control over your data. + +## How to deploy PingvinShare with Coolify? + +Since PingvinShare is no longer maintained by the original author, a fully automated one-click service installation is no longer available. However, you can still easily deploy the last released version by following the steps below. + +## Installation + +1. Add a New Resource and select the `Docker Compose Empty` application deployment type. +2. Copy the following [file](https://raw.githubusercontent.com/coollabsio/coolify/v4.x/templates/compose/pingvinshare.yaml) into the input box (with the comments). +3. Click on the `Save` button. +4. Go to the `PingvinShare` service's settings page (`Settings` button on the right side). +5. Add your custom domain to the `Domains` input box (you can also edit the domains by clicking on the edit icon next to the autogenerated domain). +6. Click on the `Save` button. +7. Click on the `Deploy` button and wait for the deployment to finish. + + +## Links +- [GitHub](https://github.com/stonith404/pingvin-share?utm_source=coolify.io) diff --git a/content/docs/services/plane.mdx b/content/docs/services/plane.mdx new file mode 100644 index 00000000..909fd473 --- /dev/null +++ b/content/docs/services/plane.mdx @@ -0,0 +1,26 @@ +--- +title: "Plane" +description: "Open source project planning tool." +og: + description: "Manage projects on Coolify with Plane for issue tracking, sprints, roadmaps, and modern project management for software development teams." +category: "Project Management" +icon: "/docs/images/services/plane-logo.svg" +--- + +Plane + +## What is Plane? + +Plane is a free and open-source project management tool that empowers teams to collaborate and manage projects efficiently. + +## Screenshots + + + + + + +## Links + +- [The official website](https://plane.so) +- [GitHub](https://github.com/makeplane/plane) diff --git a/content/docs/services/plausible.mdx b/content/docs/services/plausible.mdx new file mode 100644 index 00000000..d20c6ddc --- /dev/null +++ b/content/docs/services/plausible.mdx @@ -0,0 +1,41 @@ +--- +title: "Plausible Analytics" +description: "A lightweight, open-source web analytics tool that prioritizes user privacy by not using cookies." +og: + description: "Deploy Plausible Analytics on Coolify for lightweight, cookieless, GDPR-compliant web analytics with privacy-first visitor insights." +category: "Analytics" +icon: "/docs/images/services/plausible-logo.svg" +--- + + + + + + +This service is not available as a one-click deployment on Coolify due to legal (trademark) restrictions. To use it with Coolify, you’ll need to deploy it manually by following the installation steps below. + + + + +## What is Plausible Analytics? + +Plausible is intuitive, lightweight and open-source web analytics software. It uses no cookies and is fully compliant with GDPR, CCPA and PECR. + +## How to deploy Plausible Analytics with Coolify? + +Due to trademark issues, we can't provide a fully automated one-click Service installation for Plausible Analytics. But don't worry, it's still very easy to install. + +## Installation + +1. Add a New Resource and select the `Docker Compose Empty` application deployment type. +2. Copy the following [file](https://raw.githubusercontent.com/coollabsio/coolify/v4.x/templates/compose/plausible.yaml) into the input box (with the comments). +3. Click on the `Save` button. +4. Go to the `Plausible` service's settings page (`Settings` button on the right side). +5. Add your custom domain to the `Domains` input box (you can also edit the domains by clicking on the edit icon next to the autogenerated domain). +6. Click on the `Save` button. +7. Click on the `Deploy` button and wait for the deployment to finish. + +## Links + +- [The official website](https://plausible.io/) +- [GitHub](https://github.com/plausible/analytics) diff --git a/content/docs/services/plex.mdx b/content/docs/services/plex.mdx new file mode 100644 index 00000000..97ef9b9d --- /dev/null +++ b/content/docs/services/plex.mdx @@ -0,0 +1,34 @@ +--- +title: "Plex" +description: "Media server software." +og: + description: "Stream media on Coolify with Plex server for movies, TV shows, music, photos with transcoding, mobile apps, and live TV DVR support." +category: "Media" +icon: "/docs/images/services/plex-logo.svg" +--- + + + +## What is Plex? + +Available on almost any device, Plex is the first-and-only streaming platform to offer free ad-supported movies, shows, and live TV together. + +## Installation + +1. Create the service within Coolify. +2. BEFORE starting the service, set the `PLEX_CLAIM` variable. You can get a claim token here: https://plex.tv/claim +3. If your device supports it, enable hardware transcoding by uncommenting this section in the compose file: + +```yaml +#devices: +# - "/dev/dri:/dev/dri" +``` + +## Screenshots + + + +## Links + +- [The official website](https://www.plex.tv/) +- [GitHub](https://github.com/plexinc/pms-docker) diff --git a/content/docs/services/plunk.mdx b/content/docs/services/plunk.mdx new file mode 100644 index 00000000..84067187 --- /dev/null +++ b/content/docs/services/plunk.mdx @@ -0,0 +1,25 @@ +--- +title: "Plunk" +description: "Self-hosted email marketing platform." +og: + description: "Send emails on Coolify with Plunk for transactional email API, templates, analytics, and developer-friendly email delivery service." +category: "Marketing" +icon: "/docs/images/services/plunk-logo.svg" +--- + + + +## What is Plunk? + +Plunk is an open-source email platform for AWS. + +## Screenshots + + + + + +## Links + +- [The official website](https://useplunk.com) +- [GitHub](https://github.com/useplunk/plunk) diff --git a/content/docs/services/pocket-id.mdx b/content/docs/services/pocket-id.mdx new file mode 100644 index 00000000..d2362d86 --- /dev/null +++ b/content/docs/services/pocket-id.mdx @@ -0,0 +1,76 @@ +--- +title: Pocket ID +description: "A simple OIDC provider for passwordless authentication with passkeys." +og: + description: "Deploy Pocket ID on Coolify for simple OIDC provider with passwordless passkey authentication across your self-hosted services." +category: "Security" +icon: "/docs/images/services/pocketid-logo.webp" +--- + +# Pocket ID + + + +## What is Pocket ID? + +Pocket ID is a simple OIDC provider for passwordless authentication using [passkeys](https://www.passkeys.io/). It's designed to be straightforward and easy-to-use. It exclusively supports passkey authentication, allowing you to use hardware security keys like Yubikey for secure sign-ins across your self-hosted services. + +## Deployment Variants + +Pocket ID is available in two deployment configurations in Coolify: + +### Pocket ID (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal authentication server +- **Components:** Single Pocket ID container with built-in SQLite database + +### Pocket ID with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and data reliability +- **Components:** + - Pocket ID container + - PostgreSQL container + - Automatic database configuration and health checks + +## Features + +- **Passwordless Authentication**: Uses passkeys instead of passwords for better security +- **OIDC Provider**: Integrates with applications that support OpenID Connect +- **Simple Setup**: Easy to install and configure compared to complex alternatives +- **Wide Compatibility**: Works with [various services](https://pocket-id.org/docs/client-examples?utm_source=coolify.io) like Nextcloud, GitLab, and more +- **Passkey Support**: Full support for hardware security keys like Yubikey +- **Self-Hosted**: Maintain complete control over your authentication infrastructure + +## Getting Started + +Once deployed, you can sign in with the admin account at: + +``` +https:///setup +``` + +Follow the Pocket ID setup wizard to configure your instance and create your first passkey. + +## Demo + +To see Pocket ID in action, visit the [live demo](https://demo.pocket-id.org/). + + + + +This demo is not affiliated with Coolify. + + + + +## Links + +- [Official Website](https://pocket-id.org?utm_source=coolify.io) +- [Documentation](https://pocket-id.org/docs/introduction?utm_source=coolify.io) +- [Installation Guide](https://pocket-id.org/docs/setup/installation?utm_source=coolify.io) +- [GitHub](https://github.com/pocket-id/pocket-id?utm_source=coolify.io) + +## Additional Resources + +- [Proxy Services Guide](https://pocket-id.org/docs/guides/proxy-services?utm_source=coolify.io) +- [Client Examples](https://pocket-id.org/docs/client-examples?utm_source=coolify.io) \ No newline at end of file diff --git a/content/docs/services/pocketbase.mdx b/content/docs/services/pocketbase.mdx new file mode 100644 index 00000000..5cf97180 --- /dev/null +++ b/content/docs/services/pocketbase.mdx @@ -0,0 +1,19 @@ +--- +title: "PocketBase" +description: "Open Source backend for your next SaaS and Mobile app." +og: + description: "Deploy PocketBase on Coolify for instant backend with database, authentication, file storage, real-time subscriptions in single executable." +category: "Development" +icon: "/docs/images/services/pocketbase-logo.svg" +--- + + + +## What is PocketBase? + +PocketBase is an open-source backend-as-a-service (BaaS) that empowers developers to build web and mobile applications faster and easier. + +## Links + +- [The official website](https://pocketbase.io) +- [GitHub](https://github.com/pocketbase/pocketbase) diff --git a/content/docs/services/portainer.mdx b/content/docs/services/portainer.mdx new file mode 100644 index 00000000..d3494176 --- /dev/null +++ b/content/docs/services/portainer.mdx @@ -0,0 +1,18 @@ +--- +title: Portainer +description: "Container management platform." +og: + description: "Manage Docker on Coolify with Portainer for container management, stack deployment, registry access, and web-based Docker administration." +category: "Development" +icon: "/docs/images/services/portainer-logo.png" +--- + +# Portainer + +## What is Portainer + +Portainer is a lightweight management UI for Docker + +## Links + +- [Official Documentation](https://docs.portainer.io?utm_source=coolify.io) diff --git a/content/docs/services/posthog.mdx b/content/docs/services/posthog.mdx new file mode 100644 index 00000000..dda0dfbb --- /dev/null +++ b/content/docs/services/posthog.mdx @@ -0,0 +1,27 @@ +--- +title: "PostHog" +description: "Open source product analytics." +og: + description: "Run PostHog analytics on Coolify for product analytics, feature flags, session replay, A/B testing, and user behavior tracking platform." +category: "Analytics" +icon: "/docs/images/services/posthog-logo.svg" +--- + + + + + + +This service is currently disabled in Coolify due to known bugs. The installation is not available until these issues are resolved. Please check the [GitHub repository](https://github.com/coollabsio/coolify) for updates on when this service will be re-enabled. + + + + +## What is PostHog? + +The single platform to analyze, test, observe, and deploy new features + +## Links + +- [The official website](https://posthog.com) +- [GitHub](https://github.com/PostHog/posthog) diff --git a/content/docs/services/postiz.mdx b/content/docs/services/postiz.mdx new file mode 100644 index 00000000..034f8be0 --- /dev/null +++ b/content/docs/services/postiz.mdx @@ -0,0 +1,25 @@ +--- +title: Postiz +description: "Social media scheduling and analytics tool." +og: + description: "Schedule social media on Coolify with Postiz for content planning, multi-platform posting, analytics, and social media management automation." +category: "Social Media" +icon: "/docs/images/services/postiz-logo.png" +--- + +# Postiz + + + +## What is Postiz + +Open source social media scheduling tool. + + +## Links + +- [Official Documentation](https://docs.postiz.com?utm_source=coolify.io) + +## Warning + +When deployed it will allow registrations from anyone. Ensure you get there first and then set `DISABLE_REGISTRATION=true` if you don't want more self-served registrations. diff --git a/content/docs/services/prefect.mdx b/content/docs/services/prefect.mdx new file mode 100644 index 00000000..2a56d8ca --- /dev/null +++ b/content/docs/services/prefect.mdx @@ -0,0 +1,23 @@ +--- +title: "Prefect" +description: "Open source workflow management platform." +og: + description: "Orchestrate workflows on Coolify with Prefect for data pipelines, task scheduling, monitoring, and modern workflow automation platform." +category: "Development" +icon: "/docs/images/services/prefect-logo.png" +--- + + + +## What is Prefect? + +Prefect is an orchestration and observability platform that empowers developers to build and scale workflows quickly. + +## Screenshots + + + +## Links + +- [The official website](https://www.prefect.io?utm_source=coolify.io) +- [GitHub](https://github.com/PrefectHQ/prefect?utm_source=coolify.io) diff --git a/content/docs/services/privatebin.mdx b/content/docs/services/privatebin.mdx new file mode 100644 index 00000000..f69b068f --- /dev/null +++ b/content/docs/services/privatebin.mdx @@ -0,0 +1,20 @@ +--- +title: Privatebin +description: "Minimalist, open-source online pastebin." +og: + description: "Share text securely on Coolify with PrivateBin for encrypted pastebin, self-destructing messages, and zero-knowledge data sharing." +category: "Development" +icon: "/docs/images/services/privatebin-logo.svg" +--- + +# Privatebin + + + +## What is Privatebin + +PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. + +## Links + +- [Official Documentation](https://github.com/PrivateBin/PrivateBin/blob/master/doc/README.md?utm_source=coolify.io) diff --git a/content/docs/services/prowlarr.mdx b/content/docs/services/prowlarr.mdx new file mode 100644 index 00000000..0b374adf --- /dev/null +++ b/content/docs/services/prowlarr.mdx @@ -0,0 +1,23 @@ +--- +title: "Prowlarr" +description: "A free and open source BitTorrent client." +og: + description: "Manage indexers on Coolify with Prowlarr for centralized torrent and usenet indexer management integrated with Sonarr and Radarr." +category: "Media" +icon: "/docs/images/services/prowlarr-logo.svg" +--- + + + +## What is Prowlarr? + +Prowlarr is an indexer manager/proxy built on the popular \*arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Lidarr, Mylar3, Radarr, Readarr, and Sonarr offering complete management of your indexers with no per app Indexer setup required (we do it all). + +## Screenshots + + + +## Links + +- [The official website](https://prowlarr.com/) +- [GitHub](https://github.com/Prowlarr/Prowlarr) diff --git a/content/docs/services/proxyscotch.mdx b/content/docs/services/proxyscotch.mdx new file mode 100644 index 00000000..19437b5e --- /dev/null +++ b/content/docs/services/proxyscotch.mdx @@ -0,0 +1,40 @@ +--- +title: Proxyscotch +description: "Tiny open-source CORS proxy made by Hoppscotch." +og: + description: "Run your own CORS proxy on Coolify. Works both standalone & with Hoppscotch" +category: "Development" +icon: "/docs/images/services/proxyscotch.png" +--- + +# Proxyscotch + + + +## What is Proxyscotch + +Tiny open-source CORS proxy made by Hoppscotch. +> Works well with Hoppscotch, but can be used standalone as well. + + +## Setup Instructions +> This is only needed for when setting up Proxyscotch for a selfhosted instance of Hoppscotch. + +If you secure your proxy server ***(recommended & enabled by default)*** you will need to set some ENV vars for your Hoppscotch instance. + +##### After you've set up your Proxyscotch instance: + +- Go and find the token that Coolify generated for you. +- In the settings for your Hoppscotch instance on coolify, go to **Environment Variables** +- Add a new variable called `VITE_PROXYSCOTCH_ACCESS_TOKEN` and set it to the token you found before. +- Restart the Hoppscotch instance. + +- Once it restarts, load the webui & navigate to **Settings > Interceptors**. - Then scroll down to **Proxy** +- Set the proxy URL to the URL of your Proxyscotch instance +> You might have to enable the Proxy via the switch in the dashboard first before you can modify the URL. + +You should now have Hoppscotch set-up & working with your own CORS proxy! + +## Links + +- [Official Documentation](https://github.com/hoppscotch/proxyscotch?utm_source=coolify.io) diff --git a/content/docs/services/pterodactyl.mdx b/content/docs/services/pterodactyl.mdx new file mode 100644 index 00000000..050a72b9 --- /dev/null +++ b/content/docs/services/pterodactyl.mdx @@ -0,0 +1,155 @@ +--- +title: "Pterodactyl Panel" +description: "Game server management panel with Wings daemon for hosting Minecraft, CS:GO, ARK and more." +og: + description: "Host game servers on Coolify with Pterodactyl panel for Minecraft, CS:GO, ARK with web management, Docker isolation, and automation." +category: "Gaming" +icon: "/docs/images/services/pterodactyl_logo_transparent.png" +--- + + + +## What is Pterodactyl? + + + + +This service has been removed from Coolify’s one-click service catalog. More info on https://github.com/coollabsio/coolify/pull/8512 + + + + +Pterodactyl® is a free, open-source game server management panel built with PHP, React, and Go. +Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users. + +Pterodactyl consists of two core components that work together: the **Panel** (web interface) and **Wings** (server daemon). The Panel provides the management interface, while Wings handles the actual game server operations on each node. + +## Current Features + +- Multi-server management from one dashboard +- Secure daemon (Wings) with process isolation +- Docker-based containerization for each server +- Web-based dashboard +- Role-based user permissions +- Real-time CPU, RAM, and network monitoring +- Automated server updates and backups + +## What is Wings? + +Wings is Pterodactyl's server control daemon, written in Go. It runs on each server node and handles all game server operations including creation, management, and monitoring of server instances. + +Wings communicates with the Pterodactyl Panel via its REST API, receiving commands and configuration while sending back real-time statistics, console output, and status updates. Each game server runs in an isolated Docker container managed by Wings. + +Key capabilities: + +- **Server lifecycle management** - Start, stop, restart, and configure game servers +- **Docker container orchestration** - Automatic provisioning and isolation +- **Real-time monitoring** - CPU, RAM, disk, and network usage tracking +- **Console streaming** - Live server console output to the Panel +- **File management** - Handle server files, backups, and scheduled tasks +- **Resource enforcement** - CPU and memory limits per container + +## Installation on Coolify + +Coolify offers two deployment options for Pterodactyl: a combined Panel + Wings template for single-server setups, or separate deployments for distributed architectures. + +### Option 1: Pterodactyl With Wings (Combined Template) + +Best for single-server deployments where the Panel and Wings run together. + +1. Install the latest **Pterodactyl With Wings** template from **Coolify**. +2. Deploy the template. +3. Visit the panel URL and log in using your admin credentials. +4. Navigate to the **Admin Panel → Locations** and create a new location (e.g., `us`, `eu`, ...). +5. Create a new node and configure the following fields: + + - **FQDN** → `wings-abc1abc2abc3abc4.example.com` (Without `http://` or `https://`) + - **Communicate Over SSL** → Enabled (Change this only if you know what you're doing) + - **Daemon Port** → `443` (Important! Coolify automatically forwards port `443 → 8443`) + + + +6. Navigate to the configuration tab of your node and **save the configuration** to a safe location. + + + +7. In Coolify, go to **Persistent Storages** and locate `config.yml`. + Replace the following values with those from your saved configuration: + + - `uuid` + - `token_id` + - `token` + - `api > ssl > cert` + - `api > ssl > key` + +8. Update your panel domain under `allowed_origins` to match your actual panel domain. + +9. Wait approximately 3–5 minutes for Wings to restart. + If the configuration was successful, the **About** section of your node should display your Daemon Version and other information. + +10. Your panel is now ready for use. + +### Option 2: Separate Panel and Wings Installation + +Best for distributed setups where Wings nodes run on different servers than the Panel. + +When installing **Wings** separately in Coolify with a reverse proxy, you cannot have it listen directly on port `443` inside the container. +Instead, configure it to use port `8443` internally, while Coolify forwards `443` to `8443`. +The **Pterodactyl Panel** should still be configured to use port `443` externally. + +**Steps:** + +1. **Generate the Wings config in the Panel** + - In the Pterodactyl Panel, create a node and download the `config.yml`. + - Configure the node with: + - **Hostname** (e.g., `host.example.com`, without `https://`) — not an IP address + - **Port**: `443` + - **Proxy setting enabled** + +2. **Update the config in Coolify** + - In your Coolify Wings service, open the **Persistent Storages** tab. + - You'll see `/etc/pterodactyl/config.yml` already present with a default template. + - Edit it directly, replacing the placeholders with values from the Panel-generated file. + - Change the `api.port` to `8443`: + ```yaml + api: + host: 0.0.0.0 + port: 8443 + ``` + +3. **Restart Wings** + - Once the changes are saved, restart the Wings container to apply the new settings. + +## Common Issues + +**Node not connecting** +- Ensure your node is configured to use port `443` in the Panel. +- Verify that Wings is configured to use port `8443` internally when using Coolify's reverse proxy. + +**Cannot access the server on the node** +- Confirm that you added your panel domain under `allowed_origins` in the Wings configuration. + +## Screenshots + +### Panel Interface + + + + + + + + +### Wings Node Management + + + + + +## Links + +- [The official website](https://pterodactyl.io) +- [GitHub Panel](https://github.com/pterodactyl/panel) +- [GitHub Wings](https://github.com/pterodactyl/wings) +- [Documentation](https://pterodactyl.io/project/introduction.html) +- [Community Discord](https://discord.gg/pterodactyl) diff --git a/content/docs/services/pydio-cells.mdx b/content/docs/services/pydio-cells.mdx new file mode 100644 index 00000000..db07df04 --- /dev/null +++ b/content/docs/services/pydio-cells.mdx @@ -0,0 +1,36 @@ +--- +title: "Pydio Cells" +description: "File sharing platform for organizations." +og: + description: "Host Pydio Cells on Coolify for collaborative Document Sharing and Management." +category: "File Sharing" +icon: "/docs/images/services/pydio.webp" +--- + + + +## What is Pydio Cells? + +Pydio Cells is an open source, self-hosted Document Sharing, Collaboration and Management platform specifically designed for organizations that need advanced document sharing and collaboration without security trade-offs or compliance issues. + +## Setup +Pydio Cells onboarding will ask you to enter database details: + + + +The database details can be found on Coolify dashboard: + + + + + + +On Coolify dashboard if you are seeing the database password as `${SERVICE_PASSWORD_MYSQL}` then go to the "environment variables" page check the value of `SERVICE_PASSWORD_MYSQL` + + + + +## Links + +- [The official website](https://www.pydio.com/en/pydio-cells?utm_source=coolify.io) +- [GitHub](https://github.com/pydio/cells?utm_source=coolify.io) diff --git a/content/docs/services/qbittorrent.mdx b/content/docs/services/qbittorrent.mdx new file mode 100644 index 00000000..0a7d0aa9 --- /dev/null +++ b/content/docs/services/qbittorrent.mdx @@ -0,0 +1,20 @@ +--- +title: Qbittorrent +description: "Free and open-source BitTorrent client." +og: + description: "Run qBittorrent on Coolify for torrent downloads, RSS automation, web UI, sequential downloading, and BitTorrent client management." +category: "Media" +icon: "/docs/images/services/qbittorrent-logo.svg" +--- + +# Qbittorrent + + + +## What is Qbittorrent + +The qBittorrent project aims to provide an open-source software alternative to μTorrent. + +## Links + +- [Official Documentation](https://docs.linuxserver.io/images/docker-qbittorrent/?utm_source=coolify.io) diff --git a/content/docs/services/qdrant.mdx b/content/docs/services/qdrant.mdx new file mode 100644 index 00000000..5801add3 --- /dev/null +++ b/content/docs/services/qdrant.mdx @@ -0,0 +1,19 @@ +--- +title: "Qdrant" +description: "Open source, AI-native vector database." +og: + description: "Deploy Qdrant vector database on Coolify for AI embeddings, semantic search, similarity matching, and high-performance vector storage." +category: "AI" +icon: "/docs/images/services/qdrant-logo.svg" +--- + + + +## What is Qdrant? + +Qdrant is an AI-native vector database and a semantic search engine. You can use it to extract meaningful information from unstructured data. + +## Links + +- [The official website](https://qdrant.tech/?utm_source=coolify.io) +- [GitHub](https://github.com/qdrant/qdrant?utm_source=coolify.io) diff --git a/content/docs/services/rabbitmq.mdx b/content/docs/services/rabbitmq.mdx new file mode 100644 index 00000000..869aa51d --- /dev/null +++ b/content/docs/services/rabbitmq.mdx @@ -0,0 +1,19 @@ +--- +title: "RabbitMQ" +description: "Open source message broker." +og: + description: "Host RabbitMQ message broker on Coolify for reliable messaging, queuing, routing, and distributed system communication with AMQP protocol." +category: "Development" +icon: "/docs/images/services/rabbitmq-logo.svg" +--- + + + +## What is RabbitMQ? + +RabbitMQ is an open-source message broker software that implements the Advanced Message Queuing Protocol (AMQP). It provides a messaging system that allows applications to communicate with each other using a messaging protocol. + +## Links + +- [The official website](https://rabbitmq.com) +- [GitHub](https://github.com/rabbitmq/rabbitmq-server) diff --git a/content/docs/services/radarr.mdx b/content/docs/services/radarr.mdx new file mode 100644 index 00000000..90b76938 --- /dev/null +++ b/content/docs/services/radarr.mdx @@ -0,0 +1,23 @@ +--- +title: "Radarr" +description: "A Media server software." +og: + description: "Automate movies on Coolify with Radarr for torrent/usenet downloads, quality management, metadata, and integration with download clients." +category: "Media" +icon: "/docs/images/services/radarr-logo.svg" +--- + + + +## What is Radarr? + +See all your upcoming movies in one convenient location. Manual Search Find all the releases, choose the one you want and send it right to your download client. + +## Screenshots + + + +## Links + +- [The official website](https://radarr.video/) +- [GitHub](https://github.com/Radarr/Radarr) diff --git a/content/docs/services/rallly.mdx b/content/docs/services/rallly.mdx new file mode 100644 index 00000000..c11dba7e --- /dev/null +++ b/content/docs/services/rallly.mdx @@ -0,0 +1,20 @@ +--- +title: Rallly +description: "Open-source meeting scheduling tool." +og: + description: "Schedule meetings on Coolify with Rallly for group polls, availability voting, and collaborative event planning without accounts required." +category: "Productivity" +icon: "/docs/images/services/rallly-logo.svg" +--- + +# Rallly + + + +## What is Rallly + +Rallly is an open-source scheduling and collaboration tool designed to make organizing events and meetings easier. + +## Links + +- [Official Documentation](https://support.rallly.co/self-hosting/introduction?utm_source=coolify.io) diff --git a/content/docs/services/reactive-resume.mdx b/content/docs/services/reactive-resume.mdx new file mode 100644 index 00000000..47a32bc1 --- /dev/null +++ b/content/docs/services/reactive-resume.mdx @@ -0,0 +1,21 @@ +--- +title: "Reactive Resume" +description: "A free and open source resume builder." +og: + description: "Build resumes on Coolify with Reactive Resume for free resume builder, templates, PDF export, and professional CV creation tool." +category: "Productivity" +icon: "/docs/images/services/rxresume-logo.svg" +--- + + + + + +## What is Reactive Resume? + +Reactive Resume is an open-source resume builder that allows you to create a professional resume in minutes. It provides a simple and intuitive interface that allows you to create a resume that stands out. + +## Links + +- [The official website](https://rxresu.me/) +- [GitHub](https://github.com/AmruthPillai/Reactive-Resume) diff --git a/content/docs/services/readeck.mdx b/content/docs/services/readeck.mdx new file mode 100644 index 00000000..36b6a091 --- /dev/null +++ b/content/docs/services/readeck.mdx @@ -0,0 +1,20 @@ +--- +title: Readeck +description: "Web article reader and bookmark manager." +og: + description: "Save articles on Coolify with Readeck for read-later service, bookmarking, full-text search, and distraction-free reading experience." +category: "Productivity" +icon: "/docs/images/services/readeck-logo.svg" +--- + +# Readeck + + + +## What is Readeck + +Simple web application that lets you save the precious readable content of web pages you like and want to keep forever. + +## Links + +- [Official Documentation](https://readeck.org/en/docs/?utm_source=coolify.io) diff --git a/content/docs/services/redis-insight.mdx b/content/docs/services/redis-insight.mdx new file mode 100644 index 00000000..47a804c0 --- /dev/null +++ b/content/docs/services/redis-insight.mdx @@ -0,0 +1,42 @@ +--- +title: "Redis Insight" +description: "Official Redis GUI that lets you do both GUI- and CLI-based interactions in a fully-featured desktop GUI client." +og: + description: "Here you can find the documentation for hosting Redis Insight with Coolify." +category: "Development" +icon: "/docs/images/services/redisinsight-logo.png" +--- + +# Redis Insight + + + +## What is Redis Insight? + +Redis Insight is the official GUI for Redis that lets you do both GUI- and CLI-based interactions in a fully-featured desktop GUI client. It provides intuitive tools for visualizing and optimizing data in Redis, making it easier to work with Redis databases through visual representations of your data structures, query performance analysis, and real-time monitoring. + +## How to connect to redis deployed through Coolify? +### 1. Connect To Predefined Network + +1. Go to the "General Configuration" page of Redis insight service +2. Enable the option "**Connect To Predefined Network**" + + + + +From Coolify v4.0.0-beta.455 onward, this option is on by default. +If you deployed Redis Insight earlier, manually enable "**Connect To Predefined Network**." + + + + +### 2. Get Redis URL + +1. Go to the "General Configuration" page of Redis database you deployed through Coolify. +2. Copy the "**Redis URL (Internal)**" and use it as database URL on Redis Insight dashboard + +## Links + +- [The official website](https://redis.io/insight?utm_source=coolify.io) +- [Documentation](https://redis.io/docs/latest/operate/redisinsight?utm_source=coolify.io) +- [GitHub](https://github.com/RedisInsight/RedisInsight?utm_source=coolify.io) diff --git a/content/docs/services/redlib.mdx b/content/docs/services/redlib.mdx new file mode 100644 index 00000000..bcb1a173 --- /dev/null +++ b/content/docs/services/redlib.mdx @@ -0,0 +1,20 @@ +--- +title: Redlib +description: "Private front-end for Reddit." +og: + description: "Browse Reddit on Coolify with Redlib alternative frontend for privacy-focused Reddit browsing without tracking or JavaScript requirements." +category: "Social Media" +icon: "/docs/images/services/redlib-logo.svg" +--- + +# Redlib + + + +## What is Redlib + +An alternative private front-end to Reddit, with its origins in Libreddit. + +## Links + +- [Official Documentation](https://github.com/redlib-org/redlib?utm_source=coolify.io) diff --git a/content/docs/services/redmine.mdx b/content/docs/services/redmine.mdx new file mode 100644 index 00000000..4a6455d9 --- /dev/null +++ b/content/docs/services/redmine.mdx @@ -0,0 +1,21 @@ +--- +title: "Redmine" +description: "Flexible project management web application." +og: + description: "Redmine is a flexible project management web application." +category: "Project Management" +icon: "/docs/images/services/redmine-logo.svg" +--- + +# Redmine + + + +## What is Redmine? + +Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database. + +## Links + +- [Official website](https://www.redmine.org/?utm_source=coolify.io) +- [Documentation](https://www.redmine.org/guide?utm_source=coolify.io) diff --git a/content/docs/services/rivet-engine.mdx b/content/docs/services/rivet-engine.mdx new file mode 100644 index 00000000..7f9227c7 --- /dev/null +++ b/content/docs/services/rivet-engine.mdx @@ -0,0 +1,96 @@ +--- +title: Rivet Engine +description: "Backend engine for running stateful actors at scale with automatic scaling and distributed state management." +og: + description: "Deploy Rivet Engine with Coolify for building and scaling stateful workloads with long-lived processes, durable state, and realtime capabilities." +category: "Development" +icon: "/docs/images/services/rivet-logo.svg" +--- + +# Rivet Engine +
+ + +## What is Rivet Engine? + +Rivet Engine is the backend engine that powers Rivet Actors at scale. It's an optional component of the Rivet ecosystem that provides enterprise-grade infrastructure for running stateful workloads with long-lived processes, durable state, and realtime capabilities. + +While you can use RivetKit (the TypeScript library) with a file system or memory driver for development, Rivet Engine provides production-ready infrastructure for: + +- **Automatic scaling** from zero to millions of concurrent actors +- **Distributed state management** with fast, in-memory state storage +- **Actor lifecycle management** with hibernation and instant wake-up +- **Built-in resilience** with automatic failover and recovery +- **Edge deployment** for low-latency global distribution + +Think of it as the production runtime that takes your RivetKit actors and scales them effortlessly across distributed infrastructure. + +### Key Features + +- **Production-Ready Scaling**: Automatically scale from zero to millions of concurrent actors with no cold starts +- **Distributed State Storage**: State is stored on the same machine as your compute for ultra-fast reads and writes with no database latency +- **Actor Lifecycle Management**: Actors automatically hibernate when idle and wake instantly on demand, only consuming resources when active +- **Built-In Realtime**: Native support for WebSockets and SSE for realtime state updates and broadcasting +- **Resilient Infrastructure**: Automatic failover and recovery with state integrity preservation +- **Edge-Ready**: Deploy actors close to users for instant interactions +- **Multi-Runtime Support**: Works with Node.js, Bun, Deno, and Cloudflare Workers +- **API Integration**: RESTful API for managing runners, actors, and namespaces +- **Built on Web Standards**: Uses standard HTTP, WebSockets, and SSE protocols + +### Use Cases + +Rivet Engine powers applications that require: + +- **AI Agents**: Durable AI assistants with persistent memory and realtime streaming capabilities +- **Realtime Collaboration**: Collaborative documents, whiteboards, and tools with CRDTs and realtime synchronization +- **Durable Workflows**: Multi-step workflows with automatic state management and recovery +- **Local-First Applications**: Offline-first apps with server-side synchronization and conflict resolution +- **Chatbots & Automation**: Discord, Slack, or autonomous bots with persistent conversation state +- **Per-User Databases**: Isolated data stores for each user with zero-latency access +- **Multiplayer Games**: Authoritative game servers with realtime state synchronization +- **Background Processing**: Scheduled and recurring jobs without external queue infrastructure +- **Rate Limiting**: Distributed rate limiting with in-memory counters and state + +### How It Works + +Rivet Engine provides a backend runtime that: + +1. **Manages Actors**: Coordinates actor lifecycle, hibernation, and wake-up across distributed infrastructure +2. **Handles State**: Stores actor state in memory for fast access, with persistent backup to storage backends +3. **Routes Requests**: Efficiently routes client requests to the correct actor instance +4. **Scales Dynamically**: Automatically spawns and destroys actor instances based on demand +5. **Ensures Resilience**: Monitors health and automatically recovers failed actors with state preservation + +### Integration with RivetKit + +Rivet Engine works seamlessly with RivetKit, the TypeScript library for building actors: + +- **Development**: Use RivetKit with file system or memory drivers for local development +- **Production**: Deploy to Rivet Engine for automatic scaling and enterprise features +- **Self-Hosted**: Run Rivet Engine on your own infrastructure for full control +- **Managed**: Use Rivet Cloud for 1-click deployment with managed infrastructure + +### Deployment Options + +Deploy Rivet Engine on: + +- **Self-Hosted** (Coolify, Docker, Kubernetes) +- **Cloud Platforms** (Vercel, Railway, AWS ECS, Google Cloud Run, Hetzner) +- **Rivet Cloud** (Managed, 1-click deployment) + +### Storage Backends + +Rivet Engine supports multiple storage backends for actor state: + +- PostgreSQL +- File System +- Memory (development/testing) +- Custom storage adapters + +## Links + +- [Official website ↗](https://www.rivet.dev/?utm_source=coolify.io) +- [GitHub (Engine) ↗](https://github.com/rivet-dev/rivet?utm_source=coolify.io) +- [GitHub (RivetKit) ↗](https://github.com/rivet-dev/rivetkit?utm_source=coolify.io) +- [Documentation ↗](https://www.rivet.dev/docs/?utm_source=coolify.io) +- [Discord Community ↗](https://rivet.dev/discord?utm_source=coolify.io) diff --git a/content/docs/services/rocketchat.mdx b/content/docs/services/rocketchat.mdx new file mode 100644 index 00000000..220719ff --- /dev/null +++ b/content/docs/services/rocketchat.mdx @@ -0,0 +1,25 @@ +--- +title: "Rocket.Chat" +description: "Open source team chat software." +og: + description: "Deploy Rocket.Chat on Coolify for team communication, video conferencing, file sharing, and open-source Slack alternative with federation." +category: "Communication" +icon: "/docs/images/services/rocketchat-logo.svg" +--- + + + +## What is Rocket.Chat? + +Rocket.Chat is an open-source team communication platform that allows you to communicate with your team in a secure and private way. It provides a simple and intuitive interface that allows you to communicate with your team in a secure and private way. + +## Screenshots + + + + + +## Links + +- [The official website](https://rocket.chat) +- [GitHub](https://github.com/RocketChat/Rocket.Chat) diff --git a/content/docs/services/rybbit.mdx b/content/docs/services/rybbit.mdx new file mode 100644 index 00000000..70ff1163 --- /dev/null +++ b/content/docs/services/rybbit.mdx @@ -0,0 +1,28 @@ +--- +title: "Rybbit" +description: "A lightweight, open-source web analytics tool that prioritizes user privacy by not using cookies." +og: + description: "Here you can find the documentation for hosting Rybbit with Coolify." +category: "Analytics" +icon: "/docs/images/services/rybbit.svg" +--- + +Rybbit + +## What is Rybbit? + +Rybbit is a next-gen, open source, lightweight, cookieless web & product analytics for everyone. + +## Configuration + +- set frontend URL. +- set backend URL to `$frontend_URL/api` and uncheck the "Strip Prefixes" option. + +# Screenshots + + + +## Links + +- [Official Website](https://www.rybbit.io/) +- [GitHub](https://github.com/rybbit-io/rybbit) diff --git a/content/docs/services/ryot.mdx b/content/docs/services/ryot.mdx new file mode 100644 index 00000000..c428d814 --- /dev/null +++ b/content/docs/services/ryot.mdx @@ -0,0 +1,19 @@ +--- +title: "Ryot" +description: "Self-hosted platform for tracking various facets of your life." +og: + description: "Track media on Coolify with Ryot for movies, TV shows, books, video games, exercises with ratings, reviews, and personal media database." +category: "Productivity" +icon: "/docs/images/services/ryot-logo.svg" +--- + + + +## What is Ryot? + +A self hosted platform for tracking various facets of your life - media, fitness etc. + +## Links + +- [The official website](https://ryot.io/?utm_source=coolify.io) +- [GitHub](https://github.com/ignisda/ryot?utm_source=coolify.io) diff --git a/content/docs/services/satisfactory.mdx b/content/docs/services/satisfactory.mdx new file mode 100644 index 00000000..e81310d3 --- /dev/null +++ b/content/docs/services/satisfactory.mdx @@ -0,0 +1,53 @@ +--- +title: "Satisfactory" +description: "Game server for Satisfactory open-world factory building game with a dash of exploration and combat." +og: + description: "Run Satisfactory server on Coolify for multiplayer gaming." +category: "Gaming" +icon: "" +--- + +# What is Satisfactory? + +Satisfactory is a first-person, open-world factory simulation game focused on building, automation, and exploration on an alien planet. Players, as "Capital Pioneers" for FICSIT Inc., explore, gather resources, and build massive, multi-story factories interconnected by conveyor belts to automate production. + +## Info + +The server may run on less than 8GB of RAM, though 8GB - 16GB is still recommended per the the [official wiki](https://satisfactory.wiki.gg/wiki/Dedicated_servers#Requirements?utm_source=coolify.io). You may need to increase the container's defined `--memory` restriction as you approach the late game (or if you're playing with many 4+ players) + +### Updating + +The game automatically updates when the container is started or restarted (unless you set `SKIPUPDATE=true`). + +### Environment Variables + +| Parameter | Default | Function | +|-------------------------|:---------:|:-----------------------------------------------------------| +| `AUTOSAVENUM` | `5` | number of rotating autosave files | +| `DEBUG` | `false` | for debugging the server | +| `DISABLESEASONALEVENTS` | `false` | disable the FICSMAS event (you miserable bastard) | +| `LOG` | `false` | disable Satisfactory log pruning | +| `MAXOBJECTS` | `2162688` | set the object limit for your server | +| `MAXPLAYERS` | `4` | set the player limit for your server | +| `MAXTICKRATE` | `30` | set the maximum sim tick rate for your server | +| `MULTIHOME` | `::` | set the server's listening interface (usually not needed) | +| `PGID` | `1000` | set the group ID of the user the server will run as | +| `PUID` | `1000` | set the user ID of the user the server will run as | +| `SERVERGAMEPORT` | `7777` | set the game's server port | +| `SERVERMESSAGINGPORT` | `8888` | set the game's messaging port (internally and externally) | +| `SERVERSTREAMING` | `true` | toggle whether the game utilizes asset streaming | +| `SKIPUPDATE` | `false` | avoid updating the game on container start/restart | +| `STEAMBETA` | `false` | set experimental game version | +| `STEAMBETAID` | - | set a custom beta game version (for testing) | +| `STEAMBETAKEY` | - | set password for the beta game version (for testing) | +| `TIMEOUT` | `30` | set client timeout (in seconds) | +| `VMOVERRIDE` | `false` | skips the CPU model check (should not ordinarily be used) | + +## Modding + +This game server allows modding +> Please refer to the github link below to know more about modding + +## Links + +- [GitHub](https://github.com/wolveix/satisfactory-server) diff --git a/content/docs/services/seafile.mdx b/content/docs/services/seafile.mdx new file mode 100644 index 00000000..6a46e94a --- /dev/null +++ b/content/docs/services/seafile.mdx @@ -0,0 +1,21 @@ +--- +title: "Seafile" +description: "High-performance file syncing and sharing with knowledge management features." +og: + description: "Sync files on Coolify with Seafile for secure cloud storage, team collaboration, file versioning, and enterprise-grade document management." +category: "Storage" +icon: "/docs/images/services/seafile-logo.svg" +--- + + + +## What is Seafile? + +Seafile is an open source cloud storage system for file sync, share and document collaboration. + +SeaDoc is an extension of Seafile that providing a lightweight online collaborative document feature. + +## Links + +- [The official website](https://www.seafile.com/en/home/?utm_source=coolify.io) +- [GitHub](https://github.com/haiwen/seafile?utm_source=coolify.io) diff --git a/content/docs/services/searxng.mdx b/content/docs/services/searxng.mdx new file mode 100644 index 00000000..ec67d028 --- /dev/null +++ b/content/docs/services/searxng.mdx @@ -0,0 +1,19 @@ +--- +title: "SearXNG" +description: "Open source search engine." +og: + description: "Search privately on Coolify with SearXNG metasearch engine aggregating results from 70+ sources without tracking or personalization." +category: "Search" +icon: "/docs/images/services/searxng-logo.svg" +--- + + + +## What is SearXNG? + +SearXNG is a free internet metasearch engine which aggregates results from various search services and databases. Users are neither tracked nor profiled. + +## Links + +- [The official website](https://docs.searxng.org/?utm_source=coolify.io) +- [GitHub](https://github.com/searxng/searxng?utm_source=coolify.io) diff --git a/content/docs/services/seaweedfs.mdx b/content/docs/services/seaweedfs.mdx new file mode 100644 index 00000000..25e77292 --- /dev/null +++ b/content/docs/services/seaweedfs.mdx @@ -0,0 +1,21 @@ +--- +title: "SeaweedFS" +description: "Simple and highly scalable distributed file system compatible with S3." +og: + description: "SeaweedFS is a simple and highly scalable distributed file system. Compatible with S3, with an admin web interface." +category: "Storage" +icon: "/docs/images/services/seaweedfs-logo.svg" +--- + +# SeaweedFS + + + +## What is SeaweedFS? + +SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, for billions of files! Blob store has O(1) disk seek, cloud tiering. Filer supports Cloud Drive, xDC replication, Kubernetes, POSIX FUSE mount, S3 API, S3 Gateway, Hadoop, WebDAV, encryption, Erasure Coding. Enterprise version is at seaweedfs.com. + +## Links + +- [Official website](https://seaweedfs.github.io/?utm_source=coolify.io) +- [GitHub](https://github.com/seaweedfs/seaweedfs?utm_source=coolify.io) diff --git a/content/docs/services/sequin.mdx b/content/docs/services/sequin.mdx new file mode 100644 index 00000000..c2814524 --- /dev/null +++ b/content/docs/services/sequin.mdx @@ -0,0 +1,21 @@ +--- +title: "Sequin" +description: "The fastest Postgres change data capture." +og: + description: "Stream database changes on Coolify with Sequin for CDC, event-driven architecture, webhooks, and real-time data synchronization workflows." +category: "Analytics" +icon: "/docs/images/services/sequin-logo.svg" +--- + +# Sequin + + + +## What is Sequin? + +Sequin is the fastest Postgres change data capture (CDC) solution that helps you sync data from your PostgreSQL database to other systems in real-time. It captures database changes and streams them to various destinations, making it perfect for building event-driven architectures, maintaining data consistency across services, and creating real-time analytics pipelines. + +## Links + +- [The official website](https://sequinstream.com?utm_source=coolify.io) +- [GitHub](https://github.com/sequinstream/sequin?utm_source=coolify.io) diff --git a/content/docs/services/sessy.mdx b/content/docs/services/sessy.mdx new file mode 100644 index 00000000..297c47bd --- /dev/null +++ b/content/docs/services/sessy.mdx @@ -0,0 +1,21 @@ +--- +title: "Sessy" +description: "Email observability platform for monitoring Amazon SES deliveries, bounces, and more." +og: + description: "Email observability platform for monitoring and analyzing email systems." +category: "Email" +icon: "/docs/images/services/sessy-logo.svg" +--- + +# Sessy + + + +## What is Sessy? + +Amazon SES is cost-effective and reliable, but lacks visibility into your emails. Sessy gives you a beautiful interface to track deliveries, bounces, opens, clicks and more. + +## Links + +- [Documentation](https://github.com/marckohlbrugge/sessy/blob/main/docs/docker-deployment.md?utm_source=coolify.io) +- [GitHub](https://github.com/marckohlbrugge/sessy?utm_source=coolify.io) diff --git a/content/docs/services/sftpgo.mdx b/content/docs/services/sftpgo.mdx new file mode 100644 index 00000000..ca5cc5ac --- /dev/null +++ b/content/docs/services/sftpgo.mdx @@ -0,0 +1,26 @@ +--- +title: "SFTPGo" +description: "Event-driven SFTP, FTP/S, HTTP/S and WebDAV server." +og: + description: "SFTPGo is an event-driven SFTP, FTP/S, HTTP/S and WebDAV server." +category: "File Management" +icon: "/docs/images/services/sftpgo-logo.png" +--- + +# SFTPGo + + + +## What is SFTPGo? + +SFTPGo is an event-driven file transfer solution. It support multiple protocols (SFTP, SCP, FTP/S, WebDAV, HTTP/S) and multiple storage backends. + +With SFTPGo you can leverage local and cloud storage backends for exchanging and storing files internally or with business partners using the same tools and processes you are already familiar with. + +The WebAdmin UI allows to easily create and manage your users, folders, groups and other resources. + +## Links + +- [Official website](https://sftpgo.com/?utm_source=coolify.io) +- [Documentation](https://docs.sftpgo.com/2.7/?utm_source=coolify.io) +- [GitHub](https://github.com/drakkan/sftpgo?utm_source=coolify.io) diff --git a/content/docs/services/shlink.mdx b/content/docs/services/shlink.mdx new file mode 100644 index 00000000..b4bdd8c9 --- /dev/null +++ b/content/docs/services/shlink.mdx @@ -0,0 +1,19 @@ +--- +title: "Shlink" +description: "The open source URL shortener." +og: + description: "Shorten URLs on Coolify with Shlink for branded short links, QR codes, analytics, and self-hosted URL shortener with REST API." +category: "Development" +icon: "/docs/images/services/shlink-logo.svg" +--- + + + +## What is Shlink? + +Shlink is an open-source URL shortener that allows you to create a short URL for your website. It provides a simple and intuitive interface that allows you to create a short URL for your website. + +## Links + +- [The official website](https://shlink.io) +- [GitHub](https://github.com/shlinkio/shlink) diff --git a/content/docs/services/signoz.mdx b/content/docs/services/signoz.mdx new file mode 100644 index 00000000..f30bbf55 --- /dev/null +++ b/content/docs/services/signoz.mdx @@ -0,0 +1,106 @@ +--- +title: SigNoz +description: "Open source observability platform native to OpenTelemetry with logs, traces, and metrics." +og: + description: "An observability platform native to OpenTelemetry with logs, traces and metrics." +category: "Monitoring" +icon: "/docs/images/services/signoz-logo.svg" +--- + +# SigNoz + + + +## What is SigNoz + +SigNoz is an open source observability platform native to OpenTelemetry with logs, traces and metrics. + +## Configuring SigNoz + +The following steps will guide you through the configuration of SigNoz once you have created the service in Coolify. + +### URLs configuration + +SigNoz being a whole observability platform, multiple ports need to be exposed for it to work. +The first one is the URL of the UI. You can find it in the "Service URL" field of the Signoz service, for example: `https://signoz.example.com:8080` + +Then, you need to expose the Otel Collector, a service which is responsible for receiving traces, metrics and logs from your applications and services. +It supports many different formats such as GRPC, HTTP formats, Prometheus metrics, and [many logs formats](https://signoz.io/docs/userguide/logs/) (FluentBit/FluentD, syslogs, logs from cloud services, ...). + +A different port is exposed for each receiver and we need to expose the relevant port for each receiver. +You have two strategies to do so: +- Configuring a different URL for each receiver. +- Directly exposing the ports to the host and the outside world. + +Which option you prefer depends on your security needs and how you structure your domains. + +#### One subdomain per receiver + +This solution only requires you to map your subdomain to the Otel Collector service. We will cover the two default receivers, the HTTP and GRPC receivers. + +1. Make sure your subdomains have been registered and point to your server, such as `https://signoz-grpc.example.com` and `https://signoz-http.example.com`. +2. Open the "Otel Collector" service settings. +3. Add your domains with the format `https://.example.com:`, separated by commas. For example: `https://signoz-grpc.example.com:4317,https://signoz-http.example.com:4318` + +If you want to expose additional ports / receivers, simply add a new address to the list. + +#### Exposing the ports on the host + +If you prefer to use a single domain for all receivers, you can edit the Docker Compose to directly expose the ports on the otel-collector container: + +```yaml +services: + # ... +otel-collector: + image: signoz/signoz-otel-collector:latest + container_name: signoz-otel-collector + # ... + ports: + - 4317:4317 # GRPC Collector + - 4318:4318 # HTTP Collector + + # ... +``` + +You can now append the port to your service URL to send data to receiver: `https://signoz.example.com:4318` + +### Enabling SMTP emailing + +SigNoz uses emailing for two things: inviting users and to [send alerts](https://signoz.io/docs/alerts/). + +#### SigNoz emails + +To enable SMTP emailing (including inviting new team members), you need to set the following variables from the Environment Variables tab of your Coolify service: + +- `SIGNOZ_EMAILING_ENABLED` enables emailing capabilities in SigNoz. +- `SIGNOZ_EMAILING_SMTP_ADDRESS` is the address of the SMTP server to use, in the format `host:port`. +- `SIGNOZ_EMAILING_SMTP_FROM` is the email address to use in the From field. +- `SIGNOZ_EMAILING_SMTP_AUTH_USERNAME` and `SIGNOZ_EMAILING_SMTP_AUTH_PASSWORD` are used to authenticate with the SMTP server. + +More environment variables are [available to use](https://signoz.io/docs/manage/administrator-guide/configuration/smtp-email-invitations/) to authenticate via Identity / Secret or use TLS instead of SmartTLS. Read [Passing environment variables not included in the template](https://coolify.io/docs/knowledge-base/environment-variables#developer-view)) to learn how to add them. + +#### Alert Manager emails + +Email alerts can only be sent if an SMTP server is configured specifically for the alert manager. The global SMTP configuration and the Alert Manager configuration use different environment variables. + +**Note**: SigNoz has a current known issue preventing email alerting configuration from being saved. You can track the progress of this [issue in their bug tracker](https://github.com/SigNoz/signoz/issues/8478). + +To enable email alerts, you need to set the following variables from the Environment Variables tab of your Coolify service: + +- `SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__SMARTHOST` is the address of the SMTP server to use, in the format `host:port`. +- `SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__FROM` is the email address to use in the From field. +- `SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__USERNAME` and `SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__PASSWORD` are used to authenticate with the SMTP server. + +More environment variables are [available to use](https://signoz.io/docs/manage/administrator-guide/configuration/alertmanager/) to authenticate via Identity / Secret or use TLS instead of SmartTLS. Read [Passing environment variables not included in the template](passing-environment-variables-not-included-in-the-template) to learn how to add them. + + +## Permission issue while using non root user + +The issue is mostly due to Coolify re-apply its user' ownership & chmod to the files mounted in the container. + +The solution here would be to make the files readable by everyone. Open a terminal on your server, go to `/data/coolify/services//` clickhouse and run the command `chmod o+r *`. This should allow Clickhouse to access the files as needed. + +## Links + +- [Official Documentation](https://signoz.io/docs/introduction/) +- [OpenTelemetry Documentation](https://opentelemetry.io/) diff --git a/content/docs/services/silverbullet.mdx b/content/docs/services/silverbullet.mdx new file mode 100644 index 00000000..96be1678 --- /dev/null +++ b/content/docs/services/silverbullet.mdx @@ -0,0 +1,19 @@ +--- +title: "SilverBullet" +description: "An open source personal productivity platform built on Markdown." +og: + description: "An open source personal productivity platform built on Markdown, turbo charged with the scripting power of Lua" +category: "Productivity" +icon: "/docs/images/services/silverbullet.png" +--- + + + +## What is SilverBullet? + +SilverBullet is an open source personal productivity platform built on Markdown, turbo charged with the scripting power of Lua. You self host it on your server, access it via any modern browser on any device (desktop, laptop, mobile). Since SilverBullet is built as a Local First PWA, it is fully offline capable. Temporarily don't have network access? No problem, SilverBullet will sync your content when you get back online. + +## Links + +- [The official website](https://silverbullet.md/) +- [GitHub](https://github.com/silverbulletmd/silverbullet) diff --git a/content/docs/services/siyuan.mdx b/content/docs/services/siyuan.mdx new file mode 100644 index 00000000..7dbf639e --- /dev/null +++ b/content/docs/services/siyuan.mdx @@ -0,0 +1,23 @@ +--- +title: "Siyuan" +description: "A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang." +og: + description: "A privacy-first, self-hosted, fully open source personal knowledge management software for organizing notes with block-based editing and bidirectional links." +category: "Productivity" +icon: "/docs/images/services/siyuan.svg" +--- + +# Siyuan + + + +## What is Siyuan? + +Siyuan is a privacy-first personal knowledge management system that supports complete offline usage, as well as end-to-end encrypted data sync. Built with TypeScript and Golang, it offers a unique block-based approach to note-taking that combines the flexibility of outlines with the power of bidirectional linking. + +The platform enables you to organize your thoughts and information using interconnected blocks, making it easy to build a comprehensive personal knowledge base. With features like local-first storage, end-to-end encryption, and cross-platform synchronization, Siyuan ensures your data remains private and accessible across all your devices. + +## Links + +- [Official website](https://b3log.org/siyuan/en/?utm_source=coolify.io) +- [GitHub](https://github.com/siyuan-note/siyuan?utm_source=coolify.io) \ No newline at end of file diff --git a/content/docs/services/slash.mdx b/content/docs/services/slash.mdx new file mode 100644 index 00000000..a4b3a312 --- /dev/null +++ b/content/docs/services/slash.mdx @@ -0,0 +1,20 @@ +--- +title: "Slash" +description: "Open-source, self-hosted links and notes manager." +og: + description: "Manage bookmarks on Coolify with Slash for self-hosted link shortener, collections, sharing, and personal URL management with tagging." +category: "Productivity" +icon: "/docs/images/services/slash-logo.svg" +--- + +## What is Slash? + +An open source, self-hosted platform for sharing and managing your most frequently used links. Easily create customizable, human-readable shortcuts to streamline your link management. + +## Screenshots + + + +## Links + +- [GitHub](https://github.com/yourselfhosted/slash) diff --git a/content/docs/services/snapdrop.mdx b/content/docs/services/snapdrop.mdx new file mode 100644 index 00000000..b1a7d34f --- /dev/null +++ b/content/docs/services/snapdrop.mdx @@ -0,0 +1,16 @@ +--- +title: "Snapdrop" +description: "Local file sharing in your browser." +og: + description: "Transfer files on Coolify with Snapdrop for local network file sharing, AirDrop-style transfers, and instant peer-to-peer file exchange." +category: "File Sharing" +icon: "/docs/images/services/snapdrop-logo.svg" +--- + +# What is Snapdrop? + +A self-hosted file-sharing service for secure and convenient file transfers, whether on a local network or the internet. + +## Links + +- [GitHub](https://github.com/RobinLinus/snapdrop) diff --git a/content/docs/services/soju.mdx b/content/docs/services/soju.mdx new file mode 100644 index 00000000..2fa6db01 --- /dev/null +++ b/content/docs/services/soju.mdx @@ -0,0 +1,22 @@ +--- +title: "Soju" +description: "User-friendly IRC bouncer with modern features." +og: + description: "Soju is a user-friendly IRC bouncer with a modern web interface." +category: "Communication" +icon: "/docs/images/services/soju-logo.svg" +--- + +# Soju + + + +## What is Soju? + +Soju is a user-friendly IRC bouncer. Soju connects to upstream IRC servers on behalf of the user to provide extra functionality. Soju supports many features such as multiple users, numerous IRCv3 extensions, chat history playback and detached channels. It is well-suited for both small and large deployments. + +## Links + +- [Official website](https://soju.im/?utm_source=coolify.io) +- [Documentation](https://codeberg.org/emersion/soju/src/branch/master/doc/getting-started.md?utm_source=coolify.io) +- [Codeberg](https://codeberg.org/emersion/soju/?utm_source=coolify.io) diff --git a/content/docs/services/soketi-app-manager.mdx b/content/docs/services/soketi-app-manager.mdx new file mode 100644 index 00000000..2ae9f540 --- /dev/null +++ b/content/docs/services/soketi-app-manager.mdx @@ -0,0 +1,26 @@ +--- +title: "Soketi App Manager" +description: "Manage Soketi apps with application configuration and WebSocket server administration interface." +og: + description: "Manage Soketi apps on Coolify with application configuration, authentication, and WebSocket server administration interface." +category: "Development" +icon: "/docs/images/services/soketi-app-manager-logo.webp" +--- + + + +## What is Soketi App Manager ? + +Soketi App Manager provides a user-friendly interface for managing your Soketi websocket applications. + +You can effortlessly manage multiple websocket applications, streamlining your app management process. + +## Screenshots + + +
+ + +## Links + +- [GitHub](https://github.com/rahulhaque/soketi-app-manager-filament?utm_source=coolify.io) diff --git a/content/docs/services/soketi.mdx b/content/docs/services/soketi.mdx new file mode 100644 index 00000000..8269958e --- /dev/null +++ b/content/docs/services/soketi.mdx @@ -0,0 +1,20 @@ +--- +title: Soketi +description: "Open-source WebSocket server." +og: + description: "Deploy Soketi WebSocket server on Coolify for real-time messaging, Pusher-compatible protocol, and scalable WebSocket broadcasting." +category: "Development" +icon: "/docs/images/services/soketi-logo.jpeg" +--- + +# Soketi + + + +## What is Soketi + +Soketi is your simple, fast, and resilient open-source WebSockets server. + +## Links + +- [Official Documentation](https://docs.soketi.app?utm_source=coolify.io) diff --git a/content/docs/services/sonarr.mdx b/content/docs/services/sonarr.mdx new file mode 100644 index 00000000..b28b3323 --- /dev/null +++ b/content/docs/services/sonarr.mdx @@ -0,0 +1,23 @@ +--- +title: "Sonarr" +description: "A internet PVR for Usenet and Torrents." +og: + description: "Automate TV shows on Coolify with Sonarr for torrent/usenet downloads, quality profiles, episode tracking, and media automation." +category: "Media" +icon: "/docs/images/services/sonarr-logo.svg" +--- + + + +## What is Sonarr? + +Sonarr is an internet PVR for Usenet and Torrents. Features Calendar See all your upcoming episodes in one convenient location. + +## Screenshots + + + +## Links + +- [The official website](https://sonarr.tv/) +- [GitHub](https://github.com/Sonarr/Sonarr) diff --git a/content/docs/services/sparkyfitness.mdx b/content/docs/services/sparkyfitness.mdx new file mode 100644 index 00000000..3614d135 --- /dev/null +++ b/content/docs/services/sparkyfitness.mdx @@ -0,0 +1,23 @@ +--- +title: "SparkyFitness" +description: "A comprehensive fitness app that helps users track nutrition, exercise, and body metrics." +og: + description: "Self-hosted alternative to MyFitnessPal with AI-powered nutrition assistance. Track nutrition, exercise, body measurements, and manage your fitness data with complete privacy." +category: "Health" +icon: "/docs/images/services/sparkyfitness.webp" +--- + +# SparkyFitness + + + +## What is SparkyFitness + +SparkyFitness is a comprehensive fitness tracking and management application designed to help users monitor their nutrition, exercise, and body measurements. It serves as a self-hosted alternative to MyFitnessPal with AI-powered nutrition assistance, giving you complete control over your fitness data. + +The application provides tools for daily progress tracking, goal setting, and insightful reports to support a healthy lifestyle with privacy and data ownership at its core. + +## Links + +- [Official Documentation ›](https://codewithcj.github.io/SparkyFitness?utm_source=coolify.io) +- [GitHub ›](https://github.com/CodeWithCJ/SparkyFitness?utm_source=coolify.io) diff --git a/content/docs/services/statusnook.mdx b/content/docs/services/statusnook.mdx new file mode 100644 index 00000000..8762eaf9 --- /dev/null +++ b/content/docs/services/statusnook.mdx @@ -0,0 +1,21 @@ +--- +title: "Statusnook" +description: "A status page system for your website." +og: + description: "Monitor status on Coolify with StatusNook for uptime monitoring, status pages, incident management, and service availability tracking." +category: "Monitoring" +icon: "/docs/images/services/statusnook-logo.svg" +--- + + + + + +## What is Statusnook? + +Statusnook allows you to effortlessly deploy a status page and start monitoring endpoints in minutes + +## Links + +- [The official website](https://statusnook.com) +- [GitHub](https://github.com/goksan/statusnook) diff --git a/content/docs/services/stirling-pdf.mdx b/content/docs/services/stirling-pdf.mdx new file mode 100644 index 00000000..3a2bc8c9 --- /dev/null +++ b/content/docs/services/stirling-pdf.mdx @@ -0,0 +1,19 @@ +--- +title: "Stirling PDF" +description: "Powerful PDF manipulation tool." +og: + description: "Process PDFs on Coolify with Stirling-PDF for merging, splitting, compression, conversion, OCR, and 50+ PDF manipulation operations." +category: "Documentation" +icon: "/docs/images/services/stirling-pdf-logo.png" +--- + + + +## What is Stirling PDF? + +A self-hosted PDF editor for secure and convenient file transfers, whether on a local network or the internet. + +## Links + +- [Official Website](https://stirlingpdf.com) +- [GitHub](https://github.com/Stirling-Tools/Stirling-PDF) diff --git a/content/docs/services/strapi.mdx b/content/docs/services/strapi.mdx new file mode 100644 index 00000000..e006eb71 --- /dev/null +++ b/content/docs/services/strapi.mdx @@ -0,0 +1,20 @@ +--- +title: Strapi +description: "Open-source headless CMS." +og: + description: "Build APIs on Coolify with Strapi headless CMS for content management, REST/GraphQL APIs, admin panel, and customizable backend platform." +category: "CMS" +icon: "/docs/images/services/strapi-logo.svg" +--- + +# Strapi + + + +## What is Strapi + +Open-source headless CMS to build powerful APIs with built-in content management. + +## Links + +- [Official Documentation](https://docs.strapi.io/?utm_source=coolify.io) diff --git a/content/docs/services/supabase.mdx b/content/docs/services/supabase.mdx new file mode 100644 index 00000000..404ffc86 --- /dev/null +++ b/content/docs/services/supabase.mdx @@ -0,0 +1,84 @@ +--- +title: "Supabase" +description: "Open source Firebase alternative." +og: + description: "Deploy Supabase on Coolify as open-source Firebase alternative with Postgres database, authentication, storage, and real-time subscriptions." +category: "Development" +icon: "/docs/images/services/supabase-logo.svg" +--- + + + +## What is Supabase? + +The open source Firebase alternative. + +## Screenshots + + + +## Notes + +You can find your anonymous key in the **Environment Variables** area under **SERVICE_SUPABASEANON_KEY**. + +## Public Port Access + + + + +There is a bug with making database publicly accessible. This bug will be fixed soon. In the meantime, you can use the following workaround: + + + + +Set **Supabase Db** to public + + + +Then + +Go to the **General** tab then **Edit Compose File** + +Then add this line +`ports: + - ${POSTGRES_PORT:-5432}:${POSTGRES_PORT:-5432}` + +To + +```yaml +supabase-db: + image: "supabase/postgres:15.6.1.146" + healthcheck: + test: "pg_isready -U postgres -h 127.0.0.1" + interval: 5s + timeout: 5s + retries: 10 + depends_on: + supabase-vector: + condition: service_healthy + ports: + - ${POSTGRES_PORT:-5432}:${POSTGRES_PORT:-5432} +``` + +And Restart + +> NOTE if you are changing the port to a different port altogether to update the POSTGRES_PORT in the Environment Variables + +## Opening ports with ufw-docker + +Finally, to allow external access to the PostgreSQL port in a Docker setup, you need to open the port in the firewall using the command: + +```bash +ufw route allow proto tcp from any to any port 5432 +``` + +This rule ensures traffic can reach your PostgreSQL database through the Docker network. For more information, read the docs from [ufw-docker](https://github.com/chaifeng/ufw-docker). + +### Using Hetzner's firewall UI + +If your server is hosted on Hetzner, you may not need ufw-docker. Instead, you can open the relevant database port (e.g., 5432) directly using [Hetzner's firewall UI](https://docs.hetzner.com/cloud/firewalls/overview). + +## Links + +- [Official Website](https://supabase.io) +- [GitHub](https://github.com/supabase/supabase) diff --git a/content/docs/services/superset.mdx b/content/docs/services/superset.mdx new file mode 100644 index 00000000..4d272ac3 --- /dev/null +++ b/content/docs/services/superset.mdx @@ -0,0 +1,60 @@ +--- +title: "Superset" +description: "Open-source data visualization and exploration platform." +og: + description: "Deploy Superset on Coolify for modern data exploration, interactive dashboards, SQL editor, and business intelligence visualization." +category: "Analytics" +icon: "/docs/images/services/superset-logo.svg" +--- + +# Superset + + + +## What is Superset? + +Superset is a modern data exploration and data visualization platform. Superset can replace or augment proprietary business intelligence tools for many teams. Superset integrates well with a variety of data sources. + +## Unofficial Docker Image + +By default, superset [does not support the use of docker-compose in production](https://github.com/amancevice/docker-superset). Coolify's superset template uses a [third-party, unofficial docker image created by amancevice](https://github.com/amancevice/docker-superset). + +## Usage + +### Initial Setup + +After deploying the template, you will need to initialise the database and create your admin user. This can be done as follows: + +1. Open a termianal session to the superset docker container + +2. Run one of the commands below, noting the `-` symbol: + + ```bash + # Basic initialisation + superset-init + + # Alternatively, to also load demo data, use + superset-demo + ``` + + the source code for these scripts are available [here](https://github.com/amancevice/docker-superset/tree/main/bin). + +3. Answer all questions in the prompts + +You can find the video instructions for this process in [Coolify's GitHub repository's pull request #4891](https://github.com/coollabsio/coolify/pull/4891). + +### Connecting to other Databases on Coolify Network + +If you wish to connect to databases hosted on Coolify, but external to the Superset service template, you will need to turn on the option: [Connect to Predefined Networks](https://coolify.io/docs/knowledge-base/docker/compose#connect-to-predefined-networks). + +### Configuring Superset + +Please refer to the [official documentation](https://superset.apache.org/docs/configuration/configuring-superset) for how you can tweak your `superset_config.py`. + +This python config file can be edited using Coolify's UI by navigating to your service's [Persistent Storage](https://coolify.io/docs/knowledge-base/persistent-storage) under the Configuration tab. + +## Links + +- [Official Website](https://superset.apache.org) +- [GitHub](https://github.com/apache/superset) +- [Github Unofficial Docker Image](https://github.com/amancevice/docker-superset) diff --git a/content/docs/services/supertokens.mdx b/content/docs/services/supertokens.mdx new file mode 100644 index 00000000..4a2e31c7 --- /dev/null +++ b/content/docs/services/supertokens.mdx @@ -0,0 +1,42 @@ +--- +title: Supertokens +description: "Open-source authentication solution." +og: + description: "Add authentication on Coolify with SuperTokens for login, session management, user administration, and Auth0 alternative SDKs." +category: "Security" +icon: "/docs/images/services/supertokens-logo.svg" +--- + +# Supertokens + + + +## What is Supertokens + +An open-source authentication solution that simplifies the implementation of secure user authentication and session management for web and mobile applications. + +## Deployment Variants + +SuperTokens is available in two deployment configurations in Coolify: + +### SuperTokens with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - SuperTokens container + - MySQL container + - Automatic database configuration and health checks + +### SuperTokens with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments with PostgreSQL preference +- **Components:** + - SuperTokens container + - PostgreSQL container + - Automatic database configuration and health checks + +Both variants provide equivalent functionality - choose based on your database preference or existing infrastructure. + +## Links + +- [Official Documentation](https://supertokens.com/docs/guides?utm_source=coolify.io) diff --git a/content/docs/services/sure.mdx b/content/docs/services/sure.mdx new file mode 100644 index 00000000..d7da2b32 --- /dev/null +++ b/content/docs/services/sure.mdx @@ -0,0 +1,20 @@ +--- +title: Sure +description: "An all-in-one personal finance platform." +og: + description: "Deploy Sure on Coolify, An all-in-one personal finance platform. Track, optimize, grow, and manage your money through every stage of life." +category: "Finance" +icon: "/docs/images/services/sure.png" +--- + +# Sure + + +## What is Sure +Sure is an all-in-one personal finance platform. Track, optimize, grow, and manage your money through every stage of life. + + +## Links +- [The official website](https://sure.am?utm_source=coolify.io) +- [GitHub](https://github.com/we-promise/sure?utm_source=coolify.io) +- [Community Discord](https://discord.com/invite/9ZNzc6yt?utm_source=coolify.io) diff --git a/content/docs/services/swetrix.mdx b/content/docs/services/swetrix.mdx new file mode 100644 index 00000000..19f059a1 --- /dev/null +++ b/content/docs/services/swetrix.mdx @@ -0,0 +1,29 @@ +--- +title: "Swetrix" +description: "Privacy-friendly and cookieless European web analytics alternative to Google Analytics." +og: + description: "Swetrix is a privacy-friendly and cookieless European web analytics alternative to Google Analytics." +category: "Analytics" +icon: "/docs/images/services/swetrix.svg" +--- + + + +## What is Swetrix? + +Swetrix is a privacy-friendly, cookieless and open-source web analytics alternative to Google Analytics. Designed to be intuitive and not intrusive to your users privacy, Swetrix offers web analytics with real-time data, website speed monitoring, errors tracking, session analytics, and more. + +## Screenshots + + + + + + + +## Links + +- [The official website](https://swetrix.com) +- [GitHub](https://github.com/swetrix/swetrix) +- [Documentation](https://docs.swetrix.com) +- [Community Discord](https://swetrix.com/discord) diff --git a/content/docs/services/syncthing.mdx b/content/docs/services/syncthing.mdx new file mode 100644 index 00000000..35041300 --- /dev/null +++ b/content/docs/services/syncthing.mdx @@ -0,0 +1,19 @@ +--- +title: "Syncthing" +description: "Open Source Continuous File Synchronization." +og: + description: "Sync files on Coolify with Syncthing for continuous file synchronization, P2P data replication, and decentralized backup across devices." +category: "File Management" +icon: "/docs/images/services/syncthing-logo.svg" +--- + + + +## What is Syncthing? + +Syncthing synchronizes files between two or more computers in real time. + +## Links + +- [Official Website](https://syncthing.net) +- [GitHub](https://github.com/syncthing/syncthing) diff --git a/content/docs/services/tailscale-client.mdx b/content/docs/services/tailscale-client.mdx new file mode 100644 index 00000000..4e379fe9 --- /dev/null +++ b/content/docs/services/tailscale-client.mdx @@ -0,0 +1,111 @@ +--- +title: "Tailscale Client" +description: "Zero-config WireGuard VPN client for secure mesh networking and encrypted connections." +og: + description: "Connect services securely with Tailscale on Coolify featuring WireGuard VPN, mesh networking, zero-config setup, and encrypted peer-to-peer connections." +category: "Networking" +icon: "/docs/images/services/tailscale-logo.svg" +--- + +# Tailscale Client + + + +## What is Tailscale Client? + +Tailscale securely connects your devices over the internet using WireGuard. It creates a secure mesh network between your devices, servers, and services with zero-configuration required. This client service allows your Coolify deployment to join your Tailscale network. + +## Features + +- Zero-config WireGuard VPN +- Secure mesh networking +- Encrypted peer-to-peer connections +- Cross-platform support +- Easy device management +- Access control lists +- MagicDNS for easy service discovery + +## Links + +- [Official Website](https://tailscale.com?utm_source=coolify.io) +- [Documentation](https://tailscale.com/kb?utm_source=coolify.io) +- [GitHub](https://github.com/tailscale/tailscale?utm_source=coolify.io) + + +## Firewall Considerations + +When using Tailscale together with Coolify, special attention must be paid to firewall rules — especially if you restrict SSH (port 22). + +Coolify relies on SSH (port 22) to manage deployments, even when communicating with the same host. Blocking port 22 without proper exceptions will break internal functionality. + +### Local Firewall (Host Machine) + +If you deny incoming traffic on port 22 (`deny all`), you must explicitly allow **internal traffic** from your local Docker or system networks. + +Example: + +- Allow port 22 from local subnets (Docker / internal interfaces) +- Typical ranges include: + + - `172.16.0.0/12` + - `192.168.0.0/16` + - `10.0.0.0/8` + +Example rule (conceptual): + +``` +ALLOW TCP 22 FROM 172.16.0.0/12 +ALLOW TCP 22 FROM 192.168.0.0/16 +ALLOW TCP 22 FROM 10.0.0.0/8 +DENY TCP 22 FROM ANY +``` + +Reason: + +- Coolify connects to itself via internal networking (Docker bridge or host interfaces) +- Without these rules, self-SSH connections fail + + +### Remote Server Firewall (Managed Servers) + +If Coolify deploys to external servers, similar logic applies: + +- You must allow SSH **only from the Coolify host** + +- Example: + +``` +ALLOW TCP 22 FROM +DENY TCP 22 FROM ANY +``` + +Notes: + +- Replace `` with the public or Tailscale IP of your Coolify instance +- This ensures: + + - Secure restricted SSH access + - Coolify can still deploy and manage services + + +### Tailscale Integration Notes + +When using Tailscale: + +- You can allow SSH via Tailscale IPs instead of public IPs +- Example: + +``` +ALLOW TCP 22 FROM 100.x.x.x/10 +``` + +Advantages: + +- No public exposure of SSH +- Encrypted peer-to-peer communication +- Simplified access control via Tailscale ACLs + + + + + diff --git a/content/docs/services/teable.mdx b/content/docs/services/teable.mdx new file mode 100644 index 00000000..c90a585a --- /dev/null +++ b/content/docs/services/teable.mdx @@ -0,0 +1,20 @@ +--- +title: Teable +description: "No-code database built on PostgreSQL." +og: + description: "Build databases on Coolify with Teable as Airtable alternative combining spreadsheet interface with database power and automation workflows." +category: "Database" +icon: "/docs/images/services/teable-logo.png" +--- + +# Teable + + + +## What is Teable + +Teable is a powerful visual interface built on relational databases (PostgreSQL). + +## Links + +- [Official Documentation](https://help.teable.io/?utm_source=coolify.io) diff --git a/content/docs/services/terraria-server.mdx b/content/docs/services/terraria-server.mdx new file mode 100644 index 00000000..a4449335 --- /dev/null +++ b/content/docs/services/terraria-server.mdx @@ -0,0 +1,34 @@ +--- +title: "Terraria Server" +description: "Docker multi-arch image for Terraria game server." +og: + description: "Host your own Terraria game server on Coolify for multiplayer adventures, world creation, and customizable gameplay." +category: "Gaming" +icon: "/docs/images/services/terraria.svg" +--- + +# Terraria Server + + + +## What is Terraria? + +Terraria is a 2D sandbox adventure game where you can dig, fight, explore, and build in a vast, procedurally generated world. Players can battle enemies, discover treasures, craft weapons and armor, and build structures in various biomes. + +## Environment Variables + +| Name | Description | Required | Default Value | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ---------------------- | +| AUTOCREATE | Creates a world if none is found in the path specified by -world. World size is specified by: 1(small), 2(medium), and 3(large). | yes | 2 | +| WORLDNAME | Sets the name of the world when using -autocreate. | yes | world1 | +| DIFFICULTY | Sets world difficulty when using autocreate. Options: 0(normal), 1(expert), 2(master), 3(journey) | yes | 1 | +| MAXPLAYERS | The maximum number of players allowed | yes | 8 | +| PASSWORD | Set a password for the server | yes | mypassword | +| MOTD | Set the server motto of the day text. | yes | Welcome to the server! | +| LANGUAGE | Sets the server language from its language code. Available codes: en/US = English de/DE = German it/IT = Italian fr/FR = French es/ES = Spanish ru/RU = Russian zh/Hans = Chinese pt/BR = Portuguese pl/PL = Polish | yes | en/US | +| SECURE | Option to prevent cheats. (1: no cheats or 0: cheats allowed) | yes | 1 | + +## Links + +- [Official Website](https://www.terraria.org/?utm_source=coolify.io) +- [GitHub](https://github.com/hexlo/terraria-server-docker?utm_source=coolify.io) diff --git a/content/docs/services/tolgee.mdx b/content/docs/services/tolgee.mdx new file mode 100644 index 00000000..70920d88 --- /dev/null +++ b/content/docs/services/tolgee.mdx @@ -0,0 +1,21 @@ +--- +title: "Tolgee" +description: "Open source localization platform." +og: + description: "Localize apps on Coolify with Tolgee for translation management, in-context editing, collaboration, and internationalization platform." +category: "Development" +icon: "/docs/images/services/tolgee-logo.svg" +--- + +# What is Tolgee? + +Tolgee is an open-source translation management platform that allows you to manage your translations in a centralized and collaborative way. + +## Screenshots + + + +## Links + +- [Official Website](https://tolgee.io) +- [GitHub](https://github.com/tolgee/tolgee-platform) diff --git a/content/docs/services/traccar.mdx b/content/docs/services/traccar.mdx new file mode 100644 index 00000000..99c31ce4 --- /dev/null +++ b/content/docs/services/traccar.mdx @@ -0,0 +1,20 @@ +--- +title: Traccar +description: "Open-source GPS tracking platform." +og: + description: "Track GPS on Coolify with Traccar for vehicle tracking, geofencing, reports, notifications, and fleet management with 170+ protocols." +category: "IoT" +icon: "/docs/images/services/traccar-logo.png" +--- + +# Traccar + + + +## What is Traccar + +Traccar is a free and open source modern GPS tracking system. + +## Links + +- [Official Documentation](https://www.traccar.org/documentation/?utm_source=coolify.io) diff --git a/content/docs/services/trailbase.mdx b/content/docs/services/trailbase.mdx new file mode 100644 index 00000000..8c03f5f6 --- /dev/null +++ b/content/docs/services/trailbase.mdx @@ -0,0 +1,24 @@ +--- +title: "TrailBase" +description: "Blazingly fast Rust/SQLite/Wasmtime app server with type-safe APIs." +og: + description: "A blazingly fast Rust/SQLite/Wasmtime app server with type-safe APIs" +category: "Development" +icon: "/docs/images/services/trailbase-logo.svg" +--- + +# TrailBase + + + +## What is TrailBase? + +An open, blazingly fast, single-executable Firebase alternative with type-safe REST & realtime APIs, built-in WebAssembly runtime, SSR, auth and admin UI built on Rust, SQLite & Wasmtime. + +Simplify with fewer moving parts: an easy to self-host single-executable with everything you need to focus on your mobile, web or desktop application. Sub-millisecond latencies eliminate the need for dedicated caches, no more stale or inconsistent data. + +## Links + +- [Official website](https://trailbase.io/?utm_source=coolify.io) +- [Documentation](https://trailbase.io/getting-started/install/?utm_source=coolify.io) +- [GitHub](https://github.com/trailbaseio/trailbase?utm_source=coolify.io) diff --git a/content/docs/services/transmission.mdx b/content/docs/services/transmission.mdx new file mode 100644 index 00000000..183bd6b4 --- /dev/null +++ b/content/docs/services/transmission.mdx @@ -0,0 +1,20 @@ +--- +title: Transmission +description: "Fast, easy, and free BitTorrent client." +og: + description: "Download torrents on Coolify with Transmission for lightweight BitTorrent client, web interface, encryption, and remote control." +category: "Media" +icon: "/docs/images/services/transmission-logo.svg" +--- + +# Transmission + + + +## What is Transmission + +Fast, easy, and free BitTorrent client. + +## Links + +- [Official Documentation](https://docs.linuxserver.io/images/docker-transmission/?utm_source=coolify.io) diff --git a/content/docs/services/trigger.mdx b/content/docs/services/trigger.mdx new file mode 100644 index 00000000..0f50cb79 --- /dev/null +++ b/content/docs/services/trigger.mdx @@ -0,0 +1,38 @@ +--- +title: "Trigger" +description: "Open-source workflow automation tool." +og: + description: "Automate workflows on Coolify with Trigger.dev for background jobs, scheduled tasks, webhooks, and event-driven workflow automation." +category: "Automation" +icon: "/docs/images/services/trigger-logo.png" +--- + + + +## What is Trigger? + +Trigger is an open source Background Jobs framework for TypeScript. + +## Deployment Variants + +Trigger.dev is available in two deployment configurations in Coolify: + +### Trigger.dev (Default) +- **Database:** Built-in PostgreSQL +- **Use case:** Standard deployments with managed database +- **Components:** + - Trigger.dev container + - Built-in PostgreSQL container + - Automatic database configuration and health checks + +### Trigger.dev with External Database +- **Database:** External (user-provided) +- **Use case:** Advanced deployments with existing database infrastructure or custom database configurations +- **Components:** + - Trigger.dev container + - Requires `DATABASE_URL` environment variable pointing to your external database + +## Links + +- [Official Website](https://trigger.dev) +- [GitHub](https://github.com/triggerdotdev/trigger.dev) diff --git a/content/docs/services/triliumnext.mdx b/content/docs/services/triliumnext.mdx new file mode 100644 index 00000000..865defba --- /dev/null +++ b/content/docs/services/triliumnext.mdx @@ -0,0 +1,20 @@ +--- +title: "TriliumNext" +description: "Build your personal knowledge base with TriliumNext Notes." +og: + description: "Organize notes on Coolify with TriliumNext for hierarchical note-taking, scripting, encryption, and powerful knowledge management features." +category: "Productivity" +icon: "/docs/images/services/triliumnext-logo.svg" +--- + +# TriliumNext + + + +## What is TriliumNext? + +TriliumNext is a hierarchical note taking application that helps you build your personal knowledge base. It features a tree-like structure for organizing notes, supports rich text editing, code snippets, images, and file attachments. TriliumNext includes powerful features like full-text search, note linking, scripting capabilities, and synchronization across multiple devices, making it ideal for personal knowledge management and documentation. + +## Links + +- [GitHub](https://github.com/TriliumNext/Trilium?utm_source=coolify.io) diff --git a/content/docs/services/twenty.mdx b/content/docs/services/twenty.mdx new file mode 100644 index 00000000..0db3539c --- /dev/null +++ b/content/docs/services/twenty.mdx @@ -0,0 +1,22 @@ +--- +title: "Twenty" +description: "Open-source CRM designed to fit your unique business needs." +og: + description: "An open-source CRM designed to fit your unique business needs." +category: "Business" +icon: "/docs/images/services/twenty-logo.svg" +--- + +# Twenty + + + +## What is Twenty? + +Twenty is an open-source CRM that gives you the building blocks to create exactly what your business needs. + +## Links + +- [Official website](https://twenty.com/?utm_source=coolify.io) +- [Documentation](https://docs.twenty.com/user-guide/introduction?utm_source=coolify.io) +- [GitHub](https://github.com/twentyhq/twenty?utm_source=coolify.io) diff --git a/content/docs/services/typesense.mdx b/content/docs/services/typesense.mdx new file mode 100644 index 00000000..9685d9ad --- /dev/null +++ b/content/docs/services/typesense.mdx @@ -0,0 +1,24 @@ +--- +title: "Typesense" +description: "Open source alternative to Algolia and easier-to-use alternative to ElasticSearch." +og: + description: "Search instantly on Coolify with Typesense for typo-tolerant search engine, faceting, filtering, and lightning-fast full-text search API." +category: "Search" +icon: "/docs/images/services/typesense-logo.png" +--- + + + +## What is Typesense? + +Typesense is an open-source, typo-tolerant search engine optimized for instant (typically sub-50ms) search-as-you-type experiences and developer productivity. + +If you've heard about ElasticSearch or Algolia, a good way to think about Typesense is that it is: + +- An open source alternative to Algolia, with some key quirks solved and +- An easier-to-use batteries-included alternative to ElasticSearch + +## Links + +- [The official website](https://typesense.org/?utm_source=coolify.io) +- [GitHub](https://github.com/typesense/typesense?utm_source=coolify.io) diff --git a/content/docs/services/umami.mdx b/content/docs/services/umami.mdx new file mode 100644 index 00000000..f674d591 --- /dev/null +++ b/content/docs/services/umami.mdx @@ -0,0 +1,27 @@ +--- +title: "Umami" +description: "A lightweight, open-source web analytics tool that prioritizes user privacy by not using cookies." +og: + description: "Track analytics on Coolify with Umami for privacy-focused website analytics, visitor insights, and cookieless web traffic monitoring." +category: "Analytics" +icon: "/docs/images/services/umami-logo.svg" +--- + + + +## What is Umami? + +Umami is an open source, privacy-focused alternative to Google Analytics. + +## Screenshots + + + + + + + +## Links + +- [Official Website](https://umami.is) +- [GitHub](https://github.com/umami-software/umami) diff --git a/content/docs/services/unleash.mdx b/content/docs/services/unleash.mdx new file mode 100644 index 00000000..35b0b2b4 --- /dev/null +++ b/content/docs/services/unleash.mdx @@ -0,0 +1,44 @@ +--- +title: "Unleash" +description: "Open-source feature management platform." +og: + description: "Manage features on Coolify with Unleash for feature toggles, A/B testing, gradual rollouts, and enterprise feature flag management." +category: "Development" +icon: "/docs/images/services/unleash-logo.svg" +--- + + + + + +## What is Unleash? + +Unleash is an open source feature flagging service. + +## Deployment Variants + +Unleash is available in two deployment configurations in Coolify: + +### Unleash with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Standard deployments with managed database +- **Components:** + - Unleash container + - PostgreSQL container + - Automatic database configuration and health checks + +### Unleash without Database +- **Database:** External (user-provided) +- **Use case:** Advanced deployments with existing database infrastructure or custom database configurations +- **Components:** + - Unleash container + - Requires external database connection configuration + +## Screenshots + + + +## Links + +- [Official Website](https://getunleash.io) +- [GitHub](https://github.com/unleash/unleash) diff --git a/content/docs/services/unstructured.mdx b/content/docs/services/unstructured.mdx new file mode 100644 index 00000000..00c75a10 --- /dev/null +++ b/content/docs/services/unstructured.mdx @@ -0,0 +1,28 @@ +--- +title: "Unstructured" +description: "Open-source platform and tools to ingest and process unstructured documents for Retrieval Augmented Generation (RAG) and model fine-tuning." +og: + description: "Extract data on Coolify with Unstructured.io for document parsing, PDFs, images, HTML, and ML-ready data preprocessing pipelines." +category: "AI" +icon: "/docs/images/services/unstructured-logo.png" +--- + +# What is Unstructured? + +Unstructured provides a platform and tools to ingest and process unstructured documents for Retrieval Augmented Generation (RAG) and model fine-tuning. + +## Videos + + + +## Links + +- [GitHub](https://github.com/Unstructured-IO/unstructured-api?utm_source=coolify.io) diff --git a/content/docs/services/uptime-kuma.mdx b/content/docs/services/uptime-kuma.mdx new file mode 100644 index 00000000..5afd412e --- /dev/null +++ b/content/docs/services/uptime-kuma.mdx @@ -0,0 +1,20 @@ +--- +title: "Uptime Kuma" +description: "A fancy self-hosted monitoring tool." +og: + description: "Monitor uptime on Coolify with Uptime Kuma for status pages, notifications, SSL checks, and beautiful server monitoring dashboard." +category: "Monitoring" +icon: "/docs/images/services/uptime-kuma-logo.svg" +--- + +# What is Uptime Kuma? + +Uptime Kuma is an easy-to-use, privacy-focused uptime monitoring service. + +## Screenshots + + + +## Links + +- [GitHub](https://github.com/louislam/uptime-kuma?tab=readme-ov-file) diff --git a/content/docs/services/usesend.mdx b/content/docs/services/usesend.mdx new file mode 100644 index 00000000..e5792c61 --- /dev/null +++ b/content/docs/services/usesend.mdx @@ -0,0 +1,125 @@ +--- +title: Usesend +description: "Open-source email recall service." +og: + description: "useSend is an open source alternative to Resend, Sendgrid, Mailgun and Postmark etc." +category: "Email" +icon: "/docs/images/services/usesend-logo.svg" +--- + +# Usesend + + + +## What is Usesend + +Usesend is an open-source alternative to Resend, Sendgrid, Mailgun and Postmark etc. Previously known as unsend. + +There are some setup to be made, please refer to the [official documentation](https://docs.usesend.com/self-hosting/overview?utm_source=coolify.io) for more information. + +## Screenshots + + + +## SMTP Configuration + +Running Usesend with SMTP support requires an additional relay component to handle incoming SMTP requests. This relay service binds to multiple ports supporting both SSL and TLS connections. + +### Prerequisites + +Before configuring the SMTP relay, you need to add a certificate dumper to your Traefik proxy configuration to make Coolify's SSL certificates accessible to the relay: + +1. Navigate to **Server** → **Proxy** → **Configuration** +2. Add the following certificate dumper configuration: + +```yaml +traefik-certs-dumper: + image: ghcr.io/kereis/traefik-certs-dumper:latest + container_name: traefik-certs-dumper + restart: unless-stopped + depends_on: + - traefik + volumes: + - /etc/localtime:/etc/localtime:ro + - /data/coolify/proxy:/traefik:ro + - /data/coolify/certs:/output +``` + +This service extracts Traefik-managed certificates and outputs them to `/data/coolify/certs/`, making them available for the SMTP relay to use for SSL and TLS connections. + +### Adding the SMTP Relay Service + +Add the following service at the end of the compose file (by clicking on "Edit compose file" when adding the service): + + + + +Replace `###USESEND FQDN (e.g. usesend.example.com)###` with your unsend domain name in the configuration below. + + + +```yaml + smtp-server: + container_name: usesend-smtp-server + image: 'usesend/smtp-proxy:latest' + volumes: + - type: bind + source: /data/coolify/certs/###USESEND FQDN (e.g. usesend.example.com)###/key.pem + target: /data/certs/key.pem + read_only: true + - type: bind + source: /data/coolify/certs/###USESEND FQDN (e.g. usesend.example.com)###/cert.pem + target: /data/certs/cert.pem + read_only: true + environment: + - SMTP_AUTH_USERNAME=usesend + - SERVICE_FQDN_SMTP + - 'USESEND_BASE_URL=${SERVICE_URL_USESEND_3000}' + - USESEND_API_KEY_PATH=/data/certs/key.pem + - USESEND_API_CERT_PATH=/data/certs/cert.pem + ports: + - '25:25' + - '587:587' + - '2587:2587' + - '465:465' + - '2465:2465' + healthcheck: + test: + - CMD + - nc + - -z + - localhost + - "25" + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s +``` + +Then add those environment variables to the main Usesend service: + +```yaml + - SMTP_HOST=${SERVICE_FQDN_SMTP} + - SMTP_USER=${SMTP_AUTH_USERNAME} +``` + +### Using Usesend SMTP in Your Applications + +Once the relay is deployed, configure your sending applications with the following settings: + +- **SMTP Host**: Your Usesend URL +- **SMTP Port**: 465 (SSL) or 587 (TLS/STARTTLS) +- **Username**: `usesend` +- **Password**: Your Usesend API key (generated from the Usesend dashboard) + +The relay supports multiple ports for compatibility with different applications: +- **Standard SMTP**: Ports 25, 587, 2587 +- **SSL/TLS**: Ports 465, 2465 + +You can verify that emails are being sent successfully through Usesend's deliverability reports and message previews in the dashboard. + +## Links + +- [Official Documentation](https://docs.usesend.com/self-hosting/overview?utm_source=coolify.io) +- [Official Website ↗](https://usesend.com?utm_source=coolify.io) +- [GitHub ↗](https://github.com/usesend/usesend) diff --git a/content/docs/services/vaultwarden.mdx b/content/docs/services/vaultwarden.mdx new file mode 100644 index 00000000..25960dcd --- /dev/null +++ b/content/docs/services/vaultwarden.mdx @@ -0,0 +1,18 @@ +--- +title: "Vaultwarden" +description: "Unofficial Bitwarden compatible server." +og: + description: "Store passwords on Coolify with Vaultwarden unofficial Bitwarden server for encrypted password vaults, 2FA, and credential management." +category: "Security" +icon: "/docs/images/services/vaultwarden-logo.svg" +--- + + + +## What is Vaultwarden? + +Vaultwarden is an open source, self-hosted password manager. + +## Links + +- [GitHub](https://github.com/dani-garcia/vaultwarden) diff --git a/content/docs/services/vert.mdx b/content/docs/services/vert.mdx new file mode 100644 index 00000000..bb5f5eb9 --- /dev/null +++ b/content/docs/services/vert.mdx @@ -0,0 +1,19 @@ +--- +title: "Vert" +description: "Self-hosted file converter." +og: + description: "Deploy Vert.x on Coolify for reactive applications, microservices, event-driven architecture, and polyglot JVM framework development." +category: "Utilities" +icon: "/docs/images/services/vert-logo.png" +--- + + + +## What is Vert? + +VERT is a file conversion utility that uses WebAssembly to convert files on your device instead of a cloud. + +## Links + +- [The official website](https://vert.sh/?utm_source=coolify.io) +- [GitHub](https://github.com/VERT-sh/VERT?utm_source=coolify.io) diff --git a/content/docs/services/vikunja.mdx b/content/docs/services/vikunja.mdx new file mode 100644 index 00000000..9f58ff37 --- /dev/null +++ b/content/docs/services/vikunja.mdx @@ -0,0 +1,40 @@ +--- +title: "Vikunja" +description: "The open-source to-do app." +og: + description: "Manage tasks on Coolify with Vikunja for to-do lists, kanban boards, gantt charts, calendars, and team project organization." +category: "Productivity" +icon: "/docs/images/services/vikunja-logo.svg" +--- + + + +## What is Vikunja? + +Vikunja is an open source, self-hosted, task management application. + +## Deployment Variants + +Vikunja is available in two deployment configurations in Coolify: + +### Vikunja (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal task management +- **Components:** Single Vikunja container with built-in SQLite database + +### Vikunja with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance, concurrent access, and scalability +- **Components:** + - Vikunja container + - PostgreSQL container + - Automatic database configuration and health checks + +## Screenshots + + + +## Links + +- [Official Website](https://vikunja.io) +- [GitHub](https://github.com/go-vikunja/vikunja) diff --git a/content/docs/services/vvveb.mdx b/content/docs/services/vvveb.mdx new file mode 100644 index 00000000..54165a3d --- /dev/null +++ b/content/docs/services/vvveb.mdx @@ -0,0 +1,45 @@ +--- +title: Vvveb +description: "Powerful website builder with drag and drop functionality." +og: + description: "Build websites on Coolify with VvvebJs drag-and-drop website builder, templates, and visual web design tool without coding required." +category: "Development" +icon: "/docs/images/services/vvveb-logo.png" +--- + +# Vvveb + + + +## What is Vvveb + +Powerful and easy to use cms to build websites, blogs or ecommerce stores. + +## Deployment Variants + +Vvveb is available in three deployment configurations in Coolify: + +### Vvveb (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or small websites +- **Components:** Single Vvveb container with built-in SQLite database + +### Vvveb with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - Vvveb container + - MySQL container + - Automatic database configuration and health checks + +### Vvveb with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference +- **Components:** + - Vvveb container + - MariaDB container + - Automatic database configuration and health checks + +## Links + +- [Official Documentation](https://docs.vvveb.com?utm_source=coolify.io) diff --git a/content/docs/services/wakapi.mdx b/content/docs/services/wakapi.mdx new file mode 100644 index 00000000..58944295 --- /dev/null +++ b/content/docs/services/wakapi.mdx @@ -0,0 +1,20 @@ +--- +title: Wakapi +description: "Open-source coding activity tracker." +og: + description: "Track coding time on Coolify with Wakapi for WakaTime-compatible time tracking, statistics, and developer productivity analytics." +category: "Development" +icon: "/docs/images/services/wakapi-logo.svg" +--- + +# Wakapi + + + +## What is Wakapi + +A minimalist, self-hosted WakaTime-compatible backend for coding statistics + +## Links + +- [Official Documentation](https://wakapi.dev/?utm_source=coolify.io) diff --git a/content/docs/services/weaviate.mdx b/content/docs/services/weaviate.mdx new file mode 100644 index 00000000..31f26085 --- /dev/null +++ b/content/docs/services/weaviate.mdx @@ -0,0 +1,19 @@ +--- +title: "Weaviate" +description: "Open source, AI-native vector database." +og: + description: "Deploy Weaviate vector database on Coolify for AI-powered search, semantic understanding, ML model integration, and knowledge graphs." +category: "AI" +icon: "/docs/images/services/weaviate-logo.webp" +--- + + + +## What is Weaviate? + +Weaviate (we-vee-eight) is an open source, AI-native vector database. Use this documentation to get started with Weaviate and to learn how to get the most out of Weaviate's features. + +## Links + +- [The official website](https://weaviate.io/?utm_source=coolify.io) +- [GitHub](https://github.com/weaviate/weaviate?utm_source=coolify.io) diff --git a/content/docs/services/web-check.mdx b/content/docs/services/web-check.mdx new file mode 100644 index 00000000..bba05232 --- /dev/null +++ b/content/docs/services/web-check.mdx @@ -0,0 +1,20 @@ +--- +title: Web Check +description: "All-in-one website analysis tool." +og: + description: "Analyze websites on Coolify with Web-Check for SSL, DNS, headers, security, performance audits, and comprehensive site investigation." +category: "Development" +icon: "/docs/images/services/webcheck-logo.png" +--- + +# Web Check + + + +## What is Web Check + +All-in-one OSINT tool for analysing any website + +## Links + +- [Official Documentation](https://github.com/lissy93/web-check?utm_source=coolify.io) diff --git a/content/docs/services/weblate.mdx b/content/docs/services/weblate.mdx new file mode 100644 index 00000000..20111423 --- /dev/null +++ b/content/docs/services/weblate.mdx @@ -0,0 +1,23 @@ +--- +title: "Weblate" +description: "Web-based translation tool." +og: + description: "Translate software on Coolify with Weblate for continuous localization, collaboration, version control, and open-source translation management." +category: "Development" +icon: "/docs/images/services/weblate-logo.webp" +--- + + + +## What is Weblate? + +Weblate is an open source, self-hosted, translation management system. + +## Screenshots + + + +## Links + +- [Official Website](https://weblate.org) +- [GitHub](https://github.com/WeblateOrg/weblate) diff --git a/content/docs/services/whoogle.mdx b/content/docs/services/whoogle.mdx new file mode 100644 index 00000000..9e876b8a --- /dev/null +++ b/content/docs/services/whoogle.mdx @@ -0,0 +1,18 @@ +--- +title: "Whoogle" +description: "Self-hosted, ad-free, privacy-respecting metasearch engine." +og: + description: "Search Google privately on Coolify with Whoogle for anonymous Google searches without tracking, ads, or AMP with self-hosted proxy." +category: "Search" +icon: "/docs/images/services/whoogle-logo.png" +--- + + + +## What is Whoogle? + +Whoogle is an open source, self-hosted, privacy-respecting, ad-free, and de-googled search engine. + +## Links + +- [GitHub](https://github.com/benbusby/whoogle-search) diff --git a/content/docs/services/wikijs.mdx b/content/docs/services/wikijs.mdx new file mode 100644 index 00000000..c78e2afe --- /dev/null +++ b/content/docs/services/wikijs.mdx @@ -0,0 +1,20 @@ +--- +title: Wikijs +description: "Modern and powerful wiki software built on Node.js." +og: + description: "Deploy Wiki.js on Coolify for modern wiki with markdown, Git sync, powerful search, and beautiful documentation platform interface." +category: "Documentation" +icon: "/docs/images/services/wikijs-logo.svg" +--- + +# Wikijs + + + +## What is Wikijs + +The most powerful and extensible open source Wiki software. + +## Links + +- [Official Documentation](https://docs.requarks.io?utm_source=coolify.io) diff --git a/content/docs/services/windmill.mdx b/content/docs/services/windmill.mdx new file mode 100644 index 00000000..dda87862 --- /dev/null +++ b/content/docs/services/windmill.mdx @@ -0,0 +1,27 @@ +--- +title: "Windmill" +description: "Open-source developer platform." +og: + description: "Build workflows on Coolify with Windmill for scripts, flows, UIs, and developer-centric workflow automation with TypeScript/Python." +category: "Development" +icon: "/docs/images/services/windmill-logo.svg" +--- + + + +## What is Windmill? + +Windmill is an open-source developer platform to power your entire infra and turn scripts into webhooks, workflows and UIs. Fastest workflow engine (13x vs Airflow). Open-source alternative to Retool and Temporal. + +## Screenshots + + + + + + + +## Links + +- [Official Website](https://windmill.dev) +- [GitHub](https://github.com/windmill-labs/windmill) diff --git a/content/docs/services/wings.mdx b/content/docs/services/wings.mdx new file mode 100644 index 00000000..38486390 --- /dev/null +++ b/content/docs/services/wings.mdx @@ -0,0 +1,23 @@ +--- +title: "Wings" +description: "Pterodactyl server control daemon for standalone game server node deployments." +og: + description: "The server control plane for Pterodactyl Panel. Written from the ground-up with security, speed, and stability in mind." +category: "Gaming" +icon: "/docs/images/services/pterodactyl_logo_transparent.png" +--- + +# Wings + + + +## What is Wings? + +Wings is Pterodactyl's server control plane, built for the rapidly changing gaming industry and designed to be highly performant and secure. Wings provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle. + +In addition, Wings ships with a built-in SFTP server allowing your system to remain free of Pterodactyl specific dependencies, and allowing users to authenticate with the same credentials they would normally use to access the Panel. + +## Links + +- [Official Website](https://pterodactyl.io/?utm_source=coolify.io) +- [GitHub](https://github.com/pterodactyl/wings?utm_source=coolify.io) diff --git a/content/docs/services/wireguard-easy.mdx b/content/docs/services/wireguard-easy.mdx new file mode 100644 index 00000000..c6103a99 --- /dev/null +++ b/content/docs/services/wireguard-easy.mdx @@ -0,0 +1,20 @@ +--- +title: Wireguard Easy +description: "Easy-to-use WireGuard VPN server." +og: + description: "Deploy WireGuard VPN on Coolify with WireGuard Easy for simple VPN setup, client management, and secure network tunneling interface." +category: "Security" +icon: "/docs/images/services/wireguardeasy-logo.svg" +--- + +# Wireguard Easy + + + +## What is Wireguard Easy + +The easiest way to run WireGuard VPN + Web-based Admin UI. + +## Links + +- [Official Documentation](https://github.com/wg-easy/wg-easy?utm_source=coolify.io) diff --git a/content/docs/services/wordpress.mdx b/content/docs/services/wordpress.mdx new file mode 100644 index 00000000..ff411342 --- /dev/null +++ b/content/docs/services/wordpress.mdx @@ -0,0 +1,81 @@ +--- +title: "WordPress" +description: "Website and blogging platform." +og: + description: "Run WordPress on Coolify for blogging, CMS, e-commerce with plugins, themes, and world's most popular website building platform." +category: "CMS" +icon: "/docs/images/services/wordpress-logo.svg" +--- + + + +## What is WordPress? + +WordPress is a free and open-source content management system written in PHP and paired with a MySQL/MariaDB database. +It is used for creating websites, blogs, and applications. + +## Deployment Variants + +WordPress is available in two deployment configurations in Coolify: + +### WordPress with MariaDB +- **Database:** MariaDB +- **Use case:** Production deployments with MariaDB preference (recommended for most users) +- **Components:** + - WordPress container + - MariaDB container + - Automatic database configuration and health checks + +### WordPress with MySQL +- **Database:** MySQL +- **Use case:** Production deployments with MySQL preference +- **Components:** + - WordPress container + - MySQL container + - Automatic database configuration and health checks + +Both variants provide equivalent functionality - choose based on your database preference or existing infrastructure. + +## Links + +- [The official website](https://wordpress.org) +- [GitHub](https://github.com/WordPress/WordPress) + +## FAQ + +### How to increase the upload size limit? + +You can increase the upload size limit by following these steps: + +1. Open the `.htaccess` file through Coolify's Terminal (or through SSH, and docker exec -ti `container_id` /bin/sh) +2. Add the following lines to the end of the file with `vi` or `nano`: + +```php +# END WordPress - this line already exists in the file + +php_value upload_max_filesize 256M +php_value post_max_size 256M +php_value max_execution_time 300 +php_value max_input_time 300 +``` + +3. Save and close the file. +4. Reload the website in your browser. The changes should be applied automatically. + +### How to Fix a Redirection Loop in WordPress? + +If your WordPress site is stuck in a redirection loop, follow these steps to resolve the issue: + +Access the .htaccess file: + +1. Open the `.htaccess` file through Coolify's Terminal (or through SSH, and docker exec -ti `container_id` /bin/sh) +2. Navigate to the WordPress root directory and locate the .htaccess file. Edit the .htaccess file: + +``` + + SetEnvIf X-Forwarded-Proto "^https$" HTTPS + +``` + +3. Save and close the file. +4. Reload the website in your browser. The changes should be applied automatically. diff --git a/content/docs/services/yamtrack.mdx b/content/docs/services/yamtrack.mdx new file mode 100644 index 00000000..d95bfe91 --- /dev/null +++ b/content/docs/services/yamtrack.mdx @@ -0,0 +1,42 @@ +--- +title: "Yamtrack" +description: "Self-hosted music scrobble database." +og: + description: "Track time on Coolify with YAMTrack for project time logging, invoicing, reports, and freelancer productivity management tool." +category: "Media" +icon: "/docs/images/services/yamtrack-logo.svg" +--- + + + +## What is Yamtrack? + +Yamtrack is a self hosted media tracker for movies, tv shows, anime, manga, video games and books. + +## Deployment Variants + +Yamtrack is available in two deployment configurations in Coolify: + +### Yamtrack (Default) +- **Database:** SQLite (embedded) +- **Use case:** Simple deployments, testing, or personal media tracking +- **Components:** Single Yamtrack container with built-in SQLite database + +### Yamtrack with PostgreSQL +- **Database:** PostgreSQL +- **Use case:** Production deployments requiring better performance and data reliability +- **Components:** + - Yamtrack container + - PostgreSQL container + - Automatic database configuration and health checks + +## Screenshots + + +
+ + +## Links + +- [The official website](https://github.com/FuzzyGrim/Yamtrack/wiki?utm_source=coolify.io) +- [GitHub](https://github.com/FuzzyGrim/Yamtrack?utm_source=coolify.io) diff --git a/content/docs/services/zipline.mdx b/content/docs/services/zipline.mdx new file mode 100644 index 00000000..35f19e43 --- /dev/null +++ b/content/docs/services/zipline.mdx @@ -0,0 +1,26 @@ +--- +title: "Zipline" +description: "Next generation ShareX / File upload server" +og: + description: "Share files on Coolify with Zipline for screenshot sharing, file uploads, URL shortening, and personal media hosting with embeds." +category: "File Management" +icon: "/docs/images/services/zipline-logo.svg" +--- + + + +## What is Zipline? + +The next generation ShareX / File upload server +A ShareX/file upload server that is easy to use, packed with features, and with an easy setup! + +## Screenshots + + +
+ + +## Links + +- [The official website](https://zipline.diced.sh/?utm_source=coolify.io) +- [GitHub](https://github.com/diced/zipline?utm_source=coolify.io) diff --git a/content/docs/troubleshoot/applications/bad-gateway.mdx b/content/docs/troubleshoot/applications/bad-gateway.mdx new file mode 100644 index 00000000..d61cf426 --- /dev/null +++ b/content/docs/troubleshoot/applications/bad-gateway.mdx @@ -0,0 +1,62 @@ +--- +title: Bad Gateway Error +description: Fix Bad Gateway (502) errors in Coolify by checking port configuration, host mapping, listening addresses, and container health. +tags: ["Bad Gateway", "502", "Troubleshooting", "Coolify", "Traefik"] +--- + +# Bad Gateway (502) Error + +If your deployed application **maybe** works when you access it via your server’s IP address and port but shows a **Bad Gateway** error on your domain, the issue is most often due to misconfigured port settings, incorrect host mapping, or your app listening only on localhost. + +## What’s an Application and What's a Service? + +- **Application:** An Application is deployed by you using a Git repository or any deployment option **except** the one-click service. + +- **Service:** A Service is an app deployed using a Compose file or the one-click service on Coolify. These deployments may have different network settings and UI sections (for example, you might not see the Network section in your UI). + +## Symptoms + +- The application **maybe** accessible via the server IP with a port number but not via the domain. + +## Diagnosis + +- **Port Configuration:** + + - **Applications:** Make sure the port your app is listening on is correctly entered in the **Port Exposes** field on the Coolify dashboard. + - **Services:** Check that your Compose or one-click service configuration has the appropriate network configuration. + +- **Host Mapping:** + + - **Applications:** Verify that the application’s port is not incorrectly mapped to the host system. + - **Services:** Confirm that any port mapping in your Compose file or service configuration aligns with the proxy routing requirements. + +- **Listening Address:** Check if the app is only listening to `localhost` inside the container. It should be configured to listen on all network interfaces (`0.0.0.0`). + +- **Domain Port Inclusion:** Make sure your domain URL includes the correct port number if required. + +- **Container Status:** Check the status of the container where your app or service is running. Is it unhealthy? Stuck at Starting? A failing health check might be the reason. + +## Solution + +- **Update Port Settings:** Enter the correct port number in the **Port Exposes** field on the Coolify dashboard and restart your app. + + + +- **Remove Host Port Mapping:** If the port is mapped to the host system, remove the mapping so the proxy can route traffic correctly, then restart your app. + + + +- **Adjust Listening Address:** Change your application so it listens on all network interfaces (`0.0.0.0`) instead of just `localhost`. + + + +- **Correct Domain URL:** Add the correct port number at the end of your domain URL if needed, and restart your application. + + + +- **Restart Container / Check Logs:** Restart the container or check its logs to diagnose the issue. + + +## Support + +If these steps don’t solve the issue, consider reaching out for further assistance by joining our [Discord community](https://coolify.io/discord) and sharing your app logs, coolify proxy logs, configuration screenshots, and details of the troubleshooting steps you’ve already tried. diff --git a/content/docs/troubleshoot/applications/failed-to-get-token.mdx b/content/docs/troubleshoot/applications/failed-to-get-token.mdx new file mode 100644 index 00000000..082ce874 --- /dev/null +++ b/content/docs/troubleshoot/applications/failed-to-get-token.mdx @@ -0,0 +1,18 @@ +--- +title: Failed To Get Access Token During Deployment +description: Fix GitHub access token errors in Coolify deployments caused by NTP time synchronization issues affecting JWT 'iat' claim validation during authentication. +--- + +# Failed To Get Access Token + +Your deployment failed because it cannot get the access token from GitHub. + +The error is usually related to NTP time synchronization issue. + + +## Error +`'Issued at' claim (iat) must be an Integer representing the time that assertion issued.` + + +## Solution +You must do the same as the [2FA Stopped Working](/troubleshoot/server/two-factor-stopped-working) solution. diff --git a/content/docs/troubleshoot/applications/gateway-timeout.mdx b/content/docs/troubleshoot/applications/gateway-timeout.mdx new file mode 100644 index 00000000..67643770 --- /dev/null +++ b/content/docs/troubleshoot/applications/gateway-timeout.mdx @@ -0,0 +1,250 @@ +--- +title: Gateway Timeout Errors +description: Resolve Gateway Timeout (504) errors in Coolify by fixing network isolation, adjusting proxy timeouts for Traefik, Caddy, and Nginx. +tags: + [ + "Gateway Timeout", + "504", + "Troubleshooting", + "Coolify", + "Traefik", + "Caddy", + "Nginx", + ] +--- + +# Gateway Timeout (504) Errors + +Gateway timeout errors occur when the Coolify proxy cannot get a response from your application within the configured timeout period. This is different from [Bad Gateway (502)](/troubleshoot/applications/bad-gateway#bad-gateway-502-error) errors, which indicate the proxy cannot connect to your application at all. + +## Common Causes + +There are two primary scenarios that cause 504 Gateway Timeout errors in Coolify: + +1. **Custom Docker Network Isolation** - The proxy cannot reach applications using custom networks +2. **Large Upload/Download Timeouts** - Default timeout settings are too short for large file transfers + +## Issue 1: Custom Docker Network Isolation + +### Symptoms + +- Application works initially after deployment +- 504 Gateway Timeout errors appear after hours or days +- Application is reachable via direct IP and port (requires manual port mapping) +- Restarting the application temporarily fixes the issue +- Using custom Docker networks in your configuration + +### Root Cause + +When you define custom Docker networks in your Docker Compose file, the `coolify-proxy` container runs in Coolify's own networks while your application runs in the custom network. This network isolation prevents the proxy from reaching your application, especially when Docker's internal DNS returns different IPs based on timing and network joins. + +### Diagnosis + +1. **Check if your application uses custom networks:** + + ```bash + docker inspect --format='{{range $k,$v := .NetworkSettings.Networks}}Network: {{$k}}, IP: {{$v.IPAddress}}, Gateway: {{$v.Gateway}}{{println}}{{end}}' + ``` + +2. **Verify proxy network connections:** + + ```bash + docker inspect coolify-proxy --format='{{range $k,$v := .NetworkSettings.Networks}}Network: {{$k}}, IP: {{$v.IPAddress}}, Gateway: {{$v.Gateway}}{{println}}{{end}}' + ``` + +### Solutions + +#### Solution 1: Use Coolify Destinations (Recommended) + +Let Coolify manage networks automatically by using [Destinations](/knowledge-base/destinations/) instead of custom networks: + +1. Remove custom network definitions from your Docker Compose file +2. [Configure the network destination](/knowledge-base/destinations/create) in Coolify's UI under **Destinations** +3. [Move your application / service to the desired destination](/knowledge-base/destinations/manage#assign-resources-to-a-destination) +4. Redeploy + +**Before (problematic):** + +```yaml +services: + app: + image: myapp:latest + networks: + - custom-network + +networks: + custom-network: + driver: bridge +``` + +**After (recommended):** + +```yaml +services: + app: + image: myapp:latest + # Let Coolify handle networking +``` + +#### Solution 2: Manual Network Connection (Temporary) + +If you must use custom networks, manually connect the proxy: + +```bash +docker network connect coolify-proxy +``` + +**Note:** This is a temporary fix that may need to be reapplied after proxy restarts. + +## Issue 2: Large Upload/Download Timeouts + +### Symptoms + +- 504 errors when uploading large files (>100MB) +- 504 errors when pushing large Docker images to a registry +- 504 errors during long-running requests (>60 seconds for Traefik/Nginx) +- Small files and quick requests work fine + +### Root Cause + +The default timeout behavior depends on your proxy: + +- **Traefik**: Default read timeout is 60 seconds +- **Caddy**: No default timeout (requests can run indefinitely) +- **Nginx** (one-click databases): Default timeout is 60 seconds + +Any request exceeding the configured timeout will result in a 504 Gateway Timeout error, even if the backend application is still processing the request. + +### Diagnosis + +1. **Check which proxy you're using:** + + - Navigate to **Servers > [YourServer] > Proxy** in the Coolify UI + - The proxy type (Traefik, Caddy, etc.) will be displayed + +2. **Check current proxy configuration:** + + - Navigate to **Servers > [YourServer] > Proxy** and look for any timeout settings + - Check your applications / services for custom labels that might override defaults + +3. **Monitor request duration in application logs:** + + - Navigate to your application / service logs in Coolify + - Look for long-running requests that exceed 60 seconds + +4. **Test with a smaller file to confirm it's size-related** + +### Solutions + +#### Solution 1: Increase Proxy Timeout + +The configuration method depends on your proxy type: + +##### For Traefik (Default Proxy) + +Add custom Traefik configuration to increase the timeout. You have various options depending on your needs to achieve this: + +Navigate to your server's proxy settings and add the new timeouts under the command section: + +```yaml +command: + - '--entrypoints.https.transport.respondingTimeouts.readTimeout=5m' + - '--entrypoints.https.transport.respondingTimeouts.writeTimeout=5m' + - '--entrypoints.https.transport.respondingTimeouts.idleTimeout=5m' +``` + +Read more about Traefik timeouts in the [official documentation](https://doc.traefik.io/traefik/reference/install-configuration/entrypoints/#timeout). + +##### For Caddy + +Since Caddy has no default timeout, you typically won't experience timeout issues. However, if you need to SET a timeout (for security or resource management): + +1. Add the following to your **Container Labels** in Coolify: + +```yaml +# Set a 5-minute timeout (300 seconds) +caddy.servers.timeouts.read_body=300s +caddy.servers.timeouts.read_header=300s +caddy.servers.timeouts.write=300s +caddy.servers.timeouts.idle=5m +``` + +Read more about Caddy timeouts in the [official documentation](https://caddyserver.com/docs/caddyfile/options#timeouts). + +##### For Nginx (One-Click Databases) + +Nginx configuration cannot be directly modified for one-click databases in Coolify. Instead, **bypass Nginx entirely** to avoid timeout issues: + +1. Navigate to your database settings in Coolify +2. **Disable** "Make it publicly available?" option +3. Use **Port Mappings** instead to expose the database port directly and restart the database +4. This maps the port directly from the container, bypassing Nginx and its timeout limitations + +**Example:** For a PostgreSQL database, map port `5432:5432` to access it directly without any proxy timeouts. + +Read more about public database access here: [One-Click Databases](/databases/#ports-mapping-vs-public-port). + +#### Solution 2: Implement Chunked Uploads + +For very large files, consider implementing chunked uploads in your application: + +1. Split large files into smaller chunks on the client side +2. Upload chunks individually (each under the timeout limit) +3. Reassemble on the server side + +#### Solution 3: Use Background Processing + +For long-running operations: + +1. Accept the request and return immediately with a job ID +2. Process the request in the background +3. Provide an endpoint to check job status + +## Quick Diagnosis Checklist + +Run through these steps to identify your specific issue: + +1. **Check the error code:** + + - 504 = Gateway Timeout (this guide) + - 502 = Bad Gateway (see [Bad Gateway troubleshooting](/troubleshoot/applications/bad-gateway)) + +2. **Check timing:** + + - Immediate = likely network/configuration issue + - After ~60 seconds = likely timeout issue + - Random after hours/days = likely network isolation issue + +3. **Check network configuration:** + + ```bash + # List all Docker networks + docker network ls + + # Check which networks your containers are using + docker ps --format "table {{.Names}}\t{{.Networks}}" + ``` + +## Prevention Tips + +1. **Avoid custom Docker networks** unless absolutely necessary +2. **Set appropriate timeouts** for your application's needs during initial setup +3. **Implement health checks** to maintain connectivity +4. **Monitor proxy logs** regularly for timeout patterns +5. **Use progress indicators** for long-running operations to prevent client-side timeouts + +## Support + +If these solutions don't resolve your gateway timeout issues: + +1. Collect diagnostic information: + + ```bash + # Save this output + docker ps --format "table {{.Names}}\t{{.Networks}}\t{{.Status}}" + docker logs coolify-proxy --tail 200 > proxy-logs.txt + docker logs --tail 200 > app-logs.txt + ``` + +2. Join our [Discord Community](https://coolify.io/discord) +3. Share your configuration, logs, and the specific steps you've tried diff --git a/content/docs/troubleshoot/applications/meta.json b/content/docs/troubleshoot/applications/meta.json new file mode 100644 index 00000000..bcbc29cb --- /dev/null +++ b/content/docs/troubleshoot/applications/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Applications", + "pages": [ + "bad-gateway", + "no-available-server", + "gateway-timeout", + "failed-to-get-token" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/applications/no-available-server.mdx b/content/docs/troubleshoot/applications/no-available-server.mdx new file mode 100644 index 00000000..5d9e9805 --- /dev/null +++ b/content/docs/troubleshoot/applications/no-available-server.mdx @@ -0,0 +1,312 @@ +--- +title: No Available Server Error +description: Fix No Available Server (503) errors in Coolify by diagnosing health checks, domain configuration, port mismatches, and Traefik proxy issues. +tags: ["No Available Server", "503"] +--- + +# No Available Server (503) Error + +If your deployed application or service shows a **"No Available Server"** error, this indicates that [Traefik](/knowledge-base/proxy/traefik) (the reverse proxy) cannot find any (healthy) containers to route traffic to under the provided secured URL (`https`). + +## What Causes This Error? + +The "No Available Server" error occurs when: + +1. **Failed Health Checks** - Traefik considers your container unhealthy +2. **Domain Configuration Issues** - Incorrect domain setup or missing www/non-www variants +3. **Port Mismatches** - Exposed ports don't match your application's actual listening port +4. **Deployment Downtime** - Brief downtime during container updates +5. **Underlying Traefik Issues** - Problems with Traefik itself (e.g., Docker API version mismatch) + +## Quick Diagnosis Steps + +### 1. Check Container Health Status + +First, verify if your containers are running healthy: + +```bash +# SSH into your server and check container status +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +``` + +Look for containers showing `(unhealthy)` status - this indicates a health check problem. + +### 2. Check Domain Configuration + +Verify that you entered the domain correctly into your Application / Service configurations and your DNS records are pointing to the correct IP address. See the [Domains](/knowledge-base/domains) documentation for the full formatting rules. + +### 3. Check Traefik Proxy Logs + +Check the Traefik logs for underlying issues: + +Through Coolify UI: + +- Go to `Servers` → `[Your Server]` → `Proxy` → `Logs` + +Or via SSH: + +```bash +# Check proxy logs for errors +docker logs coolify-proxy --tail 50 +``` + +Look for error messages like `client version 1.24 is too old` which indicates a [Docker API version mismatch](#solution-5-update-traefik-to-fix-docker-api-version-issue). + +## Common Solutions + +### Fix Failed Health Checks (Most Common) + +**Symptoms:** + +- Container shows as `(unhealthy)` in Docker +- Health check path returns errors +- Missing dependencies (e.g. `curl`/`wget`) in container + +**Steps:** + +1. **Disable Health Check Temporarily:** + + - Go to your application configuration + - Disable the health check + - Restart your application + + If this fixes the issue, then the problem is in your health check. + +2. **Fix Health Check Issues:** + + + + + These are some common solutions to fix a health check. Adjust based on your specific application and health check command. Read more about [configuring Health Checks](/knowledge-base/health-checks#configure-health-checks). + + + + + **Missing dependencies in container:** + + Ensure that all necessary tools are installed in your Docker image for the health check to work. [Applications](/applications) will need either `curl` or `wget` installed. + + ```dockerfile + # Add curl to your Dockerfile + RUN apt-get update && apt-get install -y curl + # OR for Alpine images + RUN apk add --no-cache curl + ``` + + **Wrong health check path / hostname:** + + Make sure that your app is actually serving the health check endpoint and does not return an error. In most cases, the hostname will be `localhost` or `127.0.0.1`. + + **Port mismatch:** + + - Ensure health check port matches your app's listening port + - If the app runs on port `3000`, health check should use port `3000` + +3. **Test Health Check Manually:** + + If the above hasn't resolved the issue, manually test the health check command inside the container and evaluate the output. + + You can do this by either navigating to your container's `Terminal` tab in Coolify or by SSHing into your server and running: + + ```bash + # SSH into your server and test a health check which uses curl + docker exec -it curl -f http://localhost:3000/health + ``` + +### Fix Domain Configuration + +#### Incorrect Domain Setup + +**Symptoms:** + +- Works with auto-generated domain (e.g. `sslip.io`) but not custom domain + +**Steps:** +Verify that your domain is correctly set up in both Coolify and your DNS provider as per the [Domains](/knowledge-base/domains) documentation. + +#### Redirect Issues + +**Symptoms:** + +- Redirect is set to either `Redirect to www` or `Redirect to non-www` +- Works for root domain but not www (or vice versa) + +**Steps:** + +1. **Add Both www and non-www Domains:** + + Make sure both, the www and non-www versions of your domain are added in the `Domains` field like so: `https://example.com,https://www.example.com` + +2. **Configure Domain Redirection:** + + - Set the `Direction` to `Allow www & non-www` if you want both to work + +3. **Restart Application:** + - Always restart after domain changes + +#### HTTPS Issues + +If your site is only accessible via HTTP but not HTTPS, check your domain configuration: + +- **For HTTPS with SSL**: Use `https://` prefix in the domain field: `https://example.com` +- **For HTTP only**: Use `http://` prefix in the domain field: `http://example.com` (no SSL certificate will be generated) + +Make sure the protocol in your domain configuration matches how you want to access your site, then restart your application. + +### Fix Port Configuration + +**Symptoms:** + +- Application / Service works via `http://IP:port` but not via domain (manual port mapping required) +- [Traefik](/knowledge-base/proxy/traefik) can't reach the application + +**Steps:** + +1. **Check exposed Port:** + + The proxy needs to know which port your application is listening on. Check that the port is configured correctly. + + + + In [Applications](/applications), this is defined in the `Ports Exposes` field. + + + + In **Service Stacks**, this is defined by either adding the port at the end of the URL in the `Domains` field (e.g. `https://example.com:3000`) or by defining the `EXPOSE` directive in your `Dockerfile`. + +2. **Verify Application Listening Address:** + + + + Your Application / Service might be binding to only `localhost` or `127.0.0.1`, which makes it unreachable from outside the container. Ensure your app listens on all interfaces (`0.0.0.0`). + +### Handle Deployment Downtime + +**Symptoms:** + +- Brief "No Available Server" during deployments +- Happens only during container updates + +**Solution: Configure Rolling Updates** + +Ensure that `Rolling Updates` are correctly configured. See [Rolling Updates documentation](/knowledge-base/rolling-updates) + +### Update Traefik to Fix Docker API Version Issue + +**Symptoms:** + +- "No Available Server" error appears +- Coolify proxy logs shows the following error message: + ```text + Error response from daemon: client version 1.24 is too old. Minimum supported API version is 1.44, please upgrade your client to a newer version + ``` +- Application container is running healthy but visiting the domain shows "No Available Server" + +**Root Cause:** +The problem happened because Traefik was hard-coding Docker API versions. + + + + +The Traefik team has released a fix in **v2.11.31** and **v3.6.1**. Starting from v2.11.31 and v3.6.1, Traefik will now auto-negotiate the Docker API version, so this issue shouldn't happen again. + + + + +**Solution:** + +If you're already using Coolify, you'll need to update Traefik manually by follow these steps: + +1. **Navigate to Proxy Configuration:** + + - Go to your Coolify dashboard (https://app.coolify.io/ for cloud users) → Servers → [Your Server] → Proxy → Configuration + +2. **Change Traefik Version:** + + - Change the version to: `v3.6.1` (or `v2.11.31` if staying on v2) + +3. **Restart Proxy:** + - Click `Restart Proxy` + + + +**Notes:** + +- You need to do this on every server connected to your Coolify instance +- This applies to both self-hosted and Coolify Cloud users + - (Cloud users: Traefik runs on **your own server** not Coolify’s so you’ll need to update it yourself by following the guide above) +- If you have changed Docker daemon configs to set Minimum supported API version, then we recommend to revert it as it could potentially cause problems in the future. + + + + +Some users have custom configurations (like DNS challenges) that could break when updating to a newer Traefik version. Please check the [Traefik changelog](https://github.com/traefik/traefik/releases) before updating. + +- If you're using the default Coolify Traefik configurations, you're safe to update to v3.6.1 without any issues. +- If you're currently on Traefik v2 and don't want to upgrade to v3, you can update to the patched v2.11.31 instead. + + + + +## Advanced Debugging + +### Check Traefik Configuration + +```bash +# View Traefik dynamic configuration +cat /data/coolify/proxy/dynamic/*.yml + +# Check Traefik logs +docker logs coolify-proxy -f + +# Inspect container labels to verify Traefik routing configuration +docker inspect --format='{{json .Config.Labels}}' | jq +``` + +### Check Application Logs + +```bash +# Check your application's logs for errors +docker logs -f +``` + +### Test Health Check from Inside Container + +```bash +# Execute health check command manually +docker exec -it /bin/sh +curl -f http://localhost:3000/health +``` + +## Prevention Tips + +1. **Always Use Health Checks:** + + - Implement a `/health` endpoint in your application + - Ensure all dependencies (e.g. `curl`/`wget`) are available in your container + +2. **Test Locally First:** + + - Test your health check endpoint before deploying + - Verify port configuration matches your app + +3. **Monitor Container Status:** + + - Regularly check `docker ps` for unhealthy containers + - Set up monitoring for health check failures + +4. **Use Staging Environment:** + - Test domain configurations in staging first + +## When to Seek Help + +If none of these solutions work, join our [Discord community](https://coolify.io/discord) and provide: + +- Application logs +- Coolify proxy logs +- Container health status (`docker ps`) +- Domain configuration screenshots +- Health check configuration +- Steps you've already tried + +This will help the community diagnose more complex issues specific to your setup. diff --git a/content/docs/troubleshoot/dashboard/dashboard-inaccessible.mdx b/content/docs/troubleshoot/dashboard/dashboard-inaccessible.mdx new file mode 100644 index 00000000..36f0edfc --- /dev/null +++ b/content/docs/troubleshoot/dashboard/dashboard-inaccessible.mdx @@ -0,0 +1,119 @@ +--- +title: Dashboard Inaccessible via Instance Domain +description: Fix Coolify dashboard access issues by checking proxy status, container health, firewall ports, and resolving domain configuration. +--- + +# Coolify Dashboard Inaccessible + +Having trouble accessing your Coolify dashboard? follow these steps to diagnose and resolve the issue. + +## 1. Determine Your Access Method + +First, ask yourself: **How are you trying to access the dashboard?** + +- **Custom Domain:** If you’re using the domain you set up for your Coolify dashboard, the problem might be with the Coolify proxy. +- **Direct Server IP:** If you’re using your server’s IP address, the issue could be related to your server or container status. + +## 2. Test with Your Server’s IP Address + +### A. Open Your Firewall Port + +- **Step:** Make sure that port `8000` is open on your firewall. +- **Why:** This allows direct access to the Coolify dashboard without any proxy interference. + +### B. Access the Dashboard Directly + +- **Step:** Open your web browser and go to: `http://203.0.113.1:8000` _(Replace `203.0.113.1` with your actual server IP address)_ +- **Observation:** + - If you see the login page, the dashboard is working fine without proxy (skip to [step 4](#_4-addressing-proxy-related-issues)). + - If you don't see the login page, the issue might be with your server or coolify docker containers. + +## 3. Check the Coolify Container + +If the dashboard isn’t accessible via the IP address, then follow these steps: + +### A. Verify the Container Status + +- **Step:** SSH into your server. +- **Command:** + ```bash + docker ps --format "table {{.Names}}\t{{.Status}}" + ``` +- **What to Look For:** + + - Make sure the coolify containers are running and its status is healthy. + + + +### B. Restart the Container (if necessary) + +- **Step:** If the container appears to be running but you’re still having issues, try restarting it. +- **Commands:** + ```bash + docker restart NAME + ``` + _(Replace `NAME` with your actual container name)_ +- **Test:** After restarting, try accessing `http://203.0.113.1:8000` _(Replace `203.0.113.1` with your actual server IP address)_ again. If this doesn't work, skip to [step 5](#_5-getting-further-assistance) + +### C. Conflict Coolify-Related Containers Port + +Sometimes, the issue occurs if a non-Coolify container is using the same port (e.g., port 8000) as Coolify's dashboard, causing a conflict. + +- **Steps:** + +1. SSH into your server. +2. Stop all Docker containers gracefully: + ```bash + docker stop $(docker ps -q) + ``` +3. Start only the containers related to Coolify: + ```bash + docker start $(docker ps -a -q --filter "name=coolify") + ``` +4. Try accessing your Coolify dashboard again. The dashboard should now be accessible since conflicts on port 8000 are cleared. + +- **Next:** Check your containers for the same port as your Coolify instance through the Coolify dashboard and change the port accordingly (don't forget to verify firewall rules) + +## 4. Addressing Proxy-Related Issues + +If the dashboard is accessible via the server IP but not through your custom domain, then follow these steps: + +### A. Start the Proxy + +- **Step:** Go to the **Proxy** page in your Coolify dashboard. +- **Action:** Click the **Start Proxy** button. + + + +- **Wait:** Give it about two minutes, then try accessing your dashboard using your custom domain. + +### B. Review Recent Changes + +- **Question:** Did you change any proxy configurations before the issue started? + + - **If Yes:** Reset the proxy configuration to its default settings and restart the proxy. + + + + - **Wait:** Give it about two minutes, then try accessing your dashboard using your custom domain. + +### C. Check Proxy Logs + +- **Step:** Look at the proxy logs for any error or warning messages. + + + +- **Next:** If you see errors, they may hint at what needs to be fixed (skip to next step). + +## 5. Getting Further Assistance + +If none of the above steps work, then follow this: + +- **Community Help:** Join our [Discord community](https://coolify.io/discord) and create a post in the support forum channel. +- **What to Share:** Include the exact error messages you’re seeing and a description of the steps you’ve already tried. + +## Summary of Common Issues + +- **Proxy Not Running:** Most issues are often due to the Coolify proxy not running. +- **Proxy Misconfiguration:** Incorrect settings in your proxy configuration can block access. +- **Container Health:** An unhealthy Coolify container may be the problem. diff --git a/content/docs/troubleshoot/dashboard/dashboard-slow-performance.mdx b/content/docs/troubleshoot/dashboard/dashboard-slow-performance.mdx new file mode 100644 index 00000000..d96216ea --- /dev/null +++ b/content/docs/troubleshoot/dashboard/dashboard-slow-performance.mdx @@ -0,0 +1,56 @@ +--- +title: Slow Coolify Dashboard Performance +description: Resolve slow Coolify dashboard loading by disabling Cloudflare Rocket Loader, checking server location, and optimizing proxy settings for faster performance. +--- + +# Slow Coolify Dashboard Performance + +If your Coolify dashboard loads very slow or some pages don't load at all, this might be the guide for you. + +## 1. Determine Your Domain Setup + +First, ask yourself: **Are you using a domain whose DNS is managed by Cloudflare?** + +- **Yes:** The issue is likely due to Cloudflare's [Rocket Loader](https://developers.cloudflare.com/speed/optimization/content/rocket-loader/) feature. +- **No:** The slowdown might be caused by your server or another factor. + +## 2. Test with Your Server's IP Address + +### A. Open Your Firewall Port + +- **Step:** Ensure that port **8000** is open on your firewall. +- **Why:** This lets you access the Coolify dashboard directly without proxy interference. + +### B. Access the Dashboard Directly + +- **Step:** Open your web browser and navigate to: + `http://203.0.113.1:8000` _(Replace `203.0.113.1` with your actual server IP address)_ +- **Observation:** + - If the dashboard feels fast and all pages load correctly, the issue is most likely with Cloudflare [Rocket Loader](https://developers.cloudflare.com/speed/optimization/content/rocket-loader/). + - If performance doesn't improve, the problem could be related to your server's location or your internet speed. + +## 3. Addressing Cloudflare Rocket Loader + +If the dashboard is fast via your server IP but slow through your custom domain, try this: + +- **Step:** Log into your [Cloudflare dashboard](https://dash.cloudflare.com/). + + + +- **Action:** + - Go to **Speed** on the sidebar. + - Then navigate to **Optimization** and click on **Content Optimization**. + - Switch the toggle for **Rocket Loader** to **Off**. +- **Wait:** Allow a few minutes for the changes to take effect, then visit your Coolify dashboard using your domain. + +## 4. Getting Further Assistance + +If none of these steps work: + +- **Community Help:** Join our [Discord community](https://coolify.io/discord) and post in the support forum channel. +- **What to Share:** Provide a screen recording of the issue you're experiencing and a description of the steps you’ve already tried. + +## Summary of Common Issues + +- **Cloudflare Rocket Loader:** Most of the time, Rocket Loader causes issues when using a Cloudflare-managed domain +- **Server or Internet Issues:** Unstable internet connections between the server and user can lead to performance problems. diff --git a/content/docs/troubleshoot/dashboard/disable-2fa-manually.mdx b/content/docs/troubleshoot/dashboard/disable-2fa-manually.mdx new file mode 100644 index 00000000..feeff767 --- /dev/null +++ b/content/docs/troubleshoot/dashboard/disable-2fa-manually.mdx @@ -0,0 +1,50 @@ +--- +title: Disable 2FA Manually +description: Manually disable two-factor authentication in Coolify using SSH, Docker exec, and Laravel Tinker commands when you've lost your 2FA device or codes. +--- + +# Disable 2FA Manually + +If you have lost your 2FA device or have any other issues, you can disable 2FA manually if you have access to your server. + +## 1. Login to your server through SSH + +```bash +ssh your-server-ip +``` + +## 2. Run the following command to go into coolify container + +```bash +docker exec -it coolify sh +``` + +## 3. Go into Tinker + +```bash +php artisan tinker +``` + +## 4. Find your user id + +> In case of `root` user, you must use `0` as user id. + + +> So `$user_id = 0`; + + +> For every other user, use the below command to get the user id. + +```php +$user_id = User::whereEmail('your-email')->first()->id; +``` + +## 5. Disable 2FA + +```php +User::find($user_id)->update([ + 'two_factor_secret' => null, + 'two_factor_recovery_codes' => null, + 'two_factor_confirmed_at' => null +]); +``` \ No newline at end of file diff --git a/content/docs/troubleshoot/dashboard/meta.json b/content/docs/troubleshoot/dashboard/meta.json new file mode 100644 index 00000000..35bc9dfd --- /dev/null +++ b/content/docs/troubleshoot/dashboard/meta.json @@ -0,0 +1,8 @@ +{ + "title": "Dashboard", + "pages": [ + "dashboard-inaccessible", + "dashboard-slow-performance", + "disable-2fa-manually" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/dns-and-domains/certificate-resolver-doesnt-exist.mdx b/content/docs/troubleshoot/dns-and-domains/certificate-resolver-doesnt-exist.mdx new file mode 100644 index 00000000..aa25b16c --- /dev/null +++ b/content/docs/troubleshoot/dns-and-domains/certificate-resolver-doesnt-exist.mdx @@ -0,0 +1,49 @@ +--- +title: "Certificate Resolver Not Found on Coolify Proxy" +description: Fix Traefik 'letsencrypt cert resolver not found' errors by setting correct acme.json file permissions using chmod 600 for non-root Coolify users. +--- + + +# Certificate Resolver Not Found on Coolify Proxy +If you see the error message `Cert resolver doesn't exist letsencrypt` in the Coolify proxy logs, it typically means that your domain is missing an SSL certificate. This issue often occurs when Coolify is using a non-root user account. + + +## Symptoms +- The Coolify proxy doesn't generate an SSL certificate for your domain. +- The error `Cert resolver doesn't exist letsencrypt` appears in the Coolify proxy logs. + + +## Diagnosis +To troubleshoot, check the permissions of the `acme.json` file in the `/data/coolify/proxy` directory by running the following command: + +```bash +ls /data/coolify/proxy +``` + +The output should look something like this: + +```bash +-rwxr-x--- 1 shadowarcanist shadowarcanist 32757 Sep 3 15:39 acme.json +-rwxr-x--- 1 shadowarcanist shadowarcanist 1762 Sep 3 18:36 docker-compose.yml +drwxr-x--- 2 shadowarcanist shadowarcanist 4096 Sep 3 15:06 dynamic +``` + +## Root Cause +When using Coolify with a non-root user account, permissions on the `/data/coolify` directory may not be set correctly. + +If the permissions on the `acme.json` file are **too relaxed** (too open), traefik will refuse to use the file. This prevents Traefik from accessing the file and generating SSL certificates. + +On the other hand, if permissions are **too strict**, Traefik won’t be able to read or write to the file either. + +Traefik requires the `acme.json` file to have the right level of permission to work properly. + + +## Solution +To fix this, run the following command to set the correct permissions: + +```bash +sudo chmod 600 /data/coolify/proxy/acme.json +``` + +### What Does `sudo chmod 600` Do? +The `chmod 600` command changes the file permissions of `/data/coolify/proxy/acme.json` so that only the owner of the file (the user account used by Coolify) can read and write to it. This prevents anyone else from accessing or modifying the file while still allowing Traefik to use it. \ No newline at end of file diff --git a/content/docs/troubleshoot/dns-and-domains/lets-encrypt-not-working.mdx b/content/docs/troubleshoot/dns-and-domains/lets-encrypt-not-working.mdx new file mode 100644 index 00000000..3609563e --- /dev/null +++ b/content/docs/troubleshoot/dns-and-domains/lets-encrypt-not-working.mdx @@ -0,0 +1,117 @@ +--- +title: Let's Encrypt Not Generating SSL Certificates on Coolify +description: Fix Let's Encrypt SSL failures by opening ports 80/443, checking DNS records, verifying Cloudflare settings, and troubleshooting challenges. +--- + +# Let's Encrypt Not Generating SSL Certificates + +If you are using the default settings for the Coolify proxy and your website suddenly shows a warning about an insecure connection, it is most likely that your website is using a self-signed certificate from the Coolify proxy. This guide will help you fix the issue. + +## 1. Understand the Domain Ownership Challenges + +Coolify uses [Let's Encrypt](https://letsencrypt.org?utm_source=coolify.io) to generate SSL certificates for your domains. + +By default, Let's Encrypt uses the **HTTP challenge** for domain validation, but some users might use the **TLS-ALPN-01 challenge**. Here's a breakdown: + +- **HTTP Challenge**: + - Let's Encrypt sends an HTTP request to your server on port 80 with a unique token. If your server responds with the correct token, it confirms domain ownership, and the certificate is issued. +- **TLS-ALPN-01 Challenge**: + - Let's Encrypt validates your domain over port 443 (HTTPS), during the TLS handshake, Let's Encrypt expects your server to provide a special response. If the server provides the correct response, the domain is verified, and the certificate is issued. + - If this step fails, you’ll get an SSL handshake error. + +## 2. Check Port Accessibility + +Ensure the appropriate ports are open for the respective challenge methods: + +- **For the HTTP Challenge**: Port 80 (HTTP) needs to be open and accessible from the internet. If port 80 is closed or blocked by a firewall, Let's Encrypt cannot verify your domain and generate the SSL certificate. + +- **For the TLS-ALPN-01 Challenge**: Port 443 (HTTPS) needs to be open and accessible from the internet. If port 443 is closed or blocked by a firewall, Let's Encrypt cannot verify your domain and generate the SSL certificate. + +## 3. Usage of Third-Party Proxy + +If you are proxying your website through a third-party service like [Cloudflare](https://www.cloudflare.com?utm_source=coolify.io), Let's Encrypt might fail to validate your domain due to the proxy interfering with the **HTTP** or **TLS-ALPN-01** challenge. In that case, you must either use a DNS challenge or stop proxying your domain through the third-party service. + +## 4. Check Let's Encrypt Service Status + +Sometimes, Let's Encrypt might be having issues on their end. Check the Let's Encrypt status from [here](https://letsencrypt.status.io?utm_source=coolify.io). If there is an issue, wait for them to fix it and try again once the issue is fixed. + +## 5. Note on Certificate Validity + +Let's Encrypt certificates are valid for 90 days. If your certificate is still valid, your domain may work fine even if required port 80 is closed or your domain is being proxied. This is because Coolify will continue using the existing valid certificate until it expires. + +However, if your domain has been working fine over HTTPS for several months and suddenly fails to generate a new SSL certificate, it’s likely that the existing certificate has expired. At this point, Coolify won’t be able to generate a new certificate due to the issues mentioned earlier (like port 80 being closed or proxy interference). + +## 6. Force Regenerate Certificates + +If the certificates stored on your server are corrupted or outdated, you can delete them and force Coolify generate new ones. + +- Open your server terminal and run: + ```bash + rm /data/coolify/proxy/acme.json + ``` +- Then, restart the Coolify proxy from the dashboard by clicking the Restart Proxy button. + +
+Guide: How to Restart Proxy from Dashboard? + + + 1. Select your server on the Coolify Dashboard + + + 2. Click on Restart Proxy button + + +
+ + +## 7. Check Your WAF Settings + +If you are using a Web Application Firewall (WAF) like [Cloudflare WAF](https://www.cloudflare.com/en-gb/application-services/products/waf/?utm_source=coolify.io), make sure it is not blocking Let's Encrypt requests. + +## 8. Check Coolify Proxy logs + +On the Coolify proxy logs check for error messages. + +- If you see an error message with a 429 status code, it means that Let's Encrypt has rate-limited your server's IP address. + + - In this case, wait for a while and check your domain again. Most users won't encounter this, but it can happen if you are using a shared IP address. + +- If you see an error message with a 403 status code, it means that requests from Let's Encrypt are blocked by something like a Web Application Firewall (WAF). + +
+Guide: How to check Coolify proxy logs? + + + 1. Select your server on the Coolify Dashboard + + + 2. Go to the proxy section and click the refresh button + + +
+ + +## 9. Verify DNS Records + +Let's Encrypt performs a DNS lookup to resolve the IP address of your server. If you have both **IPv4 (A record)** and **IPv6 (AAAA record)** configured to point to your server, Let's Encrypt will verify both records during the domain ownership challenge. + +- **If both IPv4 and IPv6 are present**, Let's Encrypt may prefer to use **IPv6** for the challenge, but **both IPv4 and IPv6 should be able to complete the challenge**. + +### Why This Matters: + +If either the **IPv4** or **IPv6** address is misconfigured, the challenge may fail. For example: + +- If your domain resolves to both **IPv4** and **IPv6**, but the **IPv6 (AAAA) record** has **port 80 closed**, the HTTP challenge will fail. Similarly, if **port 443** is closed for IPv6, the TLS-ALPN challenge will fail, even if **IPv4** passes the challenge. + +To ensure successful validation: + +- Both **IPv4 (A record)** and **IPv6 (AAAA record)** must be able to serve the challenge file correctly. + +If you don’t need IPv6, you can remove the **AAAA record** from your DNS configuration. This will make Let's Encrypt use **IPv4** for the challenge. + +## Support + +If none of the above steps work, try these additional options: + +- **Community Help:** Join our [Discord community](https://coolify.io/discord) and post in the support forum channel. +- **What to Share:** Include a description of your issue, any error messages, and the steps you have already tried. diff --git a/content/docs/troubleshoot/dns-and-domains/meta.json b/content/docs/troubleshoot/dns-and-domains/meta.json new file mode 100644 index 00000000..d8ff176d --- /dev/null +++ b/content/docs/troubleshoot/dns-and-domains/meta.json @@ -0,0 +1,8 @@ +{ + "title": "DNS & Domains", + "pages": [ + "wildcard-ssl-certs", + "lets-encrypt-not-working", + "certificate-resolver-doesnt-exist" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/dns-and-domains/wildcard-ssl-certs.mdx b/content/docs/troubleshoot/dns-and-domains/wildcard-ssl-certs.mdx new file mode 100644 index 00000000..46c56937 --- /dev/null +++ b/content/docs/troubleshoot/dns-and-domains/wildcard-ssl-certs.mdx @@ -0,0 +1,48 @@ +--- +title: Coolify not using Wildcard SSL Certificates +description: Fix wildcard SSL certificate issues in Coolify by verifying installation, checking proxy configuration, and clearing browser cache. +--- + +# Coolify not using Wildcard SSL Certificates + +If your wildcard SSL certificate isn't working with your domain, it may be due to configuration problems. Here's how you can check and fix it. + +## 1. Check the SSL Certificate Validity + +- **Verify the Certificate:** Make sure the SSL certificate is valid for the domain. + - Confirm the Common Name (CN) matches your domain. + - Double-check that your wildcard certificate is not expired. + +## 2. Verify Certificate Installation + +- **File Extensions:** Make sure the SSL certificate file ends with `.cert` and the key file ends with `.key`. + - Some providers give files in `.pem` format, which must be converted to `.cert` and `.key` before adding them to your server (simply rename the files to `.cert` for the certificate and `.key` for the key) +- **File Location:** Make sure your `.cert` and `.key` files are located in the `/data/coolify/proxy/certs` directory. + +## 3. Check the Coolify Proxy Configuration + +- **Add Certificate in Dashboard:** Make sure you have added the SSL certificate configuration in the Coolify proxy via the dashboard. More details can be found [here](/knowledge-base/proxy/traefik/custom-ssl-certs). +- **Check File Mounts:** If you have modified the proxy configuration, verify that the `/data/coolify/proxy` directory is mounted correctly. + +## 4. Remove Old Certificates + +- **Old Certificate Issue:** The Coolify proxy may be using an old certificate stored in the `acme.json` file. +- **Action:** Delete the `acme.json` file from the `/data/coolify/proxy` directory and restart the Coolify proxy from the dashboard by clicking the restart proxy button. + +## 5. Clear Your Browser Cache + +- **Cache Issue:** Your browser might be caching an old SSL certificate. +- **Action:** Check your website using a different browser or network. + - You can also use sandbox tools like [Browserling](https://www.browserling.com?utm_source=coolify.io) to test your site. + +## 6. Verify DNS Challenge Configuration + +- **DNS Challenge Check:** If you are using a DNS challenge, confirm that it is set up correctly. +- **Action:** Verify that you have selected the correct DNS provider, API Keys and check the challenge settings are properly configured. + +## Support + +If none of the above steps work, try these additional options: + +- **Community Help:** Join our [Discord community](https://coolify.io/discord) and post in the support forum channel. +- **What to Share:** Include a description of your issue, screenshots of your configuration, any error messages, and the steps you have already tried. diff --git a/content/docs/troubleshoot/docker/expired-github-personal-access-token.mdx b/content/docs/troubleshoot/docker/expired-github-personal-access-token.mdx new file mode 100644 index 00000000..809357a6 --- /dev/null +++ b/content/docs/troubleshoot/docker/expired-github-personal-access-token.mdx @@ -0,0 +1,27 @@ +--- +title: "Expired GitHub Personal Access Token (PAT)" +description: "Fix GitHub Container Registry authentication errors by logging out of ghcr.io or renewing expired GitHub Personal Access Tokens for Docker deployments." +--- +# Expired GitHub Personal Access Token (PAT) + +If you encounter the following errors, it means Docker cannot authenticate with the GitHub Container Registry (ghcr.io): + +## Error + +```bash + Error response from daemon: Head "https://ghcr.io/v2/coollabsio/coolify-helper/manifests/1.0.1": unauthorized: authentication required +``` +> or + +```bash + Unable to find image 'ghcr.io/coollabsio/coolify-helper:latest' locally + docker: Error response from daemon: Head "https://ghcr.io/v2/coollabsio/coolify-helper/manifests/latest": denied: denied +``` + +## Solution +You have two options: +- Log out of GitHub Container Registry (ghcr.io) by running: + ```bash + docker logout ghcr.io + ``` +- Renew your GitHub Personal Access Token (PAT) if you need to maintain authenticated access for deployments. diff --git a/content/docs/troubleshoot/docker/meta.json b/content/docs/troubleshoot/docker/meta.json new file mode 100644 index 00000000..b3ed59d5 --- /dev/null +++ b/content/docs/troubleshoot/docker/meta.json @@ -0,0 +1,6 @@ +{ + "title": "Docker", + "pages": [ + "expired-github-personal-access-token" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/index.mdx b/content/docs/troubleshoot/index.mdx new file mode 100644 index 00000000..a0ffe318 --- /dev/null +++ b/content/docs/troubleshoot/index.mdx @@ -0,0 +1,20 @@ +--- +title: Troubleshooting Overview +description: Comprehensive Coolify troubleshooting guides covering deployment errors, server issues, proxy problems, SSL certificates, and application configuration fixes. +--- + +# 🔧 Troubleshooting + +This section provides solutions for resolving issues you might encounter with Coolify. + +Check the sidebar for a list of all available trouble shooting guides. + + + + +**Please note that this troubleshooting guide is still being actively developed.** + + + + +If you have a suggestion for a new troubleshooting guide or want to contribute, feel free to submit a pull request or open an issue with a detailed description in our GitHub [docs repository](https://github.com/coollabsio/documentation-coolify/issues). diff --git a/content/docs/troubleshoot/installation/docker-install-failed.mdx b/content/docs/troubleshoot/installation/docker-install-failed.mdx new file mode 100644 index 00000000..4a105f80 --- /dev/null +++ b/content/docs/troubleshoot/installation/docker-install-failed.mdx @@ -0,0 +1,22 @@ +--- +title: Docker Installation Failed +description: Fix Docker installation failures during Coolify setup by using Ubuntu LTS versions or manually installing Docker 24+ on non-LTS operating systems. +--- + +# Docker Installation Failed +If the Coolify install script fails at the **“Installing Docker”** step, it’s most often due to the server running a **non-LTS version of the operating system** — especially common on **Ubuntu** systems. + +## Symptoms +Coolify install script fails with an error like: +```bash +ERROR: '27.0' not found amongst apt-cache madison results +``` + +## Solution +- Manually Install Docker + - Follow the official [Docker installation guide](https://docs.docker.com/engine/install/#server) to manually install Docker (version **24+**) + +OR + +- Use an LTS Version of Your OS + - Switch to a **Long-Term Support (LTS)** version of your operating system, such as **Ubuntu 22.04 LTS** or **Debian 12** diff --git a/content/docs/troubleshoot/installation/install-script-failed.mdx b/content/docs/troubleshoot/installation/install-script-failed.mdx new file mode 100644 index 00000000..24481793 --- /dev/null +++ b/content/docs/troubleshoot/installation/install-script-failed.mdx @@ -0,0 +1,618 @@ +--- +title: Coolify Install Script Failed +description: Debug and fix Coolify installation script failures with step-by-step troubleshooting for logs, Docker issues, port conflicts, and container problems. +--- + +# Coolify Installation Script Failed + +If the Coolify installation script completes but you cannot access Coolify, or if containers are missing, this guide will help you debug and fix the issue. + +## Common Symptoms + +- Installation script finishes but **no access URL is displayed** +- Script shows success but **Coolify web interface is not accessible** on port 8000 +- **Docker containers are missing** or not running +- Installation appears to complete but **something doesn't work** + + + + +Before following this guide, make sure you read the [Installation Prerequisites](/get-started/installation#before-you-begin) to ensure your system meets all requirements. + + + + +## Enable Verbose Mode for Debugging + +If you're experiencing installation issues, you can run the installation script in **verbose mode** to see exactly what commands are being executed: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh -o install.sh +bash -x install.sh 2>&1 | tee installation-debug.log +``` + +This will: + +- Show every command as it executes (`bash -x`) +- Display both stdout and stderr (`2>&1`) +- Save all output to `installation-debug.log` for later review (`tee`) + + + + +Verbose mode is extremely helpful for identifying exactly where the installation fails. Include the verbose log when asking for help in Discord. + + + + +## Step 1: Check Installation Logs + +The installation script creates log files that contain valuable information about what happened during installation. + +### Finding Your Logs + +The installation process creates two log files in `/data/coolify/source/`: + +1. **Installation log**: `installation-YYYYMMDD-HHMMSS.log` +2. **Upgrade log**: `upgrade-YYYY-MM-DD-HH-MM-SS.log` + + + + +The installation script calls the upgrade script internally, so both logs are created during initial installation. + + + + +### View Your Logs + +Find your most recent log files: + +```bash +# List all log files sorted by date (most recent first) +ls -lt /data/coolify/source/*.log | head -5 +``` + +View the installation log: + +```bash +# Replace the date/time with your actual log file +tail -100 /data/coolify/source/installation-YYYYMMDD-HHMMSS.log + +# Or view the entire log +cat /data/coolify/source/installation-YYYYMMDD-HHMMSS.log +``` + +View the upgrade log: + +```bash +# Replace the date/time with your actual log file +tail -100 /data/coolify/source/upgrade-YYYY-MM-DD-HH-MM-SS.log + +# Or view the entire log +cat /data/coolify/source/upgrade-YYYY-MM-DD-HH-MM-SS.log +``` + +### What to Look For + +Look for error messages containing: + +- `ERROR:` +- `Failed to` +- `could not` +- `Connection refused` +- `Permission denied` +- `No such file or directory` + +## Step 2: Verify Docker Installation + +Check if Docker is properly installed and running: + +```bash +# Check Docker version +docker --version + +# Check Docker Compose plugin +docker compose version + +# Check if Docker daemon is running +sudo systemctl status docker +``` + +**Expected output** for `docker --version`: + +``` +Docker version 27.0.x, build xxxxx +``` + +If Docker is not installed or not running: + +```bash +# Start Docker service +sudo systemctl start docker + +# Enable Docker to start on boot +sudo systemctl enable docker +``` + + + + +If you installed Docker via snap, you must remove it and reinstall Docker properly. The installation script will detect and block snap-based Docker installations. + +```bash +# Remove Docker snap +sudo snap remove docker + +# Then re-run the Coolify installation script +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash +``` + + + + + +## Step 3: Check Port Availability + +Coolify requires specific ports to be available. The most critical port for initial installation is **port 8000**. + +### Check Port 8000 (Coolify Web Interface) + + + + +Port 8000 must be available for Coolify's web interface. If something else is using this port, installation will fail silently. + + + + +**On Linux with `ss` (recommended):** + +```bash +sudo ss -tulpn | grep :8000 +``` + +**On Linux with `lsof`:** + +```bash +sudo lsof -i :8000 +``` + +**On Linux with `netstat`:** + +```bash +sudo netstat -tulpn | grep :8000 +``` + +If these commands return **no output**, the port is free ✓ + +If they show output, **something is using port 8000**. Example: + +``` +tcp LISTEN 0 4096 *:8000 *:* users:(("some-app",pid=1234,fd=3)) +``` + +### Check Other Coolify Ports + +```bash +# Port 6001 (Soketi/Real-time) +sudo ss -tulpn | grep :6001 + +# Port 5432 (PostgreSQL - usually internal only) +sudo ss -tulpn | grep :5432 + +# Port 6379 (Redis - usually internal only) +sudo ss -tulpn | grep :6379 +``` + +### Fix Port Conflicts + +If port 8000 is in use, you have two options: + +**Option 1: Stop the conflicting service** + +```bash +# Find the process ID (PID) from the ss/lsof output +sudo kill + +# Or stop the service if you know what it is +sudo systemctl stop +``` + +**Option 2: Change Coolify's port** (Advanced) + +Modify `/data/coolify/source/.env` and change the `APP_PORT` variable, then re-run the installation script. + +## Step 4: Validate Docker Containers + +Check if all Coolify containers are running: + +```bash +# List all containers (running and stopped) +docker ps -a + +# Filter for Coolify containers only +docker ps -a --filter "name=coolify" +``` + +### Expected Containers + +You should see these containers: + +| Container Name | Status | Purpose | +| ------------------ | ------ | -------------------------- | +| `coolify` | Up | Main Coolify application | +| `coolify-realtime` | Up | Real-time updates (Soketi) | +| `coolify-db` | Up | PostgreSQL database | +| `coolify-redis` | Up | Redis cache | + + + + +The `coolify-proxy` container is NOT created during installation. It's created later when you deploy your first application or enable a proxy. + + + + +### Check Container Status + +If containers are **stopped** or **exited**, check their logs: + +```bash +# View logs for specific container +docker logs coolify +docker logs coolify-realtime +docker logs coolify-db +docker logs coolify-redis + +# Follow logs in real-time +docker logs -f coolify +``` + +### Restart Stopped Containers + +If containers are stopped, try starting them: + +```bash +# Start all Coolify containers +cd /data/coolify/source +docker compose --env-file .env -f docker-compose.yml -f docker-compose.prod.yml up -d +``` + +## Step 5: Verify Docker Images + +Check if all required Docker images were pulled successfully: + +```bash +# List Coolify-related images +docker images | grep coolify +docker images | grep ghcr.io/coollabsio +``` + +### Expected Images + +You should see at least: + +- `ghcr.io/coollabsio/coolify` (or your custom registry) +- `ghcr.io/coollabsio/coolify-helper` +- `ghcr.io/coollabsio/coolify-realtime` + +### Missing Images + +If images are missing, there may have been a network issue during installation. Try pulling them manually: + +```bash +# Pull the latest Coolify images +docker pull ghcr.io/coollabsio/coolify:latest +docker pull ghcr.io/coollabsio/coolify-helper:latest +docker pull ghcr.io/coollabsio/coolify-realtime:latest + +# Then restart Coolify +cd /data/coolify/source +docker compose --env-file .env -f docker-compose.yml -f docker-compose.prod.yml up -d --force-recreate +``` + + + + +If you're using a custom Docker registry that requires authentication, you may need to run `docker login` first. + + + + +## Step 6: Check Docker Networks + +Verify that the Coolify Docker network exists: + +```bash +# List Docker networks +docker network ls | grep coolify +``` + +**Expected output:** + +``` + coolify bridge local +``` + +If the network doesn't exist, create it: + +```bash +# Try creating with IPv6 support first +docker network create --attachable --ipv6 coolify + +# If that fails, create without IPv6 +docker network create --attachable coolify +``` + +## Step 7: Verify Disk Space + +Check available disk space: + +```bash +df -h / +``` + +Coolify requires: + +- **Minimum 30GB total disk space** +- **Minimum 20GB available space** + + + + +If you have less than the required space, the installation may complete but fail during operation. Consider: + +- Cleaning up unused Docker resources: `docker system prune -a` +- Expanding your disk/volume +- Using a larger server + + + + +## Common Issues & Solutions + +### Issue: Script Completes But No Access URL Shown + +**Symptoms:** + +- Installation script finishes +- No error messages +- But no URL like `http://your-ip:8000` is displayed + +**Possible causes:** + +1. Container creation failed silently +2. Network issues prevented fetching public IP +3. Docker images failed to pull + +**Solution:** + +```bash +# Check if containers are running +docker ps --filter "name=coolify" + +# If containers are missing, check upgrade log +cat /data/coolify/source/upgrade-*.log + +# Look for errors in the log, then re-run upgrade +cd /data/coolify/source +bash upgrade.sh latest latest ghcr.io false +``` + +### Issue: Port 8000 Already in Use + +**Symptoms:** + +- Installation completes +- Containers appear to be running +- But Coolify web interface is not accessible + +**Solution:** + +See [Step 3: Check Port Availability](#step-3-check-port-availability) above. + +### Issue: Docker Image Pull Failures + +**Symptoms:** + +- Installation takes very long time +- Errors like "failed to pull image" or "manifest unknown" +- Some Docker images are missing + +**Possible causes:** + +1. Network connectivity issues +2. DNS resolution problems +3. Registry rate limiting +4. Custom registry authentication issues + +**Solution:** + +```bash +# Test network connectivity to GitHub Container Registry +curl -I https://ghcr.io + +# Check DNS resolution +nslookup ghcr.io + +# Try pulling images manually +docker pull ghcr.io/coollabsio/coolify:latest + +# If using custom registry, login first +docker login your-registry.com +``` + +### Issue: Insufficient Permissions + +**Symptoms:** + +- "Permission denied" errors in logs +- Cannot create directories +- Cannot modify files in `/data/coolify/` + +**Solution:** + +The installation script must be run as **root** or with **sudo**: + +```bash +# Re-run with sudo +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash +``` + +### Issue: SSH Configuration Problems + +**Symptoms:** + +- Installation completes +- Coolify accessible but cannot connect to localhost server +- SSH-related errors in Coolify interface + +**Possible cause:** + +- SSH `PermitRootLogin` is disabled +- SSH keys not properly configured + +**Solution:** + +Check SSH configuration: + +```bash +# Check PermitRootLogin setting +sudo sshd -T | grep permitrootlogin +``` + +Should show: + +- `permitrootlogin yes`, or +- `permitrootlogin prohibit-password`, or +- `permitrootlogin without-password` + +If it shows `permitrootlogin no`, see the [OpenSSH Configuration Guide](/knowledge-base/server/openssh). + +## Manual Verification Checklist + +Run these commands to get a complete diagnostic report: + +```bash +echo "=== COOLIFY INSTALLATION DIAGNOSTICS ===" +echo "" + +echo "1. Installation Logs:" +ls -lt /data/coolify/source/*.log 2>/dev/null | head -5 || echo "No logs found" +echo "" + +echo "2. Docker Version:" +docker --version +docker compose version +echo "" + +echo "3. Docker Service Status:" +sudo systemctl status docker --no-pager -l +echo "" + +echo "4. Coolify Containers:" +docker ps -a --filter "name=coolify" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +echo "" + +echo "5. Docker Images:" +docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep -E "REPOSITORY|coolify" +echo "" + +echo "6. Docker Networks:" +docker network ls | grep -E "NETWORK|coolify" +echo "" + +echo "7. Port 8000 Status:" +sudo ss -tulpn | grep :8000 || echo "Port 8000 is free" +echo "" + +echo "8. Disk Space:" +df -h / +echo "" + +echo "9. Environment File:" +ls -lh /data/coolify/source/.env 2>/dev/null || echo ".env file not found" +echo "" +``` + +Copy the output of this diagnostic script when asking for help. + +## Recovery Steps + +### Clean Re-installation + +If you want to completely uninstall and start fresh: + + + + +This will remove all Coolify data including applications, databases, and settings! + + + + +Follow the [Uninstallation Guide](/get-started/uninstallation) to properly remove Coolify, then re-run the installation script: + +```bash +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash +``` + +### Retry Installation Without Full Reset + +If you just want to retry without losing data: + +```bash +# Re-run the installation script +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bash +``` + +The script is designed to be **idempotent** (safe to run multiple times). + +### Use Manual Installation + +If the automated script continues to fail, try the [Manual Installation](/get-started/installation#manual-installation) method. + +## Getting Help + +If you've followed all the steps above and still have issues, please ask for help in our [Discord community](https://coolify.io/discord). + +### Information to Provide + +When asking for help, include: + +1. **Your system information:** + + ```bash + cat /etc/os-release + uname -m + ``` + +2. **Installation logs:** (last 100 lines) + + ```bash + tail -100 /data/coolify/source/installation-*.log + tail -100 /data/coolify/source/upgrade-*.log + ``` + +3. **Docker status:** + + ```bash + docker ps -a --filter "name=coolify" + docker images | grep coolify + ``` + +4. **Any error messages** you see in logs or on screen + +5. **What you've already tried** to fix the issue + +This information will help the community diagnose your problem much faster! + +## Related Documentation + +- [Installation Guide](/get-started/installation) +- [Manual Installation](/get-started/installation#manual-installation) +- [Firewall Configuration](/knowledge-base/server/firewall) +- [OpenSSH Configuration](/knowledge-base/server/openssh) +- [Raspberry Pi OS Setup](/knowledge-base/how-to/raspberry-pi-os) +- [Docker Installation Failed](/troubleshoot/installation/docker-install-failed) diff --git a/content/docs/troubleshoot/installation/meta.json b/content/docs/troubleshoot/installation/meta.json new file mode 100644 index 00000000..26e7ced0 --- /dev/null +++ b/content/docs/troubleshoot/installation/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Installation", + "pages": [ + "install-script-failed", + "docker-install-failed" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/meta.json b/content/docs/troubleshoot/meta.json new file mode 100644 index 00000000..14135f8d --- /dev/null +++ b/content/docs/troubleshoot/meta.json @@ -0,0 +1,11 @@ +{ + "title": "Troubleshoot", + "pages": [ + "installation", + "applications", + "dashboard", + "docker", + "server", + "dns-and-domains" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/server/connection-issues.mdx b/content/docs/troubleshoot/server/connection-issues.mdx new file mode 100644 index 00000000..a2c1ddca --- /dev/null +++ b/content/docs/troubleshoot/server/connection-issues.mdx @@ -0,0 +1,43 @@ +--- +title: Connection Unstable +description: Fix unstable Coolify server connections by removing UFW LIMIT rules, adjusting iptables, and configuring firewall settings for port 22 SSH access. +--- + +# Connection Unstable + +If you're experiencing unstable connections, most of the times (90% of the cases) a firewall issue, ufw, iptables or some configuration on your server or between your Coolify instance (or Coolify Cloud) and your server. + +## Symptoms + +- Server is sometimes reachable, sometimes not. +- You receive a lot of failed connection lost emails. + +## Diagnosis + +- Check your UFW rules with `ufw status numbered` and see if you have a `LIMIT` rule for port 22. +- Check your iptables rules with `iptables -L -v -n` and see if you have a `LIMIT` rule for port 22. +- Check your server logs (`/var/log/ufw.log`, `/var/log/iptables.log`, `/var/log/auth.log`, `/var/log/kern.log`) for any firewall related errors. + +## Solution + +- UFW + - `ufw status numbered` - if you have port 22 open, but with a `LIMIT` rule, this is the problem. + - `ufw delete ` - delete the rule - you probably have IPV4 and IPV6 rules, so you need to delete both. + - After you deleted the rule, you need to check the status with `ufw status numbered` and see that the rule is deleted and which rule number is next. + - `ufw allow 22/tcp` - add the rule without a limit. + + OR + + - `ufw limit 22/tcp 100/minute` - add a higher limit. + +In case of Coolify Cloud, you can enable connection from Coolify Cloud IP addresses by adding the following to the UFW rules for each IP: + +```bash +# For each IPv4 address +ufw allow from to any port 22 + +# For each IPv6 subnet +ufw allow from to any port 22 +``` + +> You can find the current Coolify Cloud IP addresses at https://coolify.io/ipv4.txt and https://coolify.io/ipv6.txt diff --git a/content/docs/troubleshoot/server/crash-during-build.mdx b/content/docs/troubleshoot/server/crash-during-build.mdx new file mode 100644 index 00000000..3573c2ef --- /dev/null +++ b/content/docs/troubleshoot/server/crash-during-build.mdx @@ -0,0 +1,65 @@ +--- +title: Server Crash During Build +description: Fix server crashes during Coolify builds by offloading to external build servers, using GitHub Actions, or upgrading server resources for Docker image builds. +--- + +# Server Unresponsive or crashes during Build + +Coolify supports two deployment methods: deploying with a **pre-built** Docker image and building from **source**. Knowing which method you're using can help you fix performance problems better. + +## 1. Understanding Your Deployment Method + +### A. Pre-built Docker Image Deployment + +- Coolify starts a new container from an existing Docker image that you or someone else have already built. + +### B. Building from Source Deployment + +- Coolify builds a Docker image on your server using your application’s source code, and then starts a container from this newly created docker image. + +## 2. Troubleshooting Performance Issues + +If your server becomes very slow or crashes during deployment, consider the following steps based on your deployment method: + +- **For Pre-built Image Deployments:** + + - Since the container is started directly from the docker image, high resource usage is most likely due to the running application. + - **Solution:** Consider upgrading your server to better accommodate the application’s resource needs. + +- **For Building from Source Deployments:** + + - The docker image build process can overload your server. + - **Solution:** Offload the build process to an external [Build Server](/knowledge-base/server/build-server), or use an alternative method such as [GitHub Actions](https://docs.github.com/en/actions) to handle the build externally. Alternatively, consider upgrading your server’s capacity. + +- **General Tip:** + SSH into your server and run `htop` to monitor processes. Identify any process consuming excessive resources, and kill it if necessary. + +## 3. Offloading Builds with GitHub Actions + +To reduce the load on your server during deployments, follow this process: + +- **Process:** + - Use [GitHub Actions](https://docs.github.com/en/actions) to build your Docker image externally. + - Push the built image to a container registry (e.g., [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry)). + - Once the build is complete, configure coolify to deploy the new version automatically. +- **Benefit:** This method minimizes the workload on your server, resulting in smoother deployments. + +- **Learn More:** [View our GitHub Actions workflow file](https://github.com/coollabsio/documentation-coolify/blob/main/.github/workflows/production-build.yml). + +## Summary + +- **Deployment Methods:** + - **Pre-built Image:** Directly starts a container from an existing image. + - **Building from Source:** Builds an image on your server before starting a container. +- **Troubleshooting:** + - Identify if the issue is due to the application’s resource needs or the image build process. + - Upgrade your server or offload builds as needed. +- **Optimization:** + - Using GitHub Actions to build Docker images externally can significantly reduce local resource usage. + +## Support + +If none of the above steps work, then follow this: + +- **Community Help:** Join our [Discord community](https://coolify.io/discord) and create a post in the support forum channel. +- **What to Share:** The issue you are facing, your server specifications (e.g., operating system, CPU, RAM), and a description of the steps you’ve already tried. diff --git a/content/docs/troubleshoot/server/meta.json b/content/docs/troubleshoot/server/meta.json new file mode 100644 index 00000000..08ff098c --- /dev/null +++ b/content/docs/troubleshoot/server/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Server", + "pages": [ + "connection-issues", + "crash-during-build", + "two-factor-stopped-working", + "raspberry-crashes", + "validation-issues" + ] +} \ No newline at end of file diff --git a/content/docs/troubleshoot/server/raspberry-crashes.mdx b/content/docs/troubleshoot/server/raspberry-crashes.mdx new file mode 100644 index 00000000..3d115296 --- /dev/null +++ b/content/docs/troubleshoot/server/raspberry-crashes.mdx @@ -0,0 +1,18 @@ +--- +title: Raspberry Pi Crashes +description: Fix Raspberry Pi crashes on Coolify by upgrading to 4GB+ RAM or limiting Docker memory usage on 2GB models with slow SD card configurations. +--- + +# Raspberry Pi Crashes +If you're using a Raspberry Pi with only 2GB of RAM, you may experience system crashes even with swap space enabled. + +This is likely due to the slower SD cards often used in Raspberry Pis, which can be unstable. + +## Solution +- Upgrade to a Raspberry Pi with 4GB+ of RAM for better stability. +- Or, limit Docker’s memory usage by adding the following configuration to your `/etc/docker/daemon.json` file: + ```json + { + "memory": "1.8g" + } + ``` \ No newline at end of file diff --git a/content/docs/troubleshoot/server/two-factor-stopped-working.mdx b/content/docs/troubleshoot/server/two-factor-stopped-working.mdx new file mode 100644 index 00000000..6ae17989 --- /dev/null +++ b/content/docs/troubleshoot/server/two-factor-stopped-working.mdx @@ -0,0 +1,17 @@ +--- +title: 2FA Stopped Working +description: Fix two-factor authentication failures in Coolify by synchronizing server time with NTP, checking systemd-timesyncd, and configuring firewall port 123 access. +--- + +# 2FA Stopped Working +It is usually a time synchronization issue. + +## Diagnosis +- Check your server's time with `date` - if the time is off, you need to synchronize it. +- Check your NTP configuration with `cat /etc/ntp.conf`. +- Check with `systemctl status systemd-timesyncd.service` if your operating system is using systemd to synchronize time. +- Check your firewall (`ufw`, `iptables`) rules to see if you have any rules that block time synchronization ports (`123/udp, 123/tcp`). + +## Solution +- If your operating system is using systemd, you can synchronize the time with `sudo timedatectl set-ntp true`. +- If your operating system is not using systemd, you can synchronize the time with `sudo ntpdate ntp.ubuntu.com`. \ No newline at end of file diff --git a/content/docs/troubleshoot/server/validation-issues.mdx b/content/docs/troubleshoot/server/validation-issues.mdx new file mode 100644 index 00000000..b26cfc56 --- /dev/null +++ b/content/docs/troubleshoot/server/validation-issues.mdx @@ -0,0 +1,14 @@ +--- +title: Server Validation Issues +description: Resolve Coolify server validation errors by verifying SSH private key format includes BEGIN and END OPENSSH PRIVATE KEY headers to fix libcrypto errors. +--- + +# Server Validation Issues + +You cannot validate your server because of a validation error. + +## Symptoms +- During validation you receive a `error in libcrypto` error. + +## Solution +Check your private key added to Coolify if it is correct, it is probably missing a few things, like `-----BEGIN OPENSSH PRIVATE KEY-----` and `-----END OPENSSH PRIVATE KEY-----`. diff --git a/docs/applications/build-packs/docker-compose.md b/docs/applications/build-packs/docker-compose.md index 5015c451..8b54f5e3 100644 --- a/docs/applications/build-packs/docker-compose.md +++ b/docs/applications/build-packs/docker-compose.md @@ -24,7 +24,7 @@ On the Coolify dashboard, open your project and click the **Create New Resource* **A.** If your Git repository is public, choose the **Public Repository** option. -**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.) +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) ### 3. Select Your Git Repository diff --git a/docs/applications/build-packs/dockerfile.md b/docs/applications/build-packs/dockerfile.md index 0d0793a0..ab36670e 100644 --- a/docs/applications/build-packs/dockerfile.md +++ b/docs/applications/build-packs/dockerfile.md @@ -25,7 +25,7 @@ On the Coolify dashboard, open your project and click the **Create New Resource* **A.** If your Git repository is public, choose the **Public Repository** option. -**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.) +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) ### 3. Select Your Git Repository diff --git a/docs/applications/build-packs/nixpacks.md b/docs/applications/build-packs/nixpacks.md index b88a7c1d..edfe1361 100644 --- a/docs/applications/build-packs/nixpacks.md +++ b/docs/applications/build-packs/nixpacks.md @@ -29,7 +29,7 @@ On Coolify dashboard open your project and click the **Create New Resource** but **A.** If your Git repository is public, choose the **Public Repository** option. -**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.) +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) ### 3. Select Your Git Repository diff --git a/docs/applications/build-packs/static.md b/docs/applications/build-packs/static.md index ef687ca3..0cad4746 100644 --- a/docs/applications/build-packs/static.md +++ b/docs/applications/build-packs/static.md @@ -31,7 +31,7 @@ On Coolify dashboard open your project and click the **Create New Resource** but **A.** If your Git repository is public, choose the **Public Repository** option. -**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.) +**B.** If your repository is private, you can select **Github App** or **Deploy Key**. (These methods require extra configuration. You can check the guides on setting up a [Github App](/applications/ci-cd/github/setup-app) or [Deploy Key](/applications/ci-cd/github/deploy-key) if needed.) ### 4. Select Your Git Repository diff --git a/docs/applications/ci-cd/github/deploy-key.md b/docs/applications/ci-cd/github/deploy-key.md index fb5a4db5..da668acb 100644 --- a/docs/applications/ci-cd/github/deploy-key.md +++ b/docs/applications/ci-cd/github/deploy-key.md @@ -121,9 +121,8 @@ Select the private key you created in Coolify from the list of available private 1. Paste the SSH URL you copied from GitHub (e.g., `git@github.com:ShadowArcanist/coolify-dev.git`). -2. After entering the repository link, configure the buildpack, ports, and other settings. (Refer to our dedicated guide on [builds](/builds/introduction) for more details.) +2. After entering the repository link, configure the buildpack, ports, and other settings. (Refer to our dedicated guide on [applications](/applications) for more details.) Once configured, deploy your application. That's it! - diff --git a/docs/applications/ci-cd/introduction.md b/docs/applications/ci-cd/introduction.md index 0deccf9e..17648e1f 100644 --- a/docs/applications/ci-cd/introduction.md +++ b/docs/applications/ci-cd/introduction.md @@ -95,7 +95,7 @@ While we provide detailed integration guides for popular platforms, **Coolify wo Ready to connect your Git provider? Choose your platform for detailed setup guides: -- **[GitHub Integration](/applications/ci-cd/github/integration)** - Connect GitHub repositories +- **[GitHub Integration](/applications/ci-cd/github/overview)** - Connect GitHub repositories - **[GitLab Integration](/applications/ci-cd/gitlab/integration)** - Connect GitLab repositories - **[Bitbucket Integration](/applications/ci-cd/bitbucket/integration)** - Connect Bitbucket repositories - **[Gitea Integration](/applications/ci-cd/gitea/integration)** - Connect self-hosted Gitea diff --git a/docs/get-started/cloud.md b/docs/get-started/cloud.md index d0979066..9359da48 100644 --- a/docs/get-started/cloud.md +++ b/docs/get-started/cloud.md @@ -43,20 +43,20 @@ Coolify Cloud uses the same open-source codebase, so there are no locked-behind- - ::: details Detailed Server Connection Guide 1. **Add Private Key:** Login to your Coolify account (or create one if you’re new) and Add a new private key - +
- + *** 2. **Add a Server:** Navigate to the **Servers** tab and add a new server by entering your Hetzner server’s IPv4 address. - +
- + *** 3. **Validate Server:** Click **Validate Server & Install Docker Engine**. Coolify will automatically install all necessary components on your server. - + *** 4. **Check Status:** Once finished, you should see a green **Proxy Running** status indicating everything is set up. - + ::: 5. **Deploy Your Applications** diff --git a/docs/get-started/contribute/service.md b/docs/get-started/contribute/service.md index b13549cf..3663cd52 100644 --- a/docs/get-started/contribute/service.md +++ b/docs/get-started/contribute/service.md @@ -110,7 +110,7 @@ In the [Coolify Docs Contribute section](/get-started/contribute/documentation) ::: info HOW THE SERVICE LIST IS BUILT The services overview page and the [All Services](/services/all) directory are **generated automatically** from the frontmatter of each markdown file in `docs/services/`. You do **not** need to edit `List.vue` or `all.md` manually anymore. The generators run as part of `bun run dev`, `bun run build`, and `bun run preview`. -- `scripts/generate-service-list.mjs` → writes `docs/.vitepress/theme/data/services.json` (consumed by the services overview component) +- `scripts/generate-service-list.mjs` → writes `src/generated/services.json` (consumed by the services overview component) - `scripts/generate-services-page.mjs` → writes `docs/services/all.md` - Both scripts share `scripts/services-data.mjs`, which parses each service's frontmatter and resolves its logo from `docs/public/images/services/` ::: @@ -173,7 +173,7 @@ As soon as you have your local setup ready, follow these steps to add your new s bun run generate:services ``` - This refreshes `docs/.vitepress/theme/data/services.json` and `docs/services/all.md`. Commit both regenerated files alongside your new service page. + This refreshes `src/generated/services.json` and `docs/services/all.md`. Commit both regenerated files alongside your new service page. 5. Submit a Pull Request diff --git a/docs/services/actualbudget.md b/docs/services/actualbudget.md index ecc27b12..0333030f 100644 --- a/docs/services/actualbudget.md +++ b/docs/services/actualbudget.md @@ -7,7 +7,7 @@ category: "Finance" icon: "/docs/images/services/actualbudget-logo.webp" --- - + ## What is Actual Budget? diff --git a/docs/services/argilla.md b/docs/services/argilla.md index 7e8d9b03..304549c6 100644 --- a/docs/services/argilla.md +++ b/docs/services/argilla.md @@ -7,7 +7,7 @@ category: "AI" icon: "/docs/images/services/argilla-logo.svg" --- - + ## What is Argilla? diff --git a/docs/services/audiobookshelf.md b/docs/services/audiobookshelf.md index 86556372..49883907 100644 --- a/docs/services/audiobookshelf.md +++ b/docs/services/audiobookshelf.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/audiobookshelf-logo.svg" # Audiobookshelf - + ## What is Audiobookshelf diff --git a/docs/services/bluesky-pds.md b/docs/services/bluesky-pds.md index 555a26c8..3052bd20 100644 --- a/docs/services/bluesky-pds.md +++ b/docs/services/bluesky-pds.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/bluesky-logo.svg" # Bluesky PDS - + ## What is a Bluesky PDS? diff --git a/docs/services/bookstack.md b/docs/services/bookstack.md index ddaa43bc..b0d88fc5 100644 --- a/docs/services/bookstack.md +++ b/docs/services/bookstack.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/bookstack-logo.png" # Bookstack - + ## What is Bookstack diff --git a/docs/services/calibre-web.md b/docs/services/calibre-web.md index 173f5dee..75e89b4a 100644 --- a/docs/services/calibre-web.md +++ b/docs/services/calibre-web.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/calibreweb-logo.svg" # Calibre Web - + ## What is Calibre Web diff --git a/docs/services/castopod.md b/docs/services/castopod.md index e0784b1c..d238dee9 100644 --- a/docs/services/castopod.md +++ b/docs/services/castopod.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/castopod-logo.svg" # Castopod - + ## What is Castopod diff --git a/docs/services/chroma.md b/docs/services/chroma.md index e30b4edf..c515cc15 100644 --- a/docs/services/chroma.md +++ b/docs/services/chroma.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/chroma-logo.svg" # Chroma - + ## What is Chroma? diff --git a/docs/services/convex.md b/docs/services/convex.md index d1d758ac..09cf3a43 100644 --- a/docs/services/convex.md +++ b/docs/services/convex.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/convex-logo.svg" # Convex - + ## What is Convex diff --git a/docs/services/dashy.md b/docs/services/dashy.md index 6fc23d30..d31c7f14 100644 --- a/docs/services/dashy.md +++ b/docs/services/dashy.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/dashy-logo.png" # Dashy - + ## What is Dashy diff --git a/docs/services/denokv.md b/docs/services/denokv.md index 5647f39e..f422b273 100644 --- a/docs/services/denokv.md +++ b/docs/services/denokv.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/denolookingup-logo.svg" # Denokv - + ## What is Deno KV diff --git a/docs/services/dolibarr.md b/docs/services/dolibarr.md index 4f694719..abd01428 100644 --- a/docs/services/dolibarr.md +++ b/docs/services/dolibarr.md @@ -4,12 +4,12 @@ description: "Open-source ERP and CRM software." og: description: "Run Dolibarr ERP/CRM on Coolify with invoicing, inventory, projects, HR management, and business process automation for small to medium enterprises." category: "Business" -icon: "/docs/images/services/dolibarr-logo.png" +icon: "/docs/images/services/dolibarr.png" --- # Dolibarr - + ## What is Dolibarr diff --git a/docs/services/faraday.md b/docs/services/faraday.md index ba11dcf1..87bfb231 100644 --- a/docs/services/faraday.md +++ b/docs/services/faraday.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/faraday-logo.png" # Faraday - + ## What is Faraday diff --git a/docs/services/flipt.md b/docs/services/flipt.md index fd988c79..93104f81 100644 --- a/docs/services/flipt.md +++ b/docs/services/flipt.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/flipt-logo.svg" # Flipt - + ## What is Flipt diff --git a/docs/services/homebox.md b/docs/services/homebox.md index 059c5ef2..04521a45 100644 --- a/docs/services/homebox.md +++ b/docs/services/homebox.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/homebox-logo.svg" # Homebox - + ## What is Homebox? diff --git a/docs/services/introduction.md b/docs/services/introduction.md index d89234ad..0381d449 100644 --- a/docs/services/introduction.md +++ b/docs/services/introduction.md @@ -6,7 +6,7 @@ description: Deploy 200+ pre-configured open-source applications instantly with ## What are Services? -Services in Coolify are deployments based on **Docker Compose files** that are stored directly on your server. Unlike [Applications](/applications/introduction), Services are **not connected to a Git source** — they don't pull code from a repository or rebuild on commits. +Services in Coolify are deployments based on **Docker Compose files** that are stored directly on your server. Unlike [Applications](/applications), Services are **not connected to a Git source** — they don't pull code from a repository or rebuild on commits. There are two types of Services in Coolify: diff --git a/docs/services/joomla.md b/docs/services/joomla.md index 8eb71923..044ffef1 100644 --- a/docs/services/joomla.md +++ b/docs/services/joomla.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/joomla-logo.svg" # Joomla - + ## What is Joomla diff --git a/docs/services/marimo.md b/docs/services/marimo.md index 93a10300..f43b7184 100644 --- a/docs/services/marimo.md +++ b/docs/services/marimo.md @@ -7,7 +7,7 @@ category: "Development" icon: "/docs/images/services/marimo.svg" --- - + ## What is Marimo? diff --git a/docs/services/mealie.md b/docs/services/mealie.md index be409ba0..b444f307 100644 --- a/docs/services/mealie.md +++ b/docs/services/mealie.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/mealie-logo.png" # Mealie - + ## What is Mealie diff --git a/docs/services/newapi.md b/docs/services/newapi.md index 533b60fc..0b0e86db 100644 --- a/docs/services/newapi.md +++ b/docs/services/newapi.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/newapi-logo.png" # NewAPI - + ## What is NewAPI? diff --git a/docs/services/newt-pangolin.md b/docs/services/newt-pangolin.md index faa7e987..f0e4cb6f 100644 --- a/docs/services/newt-pangolin.md +++ b/docs/services/newt-pangolin.md @@ -7,7 +7,7 @@ category: "Networking" icon: "/docs/images/services/pangolin_newt.svg" --- -![Newt Pangolin](/public/images/services/pangolin_newt.svg) +Newt Pangolin ## What is Newt? diff --git a/docs/services/ollama.md b/docs/services/ollama.md index 9e3eaf52..24ed8bed 100644 --- a/docs/services/ollama.md +++ b/docs/services/ollama.md @@ -7,7 +7,7 @@ category: "AI" icon: "/docs/images/services/ollama-logo.svg" --- - + ## What is Ollama? diff --git a/docs/services/opnform.md b/docs/services/opnform.md index d8c86cdf..365d802d 100644 --- a/docs/services/opnform.md +++ b/docs/services/opnform.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/opnform.svg" # OpnForm -![OpnForm](/public/images/services/opnform.svg) +OpnForm ## What is OpnForm? diff --git a/docs/services/plane.md b/docs/services/plane.md index e1d32303..1077159f 100644 --- a/docs/services/plane.md +++ b/docs/services/plane.md @@ -7,7 +7,7 @@ category: "Project Management" icon: "/docs/images/services/plane-logo.svg" --- -![Plane](/public/images/services/plane-logo.svg) +Plane ## What is Plane? diff --git a/docs/services/prowlarr.md b/docs/services/prowlarr.md index 9af6d7c0..1c7eb4be 100644 --- a/docs/services/prowlarr.md +++ b/docs/services/prowlarr.md @@ -7,7 +7,7 @@ category: "Media" icon: "/docs/images/services/prowlarr-logo.svg" --- - + ## What is Prowlarr? diff --git a/docs/services/rybbit.md b/docs/services/rybbit.md index 71852e30..db10e019 100644 --- a/docs/services/rybbit.md +++ b/docs/services/rybbit.md @@ -7,7 +7,7 @@ category: "Analytics" icon: "/docs/images/services/rybbit.svg" --- -![Rybbit](/public/images/services/rybbit.svg) +Rybbit ## What is Rybbit? diff --git a/docs/services/wireguard-easy.md b/docs/services/wireguard-easy.md index 6a912652..b33bcb9b 100644 --- a/docs/services/wireguard-easy.md +++ b/docs/services/wireguard-easy.md @@ -9,7 +9,7 @@ icon: "/docs/images/services/wireguardeasy-logo.svg" # Wireguard Easy - + ## What is Wireguard Easy diff --git a/docs/troubleshoot/applications/no-available-server.md b/docs/troubleshoot/applications/no-available-server.md index 285b4686..df80fdb3 100644 --- a/docs/troubleshoot/applications/no-available-server.md +++ b/docs/troubleshoot/applications/no-available-server.md @@ -80,7 +80,7 @@ Look for error messages like `client version 1.24 is too old` which indicates a **Missing dependencies in container:** - Ensure that all necessary tools are installed in your Docker image for the health check to work. [Applications](/applications/index) will need either `curl` or `wget` installed. + Ensure that all necessary tools are installed in your Docker image for the health check to work. [Applications](/applications) will need either `curl` or `wget` installed. ```dockerfile # Add curl to your Dockerfile @@ -164,7 +164,7 @@ Make sure the protocol in your domain configuration matches how you want to acce - In [Applications](/applications/index), this is defined in the `Ports Exposes` field. + In [Applications](/applications), this is defined in the `Ports Exposes` field. diff --git a/nginx/nginx.conf b/nginx/nginx.conf index e079bf7d..8773057c 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -34,7 +34,7 @@ http { include /etc/nginx/conf.d/redirects.conf; location / { - root /usr/share/nginx/html/docs; + root /usr/share/nginx/html; index index.html; # # Add rewrite rule to handle URLs without trailing slash # rewrite ^([^.]*[^/])$ $1/ permanent; @@ -46,7 +46,7 @@ http { # a folder without index.html raises 403 in this setup error_page 403 /404.html; location = /favicon.ico { - rewrite ^/favicon.ico$ /docs/favicon.ico; + rewrite ^/favicon.ico$ /docs/brand/favicon.ico; access_log off; log_not_found off; } diff --git a/nginx/redirects.conf b/nginx/redirects.conf index 2cb21ae8..69b7637b 100644 --- a/nginx/redirects.conf +++ b/nginx/redirects.conf @@ -1,12 +1,12 @@ # Redirects for Knowledge Base -> New Paths -location = /knowledge-base/cloudflare/tunnels { return 301 /docs/knowledge-base/cloudflare/tunnels/overview; } +location = /knowledge-base/cloudflare/tunnels { return 301 /docs/integrations/cloudflare/tunnels/overview; } location = /knowledge-base/traefik/basic-auth { return 301 /docs/knowledge-base/proxy/traefik/basic-auth; } location = /knowledge-base/traefik/custom-ssl-certs { return 301 /docs/knowledge-base/proxy/traefik/custom-ssl-certs; } location = /knowledge-base/traefik/dashboard { return 301 /docs/knowledge-base/proxy/traefik/dashboard; } -location = /knowledge-base/traefik/dynamic-configurations { return 301 /docs/knowledge-base/proxy/traefik/dynamic-configurations; } +location = /knowledge-base/traefik/dynamic-configurations { return 301 /docs/knowledge-base/proxy/traefik/dynamic-config; } location = /knowledge-base/traefik/healthcheck { return 301 /docs/knowledge-base/health-checks; }location = /knowledge-base/traefik/load-balancing { return 301 /docs/knowledge-base/proxy/traefik/load-balancing; } location = /knowledge-base/traefik/redirects { return 301 /docs/knowledge-base/proxy/traefik/redirects; } -location = /knowledge-base/traefik/wildcard-certificates { return 301 /docs/knowledge-base/proxy/traefik/wildcard-certificates; } +location = /knowledge-base/traefik/wildcard-certificates { return 301 /docs/knowledge-base/proxy/traefik/wildcard-certs; } location = /knowledge-base/traefik/protecting-services-with-authentik { return 301 /docs/knowledge-base/proxy/traefik/protect-services-with-authentik; } # Redirects for Applications -> New Paths @@ -35,7 +35,7 @@ location = /knowledge-base/databases/keydb { return 301 /docs/databases/keydb; } location = /knowledge-base/databases/clickhouse { return 301 /docs/databases/clickhouse; } # Redirects for Services -> New Paths -location = /knowledge-base/services { return 301 /docs/services; } +location = /knowledge-base/services { return 301 /docs/services/introduction; } location = /knowledge-base/services/activepieces { return 301 /docs/services/activepieces; } location = /knowledge-base/services/browserless { return 301 /docs/services/browserless; } location = /knowledge-base/services/appsmith { return 301 /docs/services/appsmith; } @@ -80,13 +80,13 @@ location = /docs/services/unsend { return 301 /docs/services/usesend; } location = /docs/services/beszel-agent { return 301 /docs/services/beszel; } # Redirects for Contribution -> New Paths -location = /knowledge-base/contribute/coolify { return 301 /docs/resource/contribute/coolify; } -location = /knowledge-base/contribute/service { return 301 /docs/resource/contribute/service; } -location = /knowledge-base/contribute/documentation { return 301 /docs/resource/contribute/documentation; } +location = /knowledge-base/contribute/coolify { return 301 /docs/get-started/contribute/coolify; } +location = /knowledge-base/contribute/service { return 301 /docs/get-started/contribute/service; } +location = /knowledge-base/contribute/documentation { return 301 /docs/get-started/contribute/documentation; } # Redirects for the pages we removed on the new docs -> New Paths -location = /screenshots { return 301 /docs/resource/screenshots; } -location = /videos { return 301 /docs/resource/videos; } +location = /screenshots { return 301 /docs/get-started/screenshots; } +location = /videos { return 301 /docs/get-started/videos; } location = /contact { return 301 /docs/get-started/support; } # Redirects for API pages @@ -112,7 +112,7 @@ location = /knowledge-base/cloudflare/tunnels/all-resource { return 301 /docs/in location = /knowledge-base/cloudflare/tunnels/single-resource { return 301 /docs/integrations/cloudflare/tunnels/single-resource; } location = /knowledge-base/cloudflare/tunnels/server-ssh { return 301 /docs/integrations/cloudflare/tunnels/server-ssh; } location = /knowledge-base/cloudflare/tunnels/full-tls { return 301 /docs/integrations/cloudflare/tunnels/full-tls; } -location = /knowledge-base/cloudflare/origin-cert { return 301 /docs/integrations/cloudflare/tunnels/ddos-protection; } +location = /knowledge-base/cloudflare/origin-cert { return 301 /docs/integrations/cloudflare/ddos-protection; } # webstudio location = /integrations/webstudio { return 301 /docs/knowledge-base/how-to/webstudio-with-hetzner; } @@ -127,14 +127,13 @@ location = /builds/packs/docker-compose { return 301 /docs/applications/build-pa location = /builds/servers { return 301 /docs/knowledge-base/server/build-server; } # Redirects for Git -> Applications/CI-CD -location = /knowledge-base/git/github/manually-setup-github-app { return 301 /docs/applications/ci-cd/github/manually-setup-github-app; } -location = /knowledge-base/git/github/move-between-github-apps { return 301 /docs/applications/ci-cd/github/move-between-github-apps; } -location = /knowledge-base/git/github/integration { return 301 /docs/applications/ci-cd/github/integration; } -location = /knowledge-base/git/github/github-actions { return 301 /docs/applications/ci-cd/github/github-actions; } +location = /knowledge-base/git/github/manually-setup-github-app { return 301 /docs/applications/ci-cd/github/setup-app; } +location = /knowledge-base/git/github/move-between-github-apps { return 301 /docs/applications/ci-cd/github/switch-apps; } +location = /knowledge-base/git/github/integration { return 301 /docs/applications/ci-cd/github/overview; } +location = /knowledge-base/git/github/github-actions { return 301 /docs/applications/ci-cd/github/actions; } location = /knowledge-base/git/gitlab/integration { return 301 /docs/applications/ci-cd/gitlab/integration; } location = /knowledge-base/git/bitbucket/integration { return 301 /docs/applications/ci-cd/bitbucket/integration; } location = /knowledge-base/git/gitea/integration { return 301 /docs/applications/ci-cd/gitea/integration; } # Redirects for common CI/CD URL patterns (based on access logs) location = /integration/cicd { return 301 /docs/applications/ci-cd/introduction; } - diff --git a/package.json b/package.json index 756edab2..65d80778 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,45 @@ { "name": "coolify-docs", + "type": "module", + "sideEffects": false, "devDependencies": { - "@iconify/vue": "^5.0.0", "@tailwindcss/vite": "^4.2.1", + "@types/mdx": "^2.0.13", "@types/node": "25.0.9", - "markdown-it-container": "4.0.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "nitro": "^3.0.260311-beta", "tailwindcss": "^4.2.1", - "vitepress": "1.6.4", - "vitepress-plugin-group-icons": "^1.7.1", - "vitepress-plugin-llms": "^1.11.0", - "vitepress-plugin-tabs": "^0.7.3", - "vue": "^3.5.29" + "typescript": "^6.0.2" }, "private": true, "scripts": { "generate:services:data": "node scripts/generate-service-list.mjs", "generate:services:page": "node scripts/generate-services-page.mjs", "generate:services": "node scripts/generate-service-list.mjs && node scripts/generate-services-page.mjs", - "dev": "bun run generate:services && vitepress dev docs", - "build": "bun run generate:services && vitepress build docs", - "preview": "bun run generate:services && vitepress preview docs" + "generate:content": "node scripts/generate-fumadocs-content.mjs", + "dev": "bun run generate:services && bun run generate:content && vite dev", + "build": "NODE_ENV=production bun run generate:services && NODE_ENV=production bun run generate:content && NODE_ENV=production vite build && NODE_ENV=production bun run scripts/postbuild.ts", + "preview": "vite preview", + "types:check": "bun run generate:services && bun run generate:content && bunx fumadocs-mdx && tsc --noEmit" }, "dependencies": { - "@korrektly/sdk": "^0.1.4", - "@vueuse/core": "14.1.0", - "globe.gl": "2.45.0", - "vitepress-openapi": "0.1.13" + "@orama/orama": "^3.1.18", + "@resvg/resvg-js": "^2.6.2", + "@tanstack/react-router": "1.168.10", + "@tanstack/react-start": "1.167.16", + "@tanstack/start-static-server-functions": "1.166.25", + "fumadocs-core": "16.8.5", + "fumadocs-mdx": "14.2.11", + "fumadocs-openapi": "^10.8.1", + "fumadocs-ui": "16.8.5", + "gray-matter": "^4.0.3", + "lucide-react": "^1.7.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "shiki": "^4.0.2", + "tslib": "^2.8.1", + "vite": "^8.0.7" } } diff --git a/public/brand/favicon.ico b/public/brand/favicon.ico new file mode 100644 index 00000000..7d007d9b Binary files /dev/null and b/public/brand/favicon.ico differ diff --git a/public/brand/logo.png b/public/brand/logo.png new file mode 100644 index 00000000..96fc0db3 Binary files /dev/null and b/public/brand/logo.png differ diff --git a/public/brand/logo.svg b/public/brand/logo.svg new file mode 100644 index 00000000..8d1d78a9 --- /dev/null +++ b/public/brand/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/brand/logo.webp b/public/brand/logo.webp new file mode 100644 index 00000000..96fc0db3 Binary files /dev/null and b/public/brand/logo.webp differ diff --git a/public/images/applications/ci-cd/github/actions/1.webp b/public/images/applications/ci-cd/github/actions/1.webp new file mode 100644 index 00000000..ca46e553 Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/1.webp differ diff --git a/public/images/applications/ci-cd/github/actions/2.webp b/public/images/applications/ci-cd/github/actions/2.webp new file mode 100644 index 00000000..f63fcf66 Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/2.webp differ diff --git a/public/images/applications/ci-cd/github/actions/3.webp b/public/images/applications/ci-cd/github/actions/3.webp new file mode 100644 index 00000000..765f56a3 Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/3.webp differ diff --git a/public/images/applications/ci-cd/github/actions/4.webp b/public/images/applications/ci-cd/github/actions/4.webp new file mode 100644 index 00000000..c8684246 Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/4.webp differ diff --git a/public/images/applications/ci-cd/github/actions/5.webp b/public/images/applications/ci-cd/github/actions/5.webp new file mode 100644 index 00000000..e18612df Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/5.webp differ diff --git a/public/images/applications/ci-cd/github/actions/6.webp b/public/images/applications/ci-cd/github/actions/6.webp new file mode 100644 index 00000000..38eed77b Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/6.webp differ diff --git a/public/images/applications/ci-cd/github/actions/7.webp b/public/images/applications/ci-cd/github/actions/7.webp new file mode 100644 index 00000000..b8dc170d Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/7.webp differ diff --git a/public/images/applications/ci-cd/github/actions/8.webp b/public/images/applications/ci-cd/github/actions/8.webp new file mode 100644 index 00000000..4944efe4 Binary files /dev/null and b/public/images/applications/ci-cd/github/actions/8.webp differ diff --git a/public/images/applications/ci-cd/github/auto-deploy/github-app/1.webp b/public/images/applications/ci-cd/github/auto-deploy/github-app/1.webp new file mode 100644 index 00000000..a36eaf26 Binary files /dev/null and b/public/images/applications/ci-cd/github/auto-deploy/github-app/1.webp differ diff --git a/public/images/applications/ci-cd/github/auto-deploy/webhooks/1.webp b/public/images/applications/ci-cd/github/auto-deploy/webhooks/1.webp new file mode 100644 index 00000000..a36eaf26 Binary files /dev/null and b/public/images/applications/ci-cd/github/auto-deploy/webhooks/1.webp differ diff --git a/public/images/applications/ci-cd/github/auto-deploy/webhooks/2.webp b/public/images/applications/ci-cd/github/auto-deploy/webhooks/2.webp new file mode 100644 index 00000000..4a654d4d Binary files /dev/null and b/public/images/applications/ci-cd/github/auto-deploy/webhooks/2.webp differ diff --git a/public/images/applications/ci-cd/github/auto-deploy/webhooks/3.webp b/public/images/applications/ci-cd/github/auto-deploy/webhooks/3.webp new file mode 100644 index 00000000..37484f3b Binary files /dev/null and b/public/images/applications/ci-cd/github/auto-deploy/webhooks/3.webp differ diff --git a/public/images/applications/ci-cd/github/auto-deploy/webhooks/4.webp b/public/images/applications/ci-cd/github/auto-deploy/webhooks/4.webp new file mode 100644 index 00000000..fb1cac2a Binary files /dev/null and b/public/images/applications/ci-cd/github/auto-deploy/webhooks/4.webp differ diff --git a/public/images/applications/ci-cd/github/auto-deploy/webhooks/5.webp b/public/images/applications/ci-cd/github/auto-deploy/webhooks/5.webp new file mode 100644 index 00000000..a4311d79 Binary files /dev/null and b/public/images/applications/ci-cd/github/auto-deploy/webhooks/5.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/1.webp b/public/images/applications/ci-cd/github/deploy-key/1.webp new file mode 100644 index 00000000..1a89cf84 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/1.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/10.webp b/public/images/applications/ci-cd/github/deploy-key/10.webp new file mode 100644 index 00000000..42176ba1 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/10.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/11.webp b/public/images/applications/ci-cd/github/deploy-key/11.webp new file mode 100644 index 00000000..ce773aa2 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/11.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/12.webp b/public/images/applications/ci-cd/github/deploy-key/12.webp new file mode 100644 index 00000000..0aa42942 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/12.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/2-1.webp b/public/images/applications/ci-cd/github/deploy-key/2-1.webp new file mode 100644 index 00000000..5ff3ec54 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/2-1.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/2.webp b/public/images/applications/ci-cd/github/deploy-key/2.webp new file mode 100644 index 00000000..1c544a6a Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/2.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/3.webp b/public/images/applications/ci-cd/github/deploy-key/3.webp new file mode 100644 index 00000000..5ff3ec54 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/3.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/4.webp b/public/images/applications/ci-cd/github/deploy-key/4.webp new file mode 100644 index 00000000..db7220c2 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/4.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/5.webp b/public/images/applications/ci-cd/github/deploy-key/5.webp new file mode 100644 index 00000000..65a35b9d Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/5.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/6.webp b/public/images/applications/ci-cd/github/deploy-key/6.webp new file mode 100644 index 00000000..b5b265fd Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/6.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/7.webp b/public/images/applications/ci-cd/github/deploy-key/7.webp new file mode 100644 index 00000000..e61c13f3 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/7.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/8.webp b/public/images/applications/ci-cd/github/deploy-key/8.webp new file mode 100644 index 00000000..67621bb5 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/8.webp differ diff --git a/public/images/applications/ci-cd/github/deploy-key/9.webp b/public/images/applications/ci-cd/github/deploy-key/9.webp new file mode 100644 index 00000000..a7bd0252 Binary files /dev/null and b/public/images/applications/ci-cd/github/deploy-key/9.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/1.webp b/public/images/applications/ci-cd/github/preview-deploy/1.webp new file mode 100644 index 00000000..910a1296 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/1.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/2.webp b/public/images/applications/ci-cd/github/preview-deploy/2.webp new file mode 100644 index 00000000..b980651a Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/2.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/3.webp b/public/images/applications/ci-cd/github/preview-deploy/3.webp new file mode 100644 index 00000000..bf4a0eed Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/3.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/4.webp b/public/images/applications/ci-cd/github/preview-deploy/4.webp new file mode 100644 index 00000000..0d18bed8 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/4.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/github-app/1.webp b/public/images/applications/ci-cd/github/preview-deploy/github-app/1.webp new file mode 100644 index 00000000..2fc65f46 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/github-app/1.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/github-app/2.webp b/public/images/applications/ci-cd/github/preview-deploy/github-app/2.webp new file mode 100644 index 00000000..75720681 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/github-app/2.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/github-app/3.webp b/public/images/applications/ci-cd/github/preview-deploy/github-app/3.webp new file mode 100644 index 00000000..cdc7efe7 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/github-app/3.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/github-app/4.webp b/public/images/applications/ci-cd/github/preview-deploy/github-app/4.webp new file mode 100644 index 00000000..88bf8062 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/github-app/4.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/webhook/1.webp b/public/images/applications/ci-cd/github/preview-deploy/webhook/1.webp new file mode 100644 index 00000000..79df05c1 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/webhook/1.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/webhook/2.webp b/public/images/applications/ci-cd/github/preview-deploy/webhook/2.webp new file mode 100644 index 00000000..b997ca46 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/webhook/2.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/webhook/3.webp b/public/images/applications/ci-cd/github/preview-deploy/webhook/3.webp new file mode 100644 index 00000000..5ceffdda Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/webhook/3.webp differ diff --git a/public/images/applications/ci-cd/github/preview-deploy/webhook/4.webp b/public/images/applications/ci-cd/github/preview-deploy/webhook/4.webp new file mode 100644 index 00000000..9a494046 Binary files /dev/null and b/public/images/applications/ci-cd/github/preview-deploy/webhook/4.webp differ diff --git a/public/images/applications/ci-cd/github/public-repository/1.webp b/public/images/applications/ci-cd/github/public-repository/1.webp new file mode 100644 index 00000000..c84217e4 Binary files /dev/null and b/public/images/applications/ci-cd/github/public-repository/1.webp differ diff --git a/public/images/applications/ci-cd/github/public-repository/2.webp b/public/images/applications/ci-cd/github/public-repository/2.webp new file mode 100644 index 00000000..dc1eeec7 Binary files /dev/null and b/public/images/applications/ci-cd/github/public-repository/2.webp differ diff --git a/public/images/applications/ci-cd/github/public-repository/3.webp b/public/images/applications/ci-cd/github/public-repository/3.webp new file mode 100644 index 00000000..8e67c3f4 Binary files /dev/null and b/public/images/applications/ci-cd/github/public-repository/3.webp differ diff --git a/public/images/applications/ci-cd/github/public-repository/4.webp b/public/images/applications/ci-cd/github/public-repository/4.webp new file mode 100644 index 00000000..d0528937 Binary files /dev/null and b/public/images/applications/ci-cd/github/public-repository/4.webp differ diff --git a/public/images/applications/ci-cd/github/public-repository/5.webp b/public/images/applications/ci-cd/github/public-repository/5.webp new file mode 100644 index 00000000..fa8f0b40 Binary files /dev/null and b/public/images/applications/ci-cd/github/public-repository/5.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/1.webp b/public/images/applications/ci-cd/github/setup-app/1.webp new file mode 100644 index 00000000..7ea96dc3 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/1.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/10.webp b/public/images/applications/ci-cd/github/setup-app/10.webp new file mode 100644 index 00000000..c9a06c50 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/10.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/11.webp b/public/images/applications/ci-cd/github/setup-app/11.webp new file mode 100644 index 00000000..fae95226 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/11.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/12.webp b/public/images/applications/ci-cd/github/setup-app/12.webp new file mode 100644 index 00000000..6ff69605 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/12.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/13.webp b/public/images/applications/ci-cd/github/setup-app/13.webp new file mode 100644 index 00000000..a09d1bbb Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/13.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/14.webp b/public/images/applications/ci-cd/github/setup-app/14.webp new file mode 100644 index 00000000..0cb2833b Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/14.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/15.webp b/public/images/applications/ci-cd/github/setup-app/15.webp new file mode 100644 index 00000000..77e66fe7 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/15.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/16.webp b/public/images/applications/ci-cd/github/setup-app/16.webp new file mode 100644 index 00000000..9dccc686 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/16.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/17.webp b/public/images/applications/ci-cd/github/setup-app/17.webp new file mode 100644 index 00000000..1c80c8ec Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/17.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/18.webp b/public/images/applications/ci-cd/github/setup-app/18.webp new file mode 100644 index 00000000..e06087a8 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/18.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/19.webp b/public/images/applications/ci-cd/github/setup-app/19.webp new file mode 100644 index 00000000..8c3079e6 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/19.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/2.webp b/public/images/applications/ci-cd/github/setup-app/2.webp new file mode 100644 index 00000000..07ab2c09 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/2.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/20.webp b/public/images/applications/ci-cd/github/setup-app/20.webp new file mode 100644 index 00000000..004e21f5 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/20.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/21.webp b/public/images/applications/ci-cd/github/setup-app/21.webp new file mode 100644 index 00000000..656bc2eb Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/21.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/22.webp b/public/images/applications/ci-cd/github/setup-app/22.webp new file mode 100644 index 00000000..d0c3d568 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/22.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/23.webp b/public/images/applications/ci-cd/github/setup-app/23.webp new file mode 100644 index 00000000..67025baa Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/23.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/24.webp b/public/images/applications/ci-cd/github/setup-app/24.webp new file mode 100644 index 00000000..498b552b Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/24.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/25.webp b/public/images/applications/ci-cd/github/setup-app/25.webp new file mode 100644 index 00000000..3f7000a9 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/25.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/26.webp b/public/images/applications/ci-cd/github/setup-app/26.webp new file mode 100644 index 00000000..9db0433f Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/26.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/27.webp b/public/images/applications/ci-cd/github/setup-app/27.webp new file mode 100644 index 00000000..fe8fb598 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/27.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/28.webp b/public/images/applications/ci-cd/github/setup-app/28.webp new file mode 100644 index 00000000..91323578 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/28.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/29.webp b/public/images/applications/ci-cd/github/setup-app/29.webp new file mode 100644 index 00000000..551b1efa Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/29.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/3.webp b/public/images/applications/ci-cd/github/setup-app/3.webp new file mode 100644 index 00000000..936a84d2 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/3.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/30.webp b/public/images/applications/ci-cd/github/setup-app/30.webp new file mode 100644 index 00000000..64d20ddd Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/30.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/31.webp b/public/images/applications/ci-cd/github/setup-app/31.webp new file mode 100644 index 00000000..2e80ec54 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/31.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/32.webp b/public/images/applications/ci-cd/github/setup-app/32.webp new file mode 100644 index 00000000..3ecea010 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/32.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/33.webp b/public/images/applications/ci-cd/github/setup-app/33.webp new file mode 100644 index 00000000..46d1f6b2 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/33.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/34.webp b/public/images/applications/ci-cd/github/setup-app/34.webp new file mode 100644 index 00000000..2af10c19 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/34.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/35.webp b/public/images/applications/ci-cd/github/setup-app/35.webp new file mode 100644 index 00000000..649fdba2 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/35.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/36.webp b/public/images/applications/ci-cd/github/setup-app/36.webp new file mode 100644 index 00000000..f0bc6644 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/36.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/37.webp b/public/images/applications/ci-cd/github/setup-app/37.webp new file mode 100644 index 00000000..c9a06c50 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/37.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/38.webp b/public/images/applications/ci-cd/github/setup-app/38.webp new file mode 100644 index 00000000..fae95226 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/38.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/39.webp b/public/images/applications/ci-cd/github/setup-app/39.webp new file mode 100644 index 00000000..c50157ec Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/39.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/4.webp b/public/images/applications/ci-cd/github/setup-app/4.webp new file mode 100644 index 00000000..2bfe1001 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/4.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/40.webp b/public/images/applications/ci-cd/github/setup-app/40.webp new file mode 100644 index 00000000..54dd83fc Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/40.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/41.webp b/public/images/applications/ci-cd/github/setup-app/41.webp new file mode 100644 index 00000000..2ca2b34c Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/41.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/5.webp b/public/images/applications/ci-cd/github/setup-app/5.webp new file mode 100644 index 00000000..f728f21d Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/5.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/6.webp b/public/images/applications/ci-cd/github/setup-app/6.webp new file mode 100644 index 00000000..eb942c53 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/6.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/7.webp b/public/images/applications/ci-cd/github/setup-app/7.webp new file mode 100644 index 00000000..6bcf6346 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/7.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/8.webp b/public/images/applications/ci-cd/github/setup-app/8.webp new file mode 100644 index 00000000..d8e42f56 Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/8.webp differ diff --git a/public/images/applications/ci-cd/github/setup-app/9.webp b/public/images/applications/ci-cd/github/setup-app/9.webp new file mode 100644 index 00000000..8fa107fb Binary files /dev/null and b/public/images/applications/ci-cd/github/setup-app/9.webp differ diff --git a/public/images/applications/ci-cd/github/switch-apps/1.webp b/public/images/applications/ci-cd/github/switch-apps/1.webp new file mode 100644 index 00000000..45b796c6 Binary files /dev/null and b/public/images/applications/ci-cd/github/switch-apps/1.webp differ diff --git a/public/images/applications/ci-cd/github/switch-apps/2.webp b/public/images/applications/ci-cd/github/switch-apps/2.webp new file mode 100644 index 00000000..26f42249 Binary files /dev/null and b/public/images/applications/ci-cd/github/switch-apps/2.webp differ diff --git a/public/images/applications/ci-cd/github/switch-apps/3.webp b/public/images/applications/ci-cd/github/switch-apps/3.webp new file mode 100644 index 00000000..4ee50684 Binary files /dev/null and b/public/images/applications/ci-cd/github/switch-apps/3.webp differ diff --git a/public/images/applications/ci-cd/github/switch-apps/4.webp b/public/images/applications/ci-cd/github/switch-apps/4.webp new file mode 100644 index 00000000..3c54c8ad Binary files /dev/null and b/public/images/applications/ci-cd/github/switch-apps/4.webp differ diff --git a/public/images/applications/domain.webp b/public/images/applications/domain.webp new file mode 100644 index 00000000..06ff7225 Binary files /dev/null and b/public/images/applications/domain.webp differ diff --git a/public/images/applications/sveltekit/deploy-settings.png b/public/images/applications/sveltekit/deploy-settings.png new file mode 100644 index 00000000..91257540 Binary files /dev/null and b/public/images/applications/sveltekit/deploy-settings.png differ diff --git a/public/images/applications/sveltekit/env-vars.png b/public/images/applications/sveltekit/env-vars.png new file mode 100644 index 00000000..e226e53d Binary files /dev/null and b/public/images/applications/sveltekit/env-vars.png differ diff --git a/public/images/applications/sveltekit/healthcheck.png b/public/images/applications/sveltekit/healthcheck.png new file mode 100644 index 00000000..b1c786df Binary files /dev/null and b/public/images/applications/sveltekit/healthcheck.png differ diff --git a/public/images/aws-s3/1.webp b/public/images/aws-s3/1.webp new file mode 100644 index 00000000..378da3b4 Binary files /dev/null and b/public/images/aws-s3/1.webp differ diff --git a/public/images/aws-s3/10.webp b/public/images/aws-s3/10.webp new file mode 100644 index 00000000..b88184c9 Binary files /dev/null and b/public/images/aws-s3/10.webp differ diff --git a/public/images/aws-s3/11.webp b/public/images/aws-s3/11.webp new file mode 100644 index 00000000..bd943a6b Binary files /dev/null and b/public/images/aws-s3/11.webp differ diff --git a/public/images/aws-s3/12.webp b/public/images/aws-s3/12.webp new file mode 100644 index 00000000..6b5bcb1e Binary files /dev/null and b/public/images/aws-s3/12.webp differ diff --git a/public/images/aws-s3/13.webp b/public/images/aws-s3/13.webp new file mode 100644 index 00000000..1fafbbb6 Binary files /dev/null and b/public/images/aws-s3/13.webp differ diff --git a/public/images/aws-s3/14.webp b/public/images/aws-s3/14.webp new file mode 100644 index 00000000..1b907d63 Binary files /dev/null and b/public/images/aws-s3/14.webp differ diff --git a/public/images/aws-s3/15.webp b/public/images/aws-s3/15.webp new file mode 100644 index 00000000..321e8f53 Binary files /dev/null and b/public/images/aws-s3/15.webp differ diff --git a/public/images/aws-s3/16.webp b/public/images/aws-s3/16.webp new file mode 100644 index 00000000..4f021c86 Binary files /dev/null and b/public/images/aws-s3/16.webp differ diff --git a/public/images/aws-s3/17.webp b/public/images/aws-s3/17.webp new file mode 100644 index 00000000..ed2e15a7 Binary files /dev/null and b/public/images/aws-s3/17.webp differ diff --git a/public/images/aws-s3/18.webp b/public/images/aws-s3/18.webp new file mode 100644 index 00000000..c853bb17 Binary files /dev/null and b/public/images/aws-s3/18.webp differ diff --git a/public/images/aws-s3/19.webp b/public/images/aws-s3/19.webp new file mode 100644 index 00000000..9cd447af Binary files /dev/null and b/public/images/aws-s3/19.webp differ diff --git a/public/images/aws-s3/2.webp b/public/images/aws-s3/2.webp new file mode 100644 index 00000000..d59ed9e7 Binary files /dev/null and b/public/images/aws-s3/2.webp differ diff --git a/public/images/aws-s3/20.webp b/public/images/aws-s3/20.webp new file mode 100644 index 00000000..4f00305a Binary files /dev/null and b/public/images/aws-s3/20.webp differ diff --git a/public/images/aws-s3/21.webp b/public/images/aws-s3/21.webp new file mode 100644 index 00000000..1b06e213 Binary files /dev/null and b/public/images/aws-s3/21.webp differ diff --git a/public/images/aws-s3/22.webp b/public/images/aws-s3/22.webp new file mode 100644 index 00000000..bfeab7b9 Binary files /dev/null and b/public/images/aws-s3/22.webp differ diff --git a/public/images/aws-s3/23.webp b/public/images/aws-s3/23.webp new file mode 100644 index 00000000..14bf6bf7 Binary files /dev/null and b/public/images/aws-s3/23.webp differ diff --git a/public/images/aws-s3/24.webp b/public/images/aws-s3/24.webp new file mode 100644 index 00000000..bc44e529 Binary files /dev/null and b/public/images/aws-s3/24.webp differ diff --git a/public/images/aws-s3/25.webp b/public/images/aws-s3/25.webp new file mode 100644 index 00000000..cec3f9d3 Binary files /dev/null and b/public/images/aws-s3/25.webp differ diff --git a/public/images/aws-s3/3.webp b/public/images/aws-s3/3.webp new file mode 100644 index 00000000..7baa1abb Binary files /dev/null and b/public/images/aws-s3/3.webp differ diff --git a/public/images/aws-s3/4.webp b/public/images/aws-s3/4.webp new file mode 100644 index 00000000..50274599 Binary files /dev/null and b/public/images/aws-s3/4.webp differ diff --git a/public/images/aws-s3/5.webp b/public/images/aws-s3/5.webp new file mode 100644 index 00000000..2141237a Binary files /dev/null and b/public/images/aws-s3/5.webp differ diff --git a/public/images/aws-s3/6.webp b/public/images/aws-s3/6.webp new file mode 100644 index 00000000..e761a003 Binary files /dev/null and b/public/images/aws-s3/6.webp differ diff --git a/public/images/aws-s3/7.webp b/public/images/aws-s3/7.webp new file mode 100644 index 00000000..3ac7f1a6 Binary files /dev/null and b/public/images/aws-s3/7.webp differ diff --git a/public/images/aws-s3/8.webp b/public/images/aws-s3/8.webp new file mode 100644 index 00000000..fb951b9d Binary files /dev/null and b/public/images/aws-s3/8.webp differ diff --git a/public/images/aws-s3/9.webp b/public/images/aws-s3/9.webp new file mode 100644 index 00000000..b16cb8c2 Binary files /dev/null and b/public/images/aws-s3/9.webp differ diff --git a/public/images/aws-s3/header.webp b/public/images/aws-s3/header.webp new file mode 100644 index 00000000..29cc2326 Binary files /dev/null and b/public/images/aws-s3/header.webp differ diff --git a/public/images/brands/hetzner.svg b/public/images/brands/hetzner.svg new file mode 100644 index 00000000..97bf32c4 --- /dev/null +++ b/public/images/brands/hetzner.svg @@ -0,0 +1,19 @@ + + + + + + Element 1 + + + + + + + + + + + diff --git a/public/images/builds/introduction/builds-banner.webp b/public/images/builds/introduction/builds-banner.webp new file mode 100644 index 00000000..b62f6e07 Binary files /dev/null and b/public/images/builds/introduction/builds-banner.webp differ diff --git a/public/images/builds/packs/compose/1.webp b/public/images/builds/packs/compose/1.webp new file mode 100644 index 00000000..6527d09f Binary files /dev/null and b/public/images/builds/packs/compose/1.webp differ diff --git a/public/images/builds/packs/compose/2.webp b/public/images/builds/packs/compose/2.webp new file mode 100644 index 00000000..d46655a2 Binary files /dev/null and b/public/images/builds/packs/compose/2.webp differ diff --git a/public/images/builds/packs/compose/3.webp b/public/images/builds/packs/compose/3.webp new file mode 100644 index 00000000..61ffa671 Binary files /dev/null and b/public/images/builds/packs/compose/3.webp differ diff --git a/public/images/builds/packs/compose/4.webp b/public/images/builds/packs/compose/4.webp new file mode 100644 index 00000000..025b2795 Binary files /dev/null and b/public/images/builds/packs/compose/4.webp differ diff --git a/public/images/builds/packs/compose/5.webp b/public/images/builds/packs/compose/5.webp new file mode 100644 index 00000000..fde5262a Binary files /dev/null and b/public/images/builds/packs/compose/5.webp differ diff --git a/public/images/builds/packs/compose/6.webp b/public/images/builds/packs/compose/6.webp new file mode 100644 index 00000000..753bede9 Binary files /dev/null and b/public/images/builds/packs/compose/6.webp differ diff --git a/public/images/builds/packs/compose/7.webp b/public/images/builds/packs/compose/7.webp new file mode 100644 index 00000000..005d4f8c Binary files /dev/null and b/public/images/builds/packs/compose/7.webp differ diff --git a/public/images/builds/packs/compose/banner.webp b/public/images/builds/packs/compose/banner.webp new file mode 100644 index 00000000..effbb2d9 Binary files /dev/null and b/public/images/builds/packs/compose/banner.webp differ diff --git a/public/images/builds/packs/dockerfile/1.webp b/public/images/builds/packs/dockerfile/1.webp new file mode 100644 index 00000000..6527d09f Binary files /dev/null and b/public/images/builds/packs/dockerfile/1.webp differ diff --git a/public/images/builds/packs/dockerfile/2.webp b/public/images/builds/packs/dockerfile/2.webp new file mode 100644 index 00000000..d46655a2 Binary files /dev/null and b/public/images/builds/packs/dockerfile/2.webp differ diff --git a/public/images/builds/packs/dockerfile/3.webp b/public/images/builds/packs/dockerfile/3.webp new file mode 100644 index 00000000..1c46ffd1 Binary files /dev/null and b/public/images/builds/packs/dockerfile/3.webp differ diff --git a/public/images/builds/packs/dockerfile/4.webp b/public/images/builds/packs/dockerfile/4.webp new file mode 100644 index 00000000..ae3a3ced Binary files /dev/null and b/public/images/builds/packs/dockerfile/4.webp differ diff --git a/public/images/builds/packs/dockerfile/5.webp b/public/images/builds/packs/dockerfile/5.webp new file mode 100644 index 00000000..f1675a79 Binary files /dev/null and b/public/images/builds/packs/dockerfile/5.webp differ diff --git a/public/images/builds/packs/dockerfile/6.webp b/public/images/builds/packs/dockerfile/6.webp new file mode 100644 index 00000000..82922d0f Binary files /dev/null and b/public/images/builds/packs/dockerfile/6.webp differ diff --git a/public/images/builds/packs/dockerfile/7.webp b/public/images/builds/packs/dockerfile/7.webp new file mode 100644 index 00000000..cee56ffc Binary files /dev/null and b/public/images/builds/packs/dockerfile/7.webp differ diff --git a/public/images/builds/packs/dockerfile/8.webp b/public/images/builds/packs/dockerfile/8.webp new file mode 100644 index 00000000..e10fdbb9 Binary files /dev/null and b/public/images/builds/packs/dockerfile/8.webp differ diff --git a/public/images/builds/packs/dockerfile/9.webp b/public/images/builds/packs/dockerfile/9.webp new file mode 100644 index 00000000..3bcc8643 Binary files /dev/null and b/public/images/builds/packs/dockerfile/9.webp differ diff --git a/public/images/builds/packs/dockerfile/banner.webp b/public/images/builds/packs/dockerfile/banner.webp new file mode 100644 index 00000000..d747097d Binary files /dev/null and b/public/images/builds/packs/dockerfile/banner.webp differ diff --git a/public/images/builds/packs/nixpacks/1.webp b/public/images/builds/packs/nixpacks/1.webp new file mode 100644 index 00000000..0a1095da Binary files /dev/null and b/public/images/builds/packs/nixpacks/1.webp differ diff --git a/public/images/builds/packs/nixpacks/10.webp b/public/images/builds/packs/nixpacks/10.webp new file mode 100644 index 00000000..13c31877 Binary files /dev/null and b/public/images/builds/packs/nixpacks/10.webp differ diff --git a/public/images/builds/packs/nixpacks/2.webp b/public/images/builds/packs/nixpacks/2.webp new file mode 100644 index 00000000..6f9390a5 Binary files /dev/null and b/public/images/builds/packs/nixpacks/2.webp differ diff --git a/public/images/builds/packs/nixpacks/3.webp b/public/images/builds/packs/nixpacks/3.webp new file mode 100644 index 00000000..26640504 Binary files /dev/null and b/public/images/builds/packs/nixpacks/3.webp differ diff --git a/public/images/builds/packs/nixpacks/4.webp b/public/images/builds/packs/nixpacks/4.webp new file mode 100644 index 00000000..2858cf7e Binary files /dev/null and b/public/images/builds/packs/nixpacks/4.webp differ diff --git a/public/images/builds/packs/nixpacks/5.webp b/public/images/builds/packs/nixpacks/5.webp new file mode 100644 index 00000000..e9bdbb24 Binary files /dev/null and b/public/images/builds/packs/nixpacks/5.webp differ diff --git a/public/images/builds/packs/nixpacks/6.webp b/public/images/builds/packs/nixpacks/6.webp new file mode 100644 index 00000000..dad39a89 Binary files /dev/null and b/public/images/builds/packs/nixpacks/6.webp differ diff --git a/public/images/builds/packs/nixpacks/7.webp b/public/images/builds/packs/nixpacks/7.webp new file mode 100644 index 00000000..cfe0c694 Binary files /dev/null and b/public/images/builds/packs/nixpacks/7.webp differ diff --git a/public/images/builds/packs/nixpacks/8.webp b/public/images/builds/packs/nixpacks/8.webp new file mode 100644 index 00000000..1cb2df99 Binary files /dev/null and b/public/images/builds/packs/nixpacks/8.webp differ diff --git a/public/images/builds/packs/nixpacks/9.webp b/public/images/builds/packs/nixpacks/9.webp new file mode 100644 index 00000000..4d2f8c25 Binary files /dev/null and b/public/images/builds/packs/nixpacks/9.webp differ diff --git a/public/images/builds/packs/nixpacks/banner.webp b/public/images/builds/packs/nixpacks/banner.webp new file mode 100644 index 00000000..633c128e Binary files /dev/null and b/public/images/builds/packs/nixpacks/banner.webp differ diff --git a/public/images/builds/packs/packs-banner.webp b/public/images/builds/packs/packs-banner.webp new file mode 100644 index 00000000..e18eb78c Binary files /dev/null and b/public/images/builds/packs/packs-banner.webp differ diff --git a/public/images/builds/packs/static/1.webp b/public/images/builds/packs/static/1.webp new file mode 100644 index 00000000..d8fac4c1 Binary files /dev/null and b/public/images/builds/packs/static/1.webp differ diff --git a/public/images/builds/packs/static/2.webp b/public/images/builds/packs/static/2.webp new file mode 100644 index 00000000..aa6019ab Binary files /dev/null and b/public/images/builds/packs/static/2.webp differ diff --git a/public/images/builds/packs/static/3.webp b/public/images/builds/packs/static/3.webp new file mode 100644 index 00000000..bf82b9ae Binary files /dev/null and b/public/images/builds/packs/static/3.webp differ diff --git a/public/images/builds/packs/static/4.webp b/public/images/builds/packs/static/4.webp new file mode 100644 index 00000000..463f30d0 Binary files /dev/null and b/public/images/builds/packs/static/4.webp differ diff --git a/public/images/builds/packs/static/5.webp b/public/images/builds/packs/static/5.webp new file mode 100644 index 00000000..5d4c1047 Binary files /dev/null and b/public/images/builds/packs/static/5.webp differ diff --git a/public/images/builds/packs/static/6.webp b/public/images/builds/packs/static/6.webp new file mode 100644 index 00000000..bc067b85 Binary files /dev/null and b/public/images/builds/packs/static/6.webp differ diff --git a/public/images/builds/packs/static/7.webp b/public/images/builds/packs/static/7.webp new file mode 100644 index 00000000..d3f77bfe Binary files /dev/null and b/public/images/builds/packs/static/7.webp differ diff --git a/public/images/builds/packs/static/8.webp b/public/images/builds/packs/static/8.webp new file mode 100644 index 00000000..c50b9d82 Binary files /dev/null and b/public/images/builds/packs/static/8.webp differ diff --git a/public/images/builds/packs/static/9.webp b/public/images/builds/packs/static/9.webp new file mode 100644 index 00000000..37e52640 Binary files /dev/null and b/public/images/builds/packs/static/9.webp differ diff --git a/public/images/builds/packs/static/banner.webp b/public/images/builds/packs/static/banner.webp new file mode 100644 index 00000000..61ad130f Binary files /dev/null and b/public/images/builds/packs/static/banner.webp differ diff --git a/public/images/builds/servers/1.webp b/public/images/builds/servers/1.webp new file mode 100644 index 00000000..44e89015 Binary files /dev/null and b/public/images/builds/servers/1.webp differ diff --git a/public/images/builds/servers/2.webp b/public/images/builds/servers/2.webp new file mode 100644 index 00000000..04fe9b2c Binary files /dev/null and b/public/images/builds/servers/2.webp differ diff --git a/public/images/builds/servers/3.webp b/public/images/builds/servers/3.webp new file mode 100644 index 00000000..057b167c Binary files /dev/null and b/public/images/builds/servers/3.webp differ diff --git a/public/images/builds/servers/4.webp b/public/images/builds/servers/4.webp new file mode 100644 index 00000000..855f4641 Binary files /dev/null and b/public/images/builds/servers/4.webp differ diff --git a/public/images/builds/servers/banner.webp b/public/images/builds/servers/banner.webp new file mode 100644 index 00000000..55d3cda2 Binary files /dev/null and b/public/images/builds/servers/banner.webp differ diff --git a/public/images/changelogs/v4-beta-383/backup-retention.webp b/public/images/changelogs/v4-beta-383/backup-retention.webp new file mode 100644 index 00000000..9b4bad73 Binary files /dev/null and b/public/images/changelogs/v4-beta-383/backup-retention.webp differ diff --git a/public/images/changelogs/v4-beta-383/deployment-logs.webp b/public/images/changelogs/v4-beta-383/deployment-logs.webp new file mode 100644 index 00000000..4236e096 Binary files /dev/null and b/public/images/changelogs/v4-beta-383/deployment-logs.webp differ diff --git a/public/images/database-logos/clickhouse.webp b/public/images/database-logos/clickhouse.webp new file mode 100644 index 00000000..48071893 Binary files /dev/null and b/public/images/database-logos/clickhouse.webp differ diff --git a/public/images/database-logos/dragonfly-dark.svg b/public/images/database-logos/dragonfly-dark.svg new file mode 100644 index 00000000..dd0f8d6b --- /dev/null +++ b/public/images/database-logos/dragonfly-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/database-logos/dragonfly-light.svg b/public/images/database-logos/dragonfly-light.svg new file mode 100644 index 00000000..6ede4c14 --- /dev/null +++ b/public/images/database-logos/dragonfly-light.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/database-logos/keydb.webp b/public/images/database-logos/keydb.webp new file mode 100644 index 00000000..493242b5 Binary files /dev/null and b/public/images/database-logos/keydb.webp differ diff --git a/public/images/database-logos/mariadb.svg b/public/images/database-logos/mariadb.svg new file mode 100644 index 00000000..ddbe283f --- /dev/null +++ b/public/images/database-logos/mariadb.svg @@ -0,0 +1,15 @@ + + + + + + MDB-VLogo_RGB + + + + + + + + + \ No newline at end of file diff --git a/public/images/database-logos/mongodb.webp b/public/images/database-logos/mongodb.webp new file mode 100644 index 00000000..68a663bf Binary files /dev/null and b/public/images/database-logos/mongodb.webp differ diff --git a/public/images/database-logos/mysql.webp b/public/images/database-logos/mysql.webp new file mode 100644 index 00000000..b85ef0be Binary files /dev/null and b/public/images/database-logos/mysql.webp differ diff --git a/public/images/database-logos/postgresql.webp b/public/images/database-logos/postgresql.webp new file mode 100644 index 00000000..d1eaa543 Binary files /dev/null and b/public/images/database-logos/postgresql.webp differ diff --git a/public/images/database-logos/redis.svg b/public/images/database-logos/redis.svg new file mode 100644 index 00000000..a8de68d2 --- /dev/null +++ b/public/images/database-logos/redis.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/database/ssl/1.webp b/public/images/database/ssl/1.webp new file mode 100644 index 00000000..109b06a3 Binary files /dev/null and b/public/images/database/ssl/1.webp differ diff --git a/public/images/database/ssl/2.webp b/public/images/database/ssl/2.webp new file mode 100644 index 00000000..b1fd8643 Binary files /dev/null and b/public/images/database/ssl/2.webp differ diff --git a/public/images/database/ssl/3.webp b/public/images/database/ssl/3.webp new file mode 100644 index 00000000..06084d7e Binary files /dev/null and b/public/images/database/ssl/3.webp differ diff --git a/public/images/database/ssl/4.webp b/public/images/database/ssl/4.webp new file mode 100644 index 00000000..148f1e10 Binary files /dev/null and b/public/images/database/ssl/4.webp differ diff --git a/public/images/database/ssl/5.webp b/public/images/database/ssl/5.webp new file mode 100644 index 00000000..a1f35678 Binary files /dev/null and b/public/images/database/ssl/5.webp differ diff --git a/public/images/destinations/create-destination-modal.webp b/public/images/destinations/create-destination-modal.webp new file mode 100644 index 00000000..4e714f2d Binary files /dev/null and b/public/images/destinations/create-destination-modal.webp differ diff --git a/public/images/destinations/create-destination.webp b/public/images/destinations/create-destination.webp new file mode 100644 index 00000000..9f653a75 Binary files /dev/null and b/public/images/destinations/create-destination.webp differ diff --git a/public/images/destinations/destinations-clone.webp b/public/images/destinations/destinations-clone.webp new file mode 100644 index 00000000..a01a433b Binary files /dev/null and b/public/images/destinations/destinations-clone.webp differ diff --git a/public/images/destinations/destinations-overview.webp b/public/images/destinations/destinations-overview.webp new file mode 100644 index 00000000..fa1af788 Binary files /dev/null and b/public/images/destinations/destinations-overview.webp differ diff --git a/public/images/destinations/destinations-selection.webp b/public/images/destinations/destinations-selection.webp new file mode 100644 index 00000000..1cfb26b9 Binary files /dev/null and b/public/images/destinations/destinations-selection.webp differ diff --git a/public/images/destinations/destinations-server-overview.webp b/public/images/destinations/destinations-server-overview.webp new file mode 100644 index 00000000..2ede0054 Binary files /dev/null and b/public/images/destinations/destinations-server-overview.webp differ diff --git a/public/images/destinations/destinations-settings.webp b/public/images/destinations/destinations-settings.webp new file mode 100644 index 00000000..da64ca12 Binary files /dev/null and b/public/images/destinations/destinations-settings.webp differ diff --git a/public/images/destinations/scan-networks.webp b/public/images/destinations/scan-networks.webp new file mode 100644 index 00000000..7c834202 Binary files /dev/null and b/public/images/destinations/scan-networks.webp differ diff --git a/public/images/destinations/server-create-destination.webp b/public/images/destinations/server-create-destination.webp new file mode 100644 index 00000000..d392c490 Binary files /dev/null and b/public/images/destinations/server-create-destination.webp differ diff --git a/public/images/get-started/cloud-banner.webp b/public/images/get-started/cloud-banner.webp new file mode 100644 index 00000000..4af2fc23 Binary files /dev/null and b/public/images/get-started/cloud-banner.webp differ diff --git a/public/images/get-started/concepts-banner.webp b/public/images/get-started/concepts-banner.webp new file mode 100644 index 00000000..7e83ee67 Binary files /dev/null and b/public/images/get-started/concepts-banner.webp differ diff --git a/public/images/get-started/downgrade-banner.webp b/public/images/get-started/downgrade-banner.webp new file mode 100644 index 00000000..003e961f Binary files /dev/null and b/public/images/get-started/downgrade-banner.webp differ diff --git a/public/images/get-started/installation-banner.webp b/public/images/get-started/installation-banner.webp new file mode 100644 index 00000000..f7b00f1b Binary files /dev/null and b/public/images/get-started/installation-banner.webp differ diff --git a/public/images/get-started/introduction-banner.webp b/public/images/get-started/introduction-banner.webp new file mode 100644 index 00000000..f535a491 Binary files /dev/null and b/public/images/get-started/introduction-banner.webp differ diff --git a/public/images/get-started/support-banner.webp b/public/images/get-started/support-banner.webp new file mode 100644 index 00000000..1eb6996b Binary files /dev/null and b/public/images/get-started/support-banner.webp differ diff --git a/public/images/get-started/uninstallation-banner.webp b/public/images/get-started/uninstallation-banner.webp new file mode 100644 index 00000000..d7a829a4 Binary files /dev/null and b/public/images/get-started/uninstallation-banner.webp differ diff --git a/public/images/get-started/upgrade/banner.webp b/public/images/get-started/upgrade/banner.webp new file mode 100644 index 00000000..4f037b19 Binary files /dev/null and b/public/images/get-started/upgrade/banner.webp differ diff --git a/public/images/get-started/upgrade/change-frequency.webp b/public/images/get-started/upgrade/change-frequency.webp new file mode 100644 index 00000000..96f13d41 Binary files /dev/null and b/public/images/get-started/upgrade/change-frequency.webp differ diff --git a/public/images/get-started/upgrade/disable-auto-update.webp b/public/images/get-started/upgrade/disable-auto-update.webp new file mode 100644 index 00000000..60cf637a Binary files /dev/null and b/public/images/get-started/upgrade/disable-auto-update.webp differ diff --git a/public/images/get-started/upgrade/upgrade-button-ui.webp b/public/images/get-started/upgrade/upgrade-button-ui.webp new file mode 100644 index 00000000..07d7441d Binary files /dev/null and b/public/images/get-started/upgrade/upgrade-button-ui.webp differ diff --git a/public/images/get-started/usage-banner.webp b/public/images/get-started/usage-banner.webp new file mode 100644 index 00000000..581ef425 Binary files /dev/null and b/public/images/get-started/usage-banner.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/1.webp b/public/images/integrations/cloudflare/ddos-protection/1.webp new file mode 100644 index 00000000..1df7bfa1 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/1.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/10.webp b/public/images/integrations/cloudflare/ddos-protection/10.webp new file mode 100644 index 00000000..231b3841 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/10.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/2.webp b/public/images/integrations/cloudflare/ddos-protection/2.webp new file mode 100644 index 00000000..85083111 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/2.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/3.webp b/public/images/integrations/cloudflare/ddos-protection/3.webp new file mode 100644 index 00000000..a91e2021 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/3.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/4.webp b/public/images/integrations/cloudflare/ddos-protection/4.webp new file mode 100644 index 00000000..a4203331 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/4.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/5.webp b/public/images/integrations/cloudflare/ddos-protection/5.webp new file mode 100644 index 00000000..6920bbf7 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/5.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/6.webp b/public/images/integrations/cloudflare/ddos-protection/6.webp new file mode 100644 index 00000000..6ecc3c97 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/6.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/7.webp b/public/images/integrations/cloudflare/ddos-protection/7.webp new file mode 100644 index 00000000..6704c62d Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/7.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/8.webp b/public/images/integrations/cloudflare/ddos-protection/8.webp new file mode 100644 index 00000000..f64007fe Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/8.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/9.webp b/public/images/integrations/cloudflare/ddos-protection/9.webp new file mode 100644 index 00000000..c90a8b89 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/9.webp differ diff --git a/public/images/integrations/cloudflare/ddos-protection/origin-cert-illustration.webp b/public/images/integrations/cloudflare/ddos-protection/origin-cert-illustration.webp new file mode 100644 index 00000000..5448c9d5 Binary files /dev/null and b/public/images/integrations/cloudflare/ddos-protection/origin-cert-illustration.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/1.webp b/public/images/integrations/cloudflare/tunnels/all-resource/1.webp new file mode 100644 index 00000000..d7862d13 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/1.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/10.webp b/public/images/integrations/cloudflare/tunnels/all-resource/10.webp new file mode 100644 index 00000000..a6c52424 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/10.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/11.webp b/public/images/integrations/cloudflare/tunnels/all-resource/11.webp new file mode 100644 index 00000000..257cb7f4 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/11.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/12.webp b/public/images/integrations/cloudflare/tunnels/all-resource/12.webp new file mode 100644 index 00000000..0a7bb1d5 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/12.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/13.webp b/public/images/integrations/cloudflare/tunnels/all-resource/13.webp new file mode 100644 index 00000000..fc3b58e1 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/13.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/14.webp b/public/images/integrations/cloudflare/tunnels/all-resource/14.webp new file mode 100644 index 00000000..f9beff82 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/14.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/15.webp b/public/images/integrations/cloudflare/tunnels/all-resource/15.webp new file mode 100644 index 00000000..e16249e0 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/15.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/16.webp b/public/images/integrations/cloudflare/tunnels/all-resource/16.webp new file mode 100644 index 00000000..7ab44cf3 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/16.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/2.webp b/public/images/integrations/cloudflare/tunnels/all-resource/2.webp new file mode 100644 index 00000000..268964aa Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/2.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/3.webp b/public/images/integrations/cloudflare/tunnels/all-resource/3.webp new file mode 100644 index 00000000..4a189683 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/3.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/4.webp b/public/images/integrations/cloudflare/tunnels/all-resource/4.webp new file mode 100644 index 00000000..715968ed Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/4.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/5.webp b/public/images/integrations/cloudflare/tunnels/all-resource/5.webp new file mode 100644 index 00000000..f0460474 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/5.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/6.webp b/public/images/integrations/cloudflare/tunnels/all-resource/6.webp new file mode 100644 index 00000000..0c55e4e2 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/6.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/7.webp b/public/images/integrations/cloudflare/tunnels/all-resource/7.webp new file mode 100644 index 00000000..d3d102b3 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/7.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/8.webp b/public/images/integrations/cloudflare/tunnels/all-resource/8.webp new file mode 100644 index 00000000..1cef604e Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/8.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/9.webp b/public/images/integrations/cloudflare/tunnels/all-resource/9.webp new file mode 100644 index 00000000..0f6ed7c8 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/9.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/all-resource/high-level-diagram.webp b/public/images/integrations/cloudflare/tunnels/all-resource/high-level-diagram.webp new file mode 100644 index 00000000..554125f9 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/all-resource/high-level-diagram.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/1.webp b/public/images/integrations/cloudflare/tunnels/full-tls/1.webp new file mode 100644 index 00000000..6d23e359 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/1.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/10.webp b/public/images/integrations/cloudflare/tunnels/full-tls/10.webp new file mode 100644 index 00000000..9066574d Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/10.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/11.webp b/public/images/integrations/cloudflare/tunnels/full-tls/11.webp new file mode 100644 index 00000000..14049abf Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/11.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/12.webp b/public/images/integrations/cloudflare/tunnels/full-tls/12.webp new file mode 100644 index 00000000..f238e2c8 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/12.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/13.webp b/public/images/integrations/cloudflare/tunnels/full-tls/13.webp new file mode 100644 index 00000000..648e1b7a Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/13.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/14.webp b/public/images/integrations/cloudflare/tunnels/full-tls/14.webp new file mode 100644 index 00000000..f64007fe Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/14.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/15.webp b/public/images/integrations/cloudflare/tunnels/full-tls/15.webp new file mode 100644 index 00000000..c90a8b89 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/15.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/16.webp b/public/images/integrations/cloudflare/tunnels/full-tls/16.webp new file mode 100644 index 00000000..231b3841 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/16.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/2.webp b/public/images/integrations/cloudflare/tunnels/full-tls/2.webp new file mode 100644 index 00000000..d6b73542 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/2.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/3.webp b/public/images/integrations/cloudflare/tunnels/full-tls/3.webp new file mode 100644 index 00000000..5b9e7609 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/3.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/4.webp b/public/images/integrations/cloudflare/tunnels/full-tls/4.webp new file mode 100644 index 00000000..87f9191b Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/4.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/5.webp b/public/images/integrations/cloudflare/tunnels/full-tls/5.webp new file mode 100644 index 00000000..8bd39986 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/5.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/6.webp b/public/images/integrations/cloudflare/tunnels/full-tls/6.webp new file mode 100644 index 00000000..0fcfc12a Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/6.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/7.webp b/public/images/integrations/cloudflare/tunnels/full-tls/7.webp new file mode 100644 index 00000000..306b6ef5 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/7.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/8.webp b/public/images/integrations/cloudflare/tunnels/full-tls/8.webp new file mode 100644 index 00000000..96ef9002 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/8.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/full-tls/9.webp b/public/images/integrations/cloudflare/tunnels/full-tls/9.webp new file mode 100644 index 00000000..ecd3aa55 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/full-tls/9.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-1.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-1.webp new file mode 100644 index 00000000..a843c91e Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-1.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-10.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-10.webp new file mode 100644 index 00000000..9be5d19a Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-10.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-11.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-11.webp new file mode 100644 index 00000000..82141623 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-11.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-12.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-12.webp new file mode 100644 index 00000000..9f790d1f Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-12.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-13.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-13.webp new file mode 100644 index 00000000..eb1904f5 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-13.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-14.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-14.webp new file mode 100644 index 00000000..c9d815be Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-14.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-15.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-15.webp new file mode 100644 index 00000000..96637203 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-15.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-16.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-16.webp new file mode 100644 index 00000000..b8a406c1 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-16.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-2.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-2.webp new file mode 100644 index 00000000..14255b78 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-2.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-3.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-3.webp new file mode 100644 index 00000000..d92c7f45 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-3.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-4.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-4.webp new file mode 100644 index 00000000..e381f071 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-4.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-5.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-5.webp new file mode 100644 index 00000000..ee1d2634 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-5.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-6.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-6.webp new file mode 100644 index 00000000..586e0605 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-6.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-7.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-7.webp new file mode 100644 index 00000000..04c5d5f7 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-7.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-8.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-8.webp new file mode 100644 index 00000000..13df5bbe Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-8.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/automated-9.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-9.webp new file mode 100644 index 00000000..faa841ae Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/automated-9.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/high-level-diagram.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/high-level-diagram.webp new file mode 100644 index 00000000..6314527d Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/high-level-diagram.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-1.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-1.webp new file mode 100644 index 00000000..4c44eb70 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-1.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-10.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-10.webp new file mode 100644 index 00000000..213bbf5b Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-10.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-11.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-11.webp new file mode 100644 index 00000000..8fb63781 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-11.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-12.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-12.webp new file mode 100644 index 00000000..14035683 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-12.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-13.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-13.webp new file mode 100644 index 00000000..04742cfb Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-13.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-14.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-14.webp new file mode 100644 index 00000000..72af718d Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-14.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-2.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-2.webp new file mode 100644 index 00000000..96324724 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-2.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-3.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-3.webp new file mode 100644 index 00000000..f9599523 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-3.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-4.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-4.webp new file mode 100644 index 00000000..268964aa Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-4.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-5.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-5.webp new file mode 100644 index 00000000..4a189683 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-5.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-6.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-6.webp new file mode 100644 index 00000000..d77b3491 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-6.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-7.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-7.webp new file mode 100644 index 00000000..0fbf804e Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-7.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-8.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-8.webp new file mode 100644 index 00000000..9f790d1f Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-8.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/server-ssh/manual-9.webp b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-9.webp new file mode 100644 index 00000000..7d903799 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/server-ssh/manual-9.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/1.webp b/public/images/integrations/cloudflare/tunnels/single-resource/1.webp new file mode 100644 index 00000000..139fa0cf Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/1.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/10.webp b/public/images/integrations/cloudflare/tunnels/single-resource/10.webp new file mode 100644 index 00000000..c32e09eb Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/10.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/11.webp b/public/images/integrations/cloudflare/tunnels/single-resource/11.webp new file mode 100644 index 00000000..3cdef975 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/11.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/12.webp b/public/images/integrations/cloudflare/tunnels/single-resource/12.webp new file mode 100644 index 00000000..fc3b58e1 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/12.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/13.webp b/public/images/integrations/cloudflare/tunnels/single-resource/13.webp new file mode 100644 index 00000000..97510f17 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/13.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/14.webp b/public/images/integrations/cloudflare/tunnels/single-resource/14.webp new file mode 100644 index 00000000..2eefeb0c Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/14.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/2.webp b/public/images/integrations/cloudflare/tunnels/single-resource/2.webp new file mode 100644 index 00000000..04c5d5f7 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/2.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/3.webp b/public/images/integrations/cloudflare/tunnels/single-resource/3.webp new file mode 100644 index 00000000..13df5bbe Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/3.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/4.webp b/public/images/integrations/cloudflare/tunnels/single-resource/4.webp new file mode 100644 index 00000000..faa841ae Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/4.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/5.webp b/public/images/integrations/cloudflare/tunnels/single-resource/5.webp new file mode 100644 index 00000000..715968ed Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/5.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/6.webp b/public/images/integrations/cloudflare/tunnels/single-resource/6.webp new file mode 100644 index 00000000..b79d6b40 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/6.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/7.webp b/public/images/integrations/cloudflare/tunnels/single-resource/7.webp new file mode 100644 index 00000000..396c8377 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/7.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/8.webp b/public/images/integrations/cloudflare/tunnels/single-resource/8.webp new file mode 100644 index 00000000..cbcf3ca6 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/8.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/9.webp b/public/images/integrations/cloudflare/tunnels/single-resource/9.webp new file mode 100644 index 00000000..3235df60 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/9.webp differ diff --git a/public/images/integrations/cloudflare/tunnels/single-resource/high-level-diagram.webp b/public/images/integrations/cloudflare/tunnels/single-resource/high-level-diagram.webp new file mode 100644 index 00000000..bb075bb1 Binary files /dev/null and b/public/images/integrations/cloudflare/tunnels/single-resource/high-level-diagram.webp differ diff --git a/public/images/knowledge-base/compose/1.webp b/public/images/knowledge-base/compose/1.webp new file mode 100644 index 00000000..65826954 Binary files /dev/null and b/public/images/knowledge-base/compose/1.webp differ diff --git a/public/images/knowledge-base/compose/2.webp b/public/images/knowledge-base/compose/2.webp new file mode 100644 index 00000000..344c4673 Binary files /dev/null and b/public/images/knowledge-base/compose/2.webp differ diff --git a/public/images/knowledge-base/compose/domain.webp b/public/images/knowledge-base/compose/domain.webp new file mode 100644 index 00000000..52e31727 Binary files /dev/null and b/public/images/knowledge-base/compose/domain.webp differ diff --git a/public/images/knowledge-base/environment-variables/developer-view.png b/public/images/knowledge-base/environment-variables/developer-view.png new file mode 100644 index 00000000..5639475b Binary files /dev/null and b/public/images/knowledge-base/environment-variables/developer-view.png differ diff --git a/public/images/knowledge-base/how-tos/backup-restore-coolify/1.webp b/public/images/knowledge-base/how-tos/backup-restore-coolify/1.webp new file mode 100644 index 00000000..78a31e77 Binary files /dev/null and b/public/images/knowledge-base/how-tos/backup-restore-coolify/1.webp differ diff --git a/public/images/knowledge-base/how-tos/backup-restore-coolify/2.webp b/public/images/knowledge-base/how-tos/backup-restore-coolify/2.webp new file mode 100644 index 00000000..23565821 Binary files /dev/null and b/public/images/knowledge-base/how-tos/backup-restore-coolify/2.webp differ diff --git a/public/images/knowledge-base/how-tos/backup-restore-coolify/3.webp b/public/images/knowledge-base/how-tos/backup-restore-coolify/3.webp new file mode 100644 index 00000000..1c43af10 Binary files /dev/null and b/public/images/knowledge-base/how-tos/backup-restore-coolify/3.webp differ diff --git a/public/images/knowledge-base/how-tos/migrate-apps-different-host/1.webp b/public/images/knowledge-base/how-tos/migrate-apps-different-host/1.webp new file mode 100644 index 00000000..d0d02c21 Binary files /dev/null and b/public/images/knowledge-base/how-tos/migrate-apps-different-host/1.webp differ diff --git a/public/images/knowledge-base/how-tos/migrate-apps-different-host/2.webp b/public/images/knowledge-base/how-tos/migrate-apps-different-host/2.webp new file mode 100644 index 00000000..db4110f7 Binary files /dev/null and b/public/images/knowledge-base/how-tos/migrate-apps-different-host/2.webp differ diff --git a/public/images/knowledge-base/how-tos/migrate-apps-different-host/3.webp b/public/images/knowledge-base/how-tos/migrate-apps-different-host/3.webp new file mode 100644 index 00000000..d559c234 Binary files /dev/null and b/public/images/knowledge-base/how-tos/migrate-apps-different-host/3.webp differ diff --git a/public/images/knowledge-base/how-tos/migrate-apps-different-host/4.webp b/public/images/knowledge-base/how-tos/migrate-apps-different-host/4.webp new file mode 100644 index 00000000..2c89c1d5 Binary files /dev/null and b/public/images/knowledge-base/how-tos/migrate-apps-different-host/4.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/1.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/1.webp new file mode 100644 index 00000000..6a803fa8 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/1.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/10.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/10.webp new file mode 100644 index 00000000..f3f75b60 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/10.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/11.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/11.webp new file mode 100644 index 00000000..d0e9b825 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/11.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/12.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/12.webp new file mode 100644 index 00000000..98bcb9f9 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/12.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/13.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/13.webp new file mode 100644 index 00000000..6ec129fc Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/13.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/14.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/14.webp new file mode 100644 index 00000000..421a3a34 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/14.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/15.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/15.webp new file mode 100644 index 00000000..cd2b8c2d Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/15.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/16.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/16.webp new file mode 100644 index 00000000..7cc7e729 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/16.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/2.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/2.webp new file mode 100644 index 00000000..9bbef678 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/2.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/3.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/3.webp new file mode 100644 index 00000000..410f5683 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/3.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/4.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/4.webp new file mode 100644 index 00000000..15d7cb32 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/4.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/5.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/5.webp new file mode 100644 index 00000000..d11b2fb1 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/5.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/6.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/6.webp new file mode 100644 index 00000000..68b13c55 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/6.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/7.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/7.webp new file mode 100644 index 00000000..0b33ff90 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/7.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/8.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/8.webp new file mode 100644 index 00000000..56919a04 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/8.webp differ diff --git a/public/images/knowledge-base/how-tos/webstudio-with-hetzner/9.webp b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/9.webp new file mode 100644 index 00000000..80584fb8 Binary files /dev/null and b/public/images/knowledge-base/how-tos/webstudio-with-hetzner/9.webp differ diff --git a/public/images/knowledge-base/resources/healthcheck.webp b/public/images/knowledge-base/resources/healthcheck.webp new file mode 100644 index 00000000..80dd8199 Binary files /dev/null and b/public/images/knowledge-base/resources/healthcheck.webp differ diff --git a/public/images/knowledge-base/servers/openssh/1.webp b/public/images/knowledge-base/servers/openssh/1.webp new file mode 100644 index 00000000..d90e1d6f Binary files /dev/null and b/public/images/knowledge-base/servers/openssh/1.webp differ diff --git a/public/images/knowledge-base/servers/openssh/2.webp b/public/images/knowledge-base/servers/openssh/2.webp new file mode 100644 index 00000000..5d87939f Binary files /dev/null and b/public/images/knowledge-base/servers/openssh/2.webp differ diff --git a/public/images/knowledge-base/servers/openssh/3.webp b/public/images/knowledge-base/servers/openssh/3.webp new file mode 100644 index 00000000..dfc0ad6c Binary files /dev/null and b/public/images/knowledge-base/servers/openssh/3.webp differ diff --git a/public/images/knowledge-base/servers/openssh/4.webp b/public/images/knowledge-base/servers/openssh/4.webp new file mode 100644 index 00000000..a68c7586 Binary files /dev/null and b/public/images/knowledge-base/servers/openssh/4.webp differ diff --git a/public/images/knowledge-base/servers/openssh/5.webp b/public/images/knowledge-base/servers/openssh/5.webp new file mode 100644 index 00000000..8b067c8f Binary files /dev/null and b/public/images/knowledge-base/servers/openssh/5.webp differ diff --git a/public/images/knowledge-base/servers/openssh/6.webp b/public/images/knowledge-base/servers/openssh/6.webp new file mode 100644 index 00000000..b1ae5cd9 Binary files /dev/null and b/public/images/knowledge-base/servers/openssh/6.webp differ diff --git a/public/images/knowledge-base/servers/patching/1.webp b/public/images/knowledge-base/servers/patching/1.webp new file mode 100644 index 00000000..a01b6060 Binary files /dev/null and b/public/images/knowledge-base/servers/patching/1.webp differ diff --git a/public/images/knowledge-base/servers/patching/2.webp b/public/images/knowledge-base/servers/patching/2.webp new file mode 100644 index 00000000..4bfd7b36 Binary files /dev/null and b/public/images/knowledge-base/servers/patching/2.webp differ diff --git a/public/images/knowledge-base/servers/terminal-access/1.webp b/public/images/knowledge-base/servers/terminal-access/1.webp new file mode 100644 index 00000000..2f4c3677 Binary files /dev/null and b/public/images/knowledge-base/servers/terminal-access/1.webp differ diff --git a/public/images/loadbalancer/multiple-domains.webp b/public/images/loadbalancer/multiple-domains.webp new file mode 100644 index 00000000..4d2069e5 Binary files /dev/null and b/public/images/loadbalancer/multiple-domains.webp differ diff --git a/public/images/loadbalancer/one-domain.webp b/public/images/loadbalancer/one-domain.webp new file mode 100644 index 00000000..05771e13 Binary files /dev/null and b/public/images/loadbalancer/one-domain.webp differ diff --git a/public/images/resources/screenshots/1.webp b/public/images/resources/screenshots/1.webp new file mode 100644 index 00000000..2918af14 Binary files /dev/null and b/public/images/resources/screenshots/1.webp differ diff --git a/public/images/resources/screenshots/10.webp b/public/images/resources/screenshots/10.webp new file mode 100644 index 00000000..c8577e35 Binary files /dev/null and b/public/images/resources/screenshots/10.webp differ diff --git a/public/images/resources/screenshots/11.webp b/public/images/resources/screenshots/11.webp new file mode 100644 index 00000000..bcadcc88 Binary files /dev/null and b/public/images/resources/screenshots/11.webp differ diff --git a/public/images/resources/screenshots/12.webp b/public/images/resources/screenshots/12.webp new file mode 100644 index 00000000..70ff0439 Binary files /dev/null and b/public/images/resources/screenshots/12.webp differ diff --git a/public/images/resources/screenshots/13.webp b/public/images/resources/screenshots/13.webp new file mode 100644 index 00000000..426f18a1 Binary files /dev/null and b/public/images/resources/screenshots/13.webp differ diff --git a/public/images/resources/screenshots/14.webp b/public/images/resources/screenshots/14.webp new file mode 100644 index 00000000..e98c05f1 Binary files /dev/null and b/public/images/resources/screenshots/14.webp differ diff --git a/public/images/resources/screenshots/15.webp b/public/images/resources/screenshots/15.webp new file mode 100644 index 00000000..229a3c58 Binary files /dev/null and b/public/images/resources/screenshots/15.webp differ diff --git a/public/images/resources/screenshots/16.webp b/public/images/resources/screenshots/16.webp new file mode 100644 index 00000000..e1ab9899 Binary files /dev/null and b/public/images/resources/screenshots/16.webp differ diff --git a/public/images/resources/screenshots/17.webp b/public/images/resources/screenshots/17.webp new file mode 100644 index 00000000..3a541032 Binary files /dev/null and b/public/images/resources/screenshots/17.webp differ diff --git a/public/images/resources/screenshots/18.webp b/public/images/resources/screenshots/18.webp new file mode 100644 index 00000000..b999b6bb Binary files /dev/null and b/public/images/resources/screenshots/18.webp differ diff --git a/public/images/resources/screenshots/2.webp b/public/images/resources/screenshots/2.webp new file mode 100644 index 00000000..51a4e496 Binary files /dev/null and b/public/images/resources/screenshots/2.webp differ diff --git a/public/images/resources/screenshots/3.webp b/public/images/resources/screenshots/3.webp new file mode 100644 index 00000000..dcf44cdc Binary files /dev/null and b/public/images/resources/screenshots/3.webp differ diff --git a/public/images/resources/screenshots/4.webp b/public/images/resources/screenshots/4.webp new file mode 100644 index 00000000..90999a1d Binary files /dev/null and b/public/images/resources/screenshots/4.webp differ diff --git a/public/images/resources/screenshots/5.webp b/public/images/resources/screenshots/5.webp new file mode 100644 index 00000000..7bb71577 Binary files /dev/null and b/public/images/resources/screenshots/5.webp differ diff --git a/public/images/resources/screenshots/6.webp b/public/images/resources/screenshots/6.webp new file mode 100644 index 00000000..dcdc6434 Binary files /dev/null and b/public/images/resources/screenshots/6.webp differ diff --git a/public/images/resources/screenshots/7.webp b/public/images/resources/screenshots/7.webp new file mode 100644 index 00000000..fbfa8668 Binary files /dev/null and b/public/images/resources/screenshots/7.webp differ diff --git a/public/images/resources/screenshots/8.webp b/public/images/resources/screenshots/8.webp new file mode 100644 index 00000000..fa074f3c Binary files /dev/null and b/public/images/resources/screenshots/8.webp differ diff --git a/public/images/resources/screenshots/9.webp b/public/images/resources/screenshots/9.webp new file mode 100644 index 00000000..535dcebf Binary files /dev/null and b/public/images/resources/screenshots/9.webp differ diff --git a/public/images/screenshots/Docker-compose-environment-variables-UI.webp b/public/images/screenshots/Docker-compose-environment-variables-UI.webp new file mode 100644 index 00000000..072441d3 Binary files /dev/null and b/public/images/screenshots/Docker-compose-environment-variables-UI.webp differ diff --git a/public/images/screenshots/How-to-add-a-database.webp b/public/images/screenshots/How-to-add-a-database.webp new file mode 100644 index 00000000..3e54874a Binary files /dev/null and b/public/images/screenshots/How-to-add-a-database.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.webp new file mode 100644 index 00000000..51a4e496 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205323_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.webp new file mode 100644 index 00000000..2918af14 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205338_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.webp new file mode 100644 index 00000000..c8577e35 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205348_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.webp new file mode 100644 index 00000000..bcadcc88 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205356_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.webp new file mode 100644 index 00000000..70ff0439 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205420_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.webp new file mode 100644 index 00000000..426f18a1 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205431_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.webp new file mode 100644 index 00000000..90999a1d Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205446_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.webp new file mode 100644 index 00000000..fbfa8668 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_20548_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.webp new file mode 100644 index 00000000..e98c05f1 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205515_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.webp new file mode 100644 index 00000000..229a3c58 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205527_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.webp new file mode 100644 index 00000000..dcf44cdc Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205553_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.webp new file mode 100644 index 00000000..fa074f3c Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_20557_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.webp new file mode 100644 index 00000000..dcdc6434 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205610_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.webp new file mode 100644 index 00000000..e1ab9899 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205627_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.webp new file mode 100644 index 00000000..535dcebf Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_20562_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.webp new file mode 100644 index 00000000..3a541032 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205648_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.webp new file mode 100644 index 00000000..7bb71577 Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_20570_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.webp b/public/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.webp new file mode 100644 index 00000000..b999b6bb Binary files /dev/null and b/public/images/screenshots/Screenshot_27-3-2024_205712_staging.coollabs.io.webp differ diff --git a/public/images/screenshots/sentinel.webp b/public/images/screenshots/sentinel.webp new file mode 100644 index 00000000..56696a4c Binary files /dev/null and b/public/images/screenshots/sentinel.webp differ diff --git a/public/images/services/FreshRSS-logo.png b/public/images/services/FreshRSS-logo.png new file mode 100644 index 00000000..889c8723 Binary files /dev/null and b/public/images/services/FreshRSS-logo.png differ diff --git a/public/images/services/Joomla-Logo.svg b/public/images/services/Joomla-Logo.svg new file mode 100644 index 00000000..68dccaa9 --- /dev/null +++ b/public/images/services/Joomla-Logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/activepieces-logo.png b/public/images/services/activepieces-logo.png new file mode 100644 index 00000000..373c4fad Binary files /dev/null and b/public/images/services/activepieces-logo.png differ diff --git a/public/images/services/activepieces0.webp b/public/images/services/activepieces0.webp new file mode 100644 index 00000000..29d475d3 Binary files /dev/null and b/public/images/services/activepieces0.webp differ diff --git a/public/images/services/activepieces1.gif b/public/images/services/activepieces1.gif new file mode 100644 index 00000000..ab5d8163 Binary files /dev/null and b/public/images/services/activepieces1.gif differ diff --git a/public/images/services/activepieces2.gif b/public/images/services/activepieces2.gif new file mode 100644 index 00000000..ee4f0243 Binary files /dev/null and b/public/images/services/activepieces2.gif differ diff --git a/public/images/services/actual-budget-screenshot.webp b/public/images/services/actual-budget-screenshot.webp new file mode 100644 index 00000000..99843ab5 Binary files /dev/null and b/public/images/services/actual-budget-screenshot.webp differ diff --git a/public/images/services/actualbudget-logo.webp b/public/images/services/actualbudget-logo.webp new file mode 100644 index 00000000..ac9685e8 Binary files /dev/null and b/public/images/services/actualbudget-logo.webp differ diff --git a/public/images/services/affine-screenshots.gif b/public/images/services/affine-screenshots.gif new file mode 100644 index 00000000..d0838d2a Binary files /dev/null and b/public/images/services/affine-screenshots.gif differ diff --git a/public/images/services/affine.webp b/public/images/services/affine.webp new file mode 100644 index 00000000..85ece069 Binary files /dev/null and b/public/images/services/affine.webp differ diff --git a/public/images/services/alexandrie-logo.svg b/public/images/services/alexandrie-logo.svg new file mode 100644 index 00000000..404fc5e2 --- /dev/null +++ b/public/images/services/alexandrie-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/alexandrie.webp b/public/images/services/alexandrie.webp new file mode 100644 index 00000000..0cdf6c8b Binary files /dev/null and b/public/images/services/alexandrie.webp differ diff --git a/public/images/services/anythingllm-logo.svg b/public/images/services/anythingllm-logo.svg new file mode 100644 index 00000000..6938b018 --- /dev/null +++ b/public/images/services/anythingllm-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/anythingllm.gif b/public/images/services/anythingllm.gif new file mode 100644 index 00000000..d4f01021 Binary files /dev/null and b/public/images/services/anythingllm.gif differ diff --git a/public/images/services/anythingllm.webp b/public/images/services/anythingllm.webp new file mode 100644 index 00000000..957e4b0a Binary files /dev/null and b/public/images/services/anythingllm.webp differ diff --git a/public/images/services/appflowy-screenshots.webp b/public/images/services/appflowy-screenshots.webp new file mode 100644 index 00000000..57dabde5 Binary files /dev/null and b/public/images/services/appflowy-screenshots.webp differ diff --git a/public/images/services/appflowy.svg b/public/images/services/appflowy.svg new file mode 100644 index 00000000..6b5430bf --- /dev/null +++ b/public/images/services/appflowy.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/services/appriseapi-logo.png b/public/images/services/appriseapi-logo.png new file mode 100644 index 00000000..aa6824be Binary files /dev/null and b/public/images/services/appriseapi-logo.png differ diff --git a/public/images/services/appsmith-logo.svg b/public/images/services/appsmith-logo.svg new file mode 100644 index 00000000..87517796 --- /dev/null +++ b/public/images/services/appsmith-logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/appwrite-logo.svg b/public/images/services/appwrite-logo.svg new file mode 100644 index 00000000..dc58a811 --- /dev/null +++ b/public/images/services/appwrite-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/argilla-logo.svg b/public/images/services/argilla-logo.svg new file mode 100644 index 00000000..e1939273 --- /dev/null +++ b/public/images/services/argilla-logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/services/argilla.webp b/public/images/services/argilla.webp new file mode 100644 index 00000000..7381524e Binary files /dev/null and b/public/images/services/argilla.webp differ diff --git a/public/images/services/audiobookshelf-logo.svg b/public/images/services/audiobookshelf-logo.svg new file mode 100644 index 00000000..d641b765 --- /dev/null +++ b/public/images/services/audiobookshelf-logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/authentik-logo.png b/public/images/services/authentik-logo.png new file mode 100644 index 00000000..8f945aad Binary files /dev/null and b/public/images/services/authentik-logo.png differ diff --git a/public/images/services/autobase-logo.svg b/public/images/services/autobase-logo.svg new file mode 100644 index 00000000..83ab88f6 --- /dev/null +++ b/public/images/services/autobase-logo.svg @@ -0,0 +1,9 @@ + + + + + data, seo, marketing, business, web, internet, website, optimization, technology, search, engine, co + + + \ No newline at end of file diff --git a/public/images/services/babybuddy-logo.png b/public/images/services/babybuddy-logo.png new file mode 100644 index 00000000..36623f74 Binary files /dev/null and b/public/images/services/babybuddy-logo.png differ diff --git a/public/images/services/bento-pdf.png b/public/images/services/bento-pdf.png new file mode 100644 index 00000000..7926d09b Binary files /dev/null and b/public/images/services/bento-pdf.png differ diff --git a/public/images/services/beszel-logo.webp b/public/images/services/beszel-logo.webp new file mode 100644 index 00000000..9cd1f9b1 Binary files /dev/null and b/public/images/services/beszel-logo.webp differ diff --git a/public/images/services/beszel-setup-1.webp b/public/images/services/beszel-setup-1.webp new file mode 100644 index 00000000..e9225e50 Binary files /dev/null and b/public/images/services/beszel-setup-1.webp differ diff --git a/public/images/services/beszel-setup-2.webp b/public/images/services/beszel-setup-2.webp new file mode 100644 index 00000000..ea691b43 Binary files /dev/null and b/public/images/services/beszel-setup-2.webp differ diff --git a/public/images/services/beszel-setup-3.webp b/public/images/services/beszel-setup-3.webp new file mode 100644 index 00000000..25000f96 Binary files /dev/null and b/public/images/services/beszel-setup-3.webp differ diff --git a/public/images/services/beszel-setup-4.webp b/public/images/services/beszel-setup-4.webp new file mode 100644 index 00000000..942e474c Binary files /dev/null and b/public/images/services/beszel-setup-4.webp differ diff --git a/public/images/services/beszel-ui.webp b/public/images/services/beszel-ui.webp new file mode 100644 index 00000000..891c5d36 Binary files /dev/null and b/public/images/services/beszel-ui.webp differ diff --git a/public/images/services/bitcoin.svg b/public/images/services/bitcoin.svg new file mode 100644 index 00000000..2b75c99b --- /dev/null +++ b/public/images/services/bitcoin.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/public/images/services/bluesky-logo.svg b/public/images/services/bluesky-logo.svg new file mode 100644 index 00000000..39a7c182 --- /dev/null +++ b/public/images/services/bluesky-logo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/images/services/booklore-logo.svg b/public/images/services/booklore-logo.svg new file mode 100644 index 00000000..cd8230fa --- /dev/null +++ b/public/images/services/booklore-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/services/bookstack-logo.png b/public/images/services/bookstack-logo.png new file mode 100644 index 00000000..d10b3ca4 Binary files /dev/null and b/public/images/services/bookstack-logo.png differ diff --git a/public/images/services/browserless-logo.svg b/public/images/services/browserless-logo.svg new file mode 100644 index 00000000..1d2d09a2 --- /dev/null +++ b/public/images/services/browserless-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/browserless.webp b/public/images/services/browserless.webp new file mode 100644 index 00000000..38772bdf Binary files /dev/null and b/public/images/services/browserless.webp differ diff --git a/public/images/services/budge-logo.png b/public/images/services/budge-logo.png new file mode 100644 index 00000000..b44606c6 Binary files /dev/null and b/public/images/services/budge-logo.png differ diff --git a/public/images/services/budibase-logo.svg b/public/images/services/budibase-logo.svg new file mode 100644 index 00000000..c77636bf --- /dev/null +++ b/public/images/services/budibase-logo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/bugsink-logo.webp b/public/images/services/bugsink-logo.webp new file mode 100644 index 00000000..862ba53d Binary files /dev/null and b/public/images/services/bugsink-logo.webp differ diff --git a/public/images/services/bugsink.webp b/public/images/services/bugsink.webp new file mode 100644 index 00000000..ac0b7df1 Binary files /dev/null and b/public/images/services/bugsink.webp differ diff --git a/public/images/services/calcom-logo.svg b/public/images/services/calcom-logo.svg new file mode 100644 index 00000000..446b1665 --- /dev/null +++ b/public/images/services/calcom-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/calcom.png b/public/images/services/calcom.png new file mode 100644 index 00000000..77a18458 Binary files /dev/null and b/public/images/services/calcom.png differ diff --git a/public/images/services/calibre-web-automated-with-downloader.png b/public/images/services/calibre-web-automated-with-downloader.png new file mode 100644 index 00000000..758b2682 Binary files /dev/null and b/public/images/services/calibre-web-automated-with-downloader.png differ diff --git a/public/images/services/calibreweb-logo.svg b/public/images/services/calibreweb-logo.svg new file mode 100644 index 00000000..324ec2ee --- /dev/null +++ b/public/images/services/calibreweb-logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/images/services/cap-app.webp b/public/images/services/cap-app.webp new file mode 100644 index 00000000..e9624a80 Binary files /dev/null and b/public/images/services/cap-app.webp differ diff --git a/public/images/services/cap-captcha.png b/public/images/services/cap-captcha.png new file mode 100644 index 00000000..f6e67dc3 Binary files /dev/null and b/public/images/services/cap-captcha.png differ diff --git a/public/images/services/cap-dashboard.png b/public/images/services/cap-dashboard.png new file mode 100644 index 00000000..3345d4ff Binary files /dev/null and b/public/images/services/cap-dashboard.png differ diff --git a/public/images/services/cap.svg b/public/images/services/cap.svg new file mode 100644 index 00000000..83d26e15 --- /dev/null +++ b/public/images/services/cap.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/castopod-logo.svg b/public/images/services/castopod-logo.svg new file mode 100644 index 00000000..c7300840 --- /dev/null +++ b/public/images/services/castopod-logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/images/services/changedetection-logo.png b/public/images/services/changedetection-logo.png new file mode 100644 index 00000000..b2e86f1d Binary files /dev/null and b/public/images/services/changedetection-logo.png differ diff --git a/public/images/services/chaskiq-logo.png b/public/images/services/chaskiq-logo.png new file mode 100644 index 00000000..8f9f142a Binary files /dev/null and b/public/images/services/chaskiq-logo.png differ diff --git a/public/images/services/chatwoot-logo.svg b/public/images/services/chatwoot-logo.svg new file mode 100644 index 00000000..1a7bf0bf --- /dev/null +++ b/public/images/services/chatwoot-logo.svg @@ -0,0 +1,10 @@ + + + diff --git a/public/images/services/checkmate-logo.png b/public/images/services/checkmate-logo.png new file mode 100644 index 00000000..f0f31466 Binary files /dev/null and b/public/images/services/checkmate-logo.png differ diff --git a/public/images/services/checkmate.jpg b/public/images/services/checkmate.jpg new file mode 100644 index 00000000..9cf21a3d Binary files /dev/null and b/public/images/services/checkmate.jpg differ diff --git a/public/images/services/chibisafe-logo.svg b/public/images/services/chibisafe-logo.svg new file mode 100644 index 00000000..03fc3709 --- /dev/null +++ b/public/images/services/chibisafe-logo.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/chroma-logo.svg b/public/images/services/chroma-logo.svg new file mode 100644 index 00000000..930288fb --- /dev/null +++ b/public/images/services/chroma-logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/classicpress-logo.svg b/public/images/services/classicpress-logo.svg new file mode 100644 index 00000000..341be300 --- /dev/null +++ b/public/images/services/classicpress-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/cloudbeaver-logo.png b/public/images/services/cloudbeaver-logo.png new file mode 100644 index 00000000..0682402e Binary files /dev/null and b/public/images/services/cloudbeaver-logo.png differ diff --git a/public/images/services/cloudflared-logo.svg b/public/images/services/cloudflared-logo.svg new file mode 100644 index 00000000..f9ff79f9 --- /dev/null +++ b/public/images/services/cloudflared-logo.svg @@ -0,0 +1,26 @@ + + + + + Cloudflare logo + + + + + \ No newline at end of file diff --git a/public/images/services/cloudreve-logo.svg b/public/images/services/cloudreve-logo.svg new file mode 100644 index 00000000..0a2c6c14 --- /dev/null +++ b/public/images/services/cloudreve-logo.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/cockpit-logo.svg b/public/images/services/cockpit-logo.svg new file mode 100644 index 00000000..fdb81d47 --- /dev/null +++ b/public/images/services/cockpit-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/services/cockpit.jpg b/public/images/services/cockpit.jpg new file mode 100644 index 00000000..b51b7e61 Binary files /dev/null and b/public/images/services/cockpit.jpg differ diff --git a/public/images/services/codeserver-logo.svg b/public/images/services/codeserver-logo.svg new file mode 100644 index 00000000..8b589eef --- /dev/null +++ b/public/images/services/codeserver-logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/images/services/codimd-logo.png b/public/images/services/codimd-logo.png new file mode 100644 index 00000000..eebdcf78 Binary files /dev/null and b/public/images/services/codimd-logo.png differ diff --git a/public/images/services/codimd-logo.webp b/public/images/services/codimd-logo.webp new file mode 100644 index 00000000..177f21c3 Binary files /dev/null and b/public/images/services/codimd-logo.webp differ diff --git a/public/images/services/codimd-screenshots.webp b/public/images/services/codimd-screenshots.webp new file mode 100644 index 00000000..187bec82 Binary files /dev/null and b/public/images/services/codimd-screenshots.webp differ diff --git a/public/images/services/convertx-logo.png b/public/images/services/convertx-logo.png new file mode 100644 index 00000000..7f4c41e2 Binary files /dev/null and b/public/images/services/convertx-logo.png differ diff --git a/public/images/services/convertx.png b/public/images/services/convertx.png new file mode 100644 index 00000000..7f4c41e2 Binary files /dev/null and b/public/images/services/convertx.png differ diff --git a/public/images/services/convex-logo.svg b/public/images/services/convex-logo.svg new file mode 100644 index 00000000..7fd02e9d --- /dev/null +++ b/public/images/services/convex-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/services/cryptgeon-logo.png b/public/images/services/cryptgeon-logo.png new file mode 100644 index 00000000..be121cfd Binary files /dev/null and b/public/images/services/cryptgeon-logo.png differ diff --git a/public/images/services/cyberchef-logo.jpeg b/public/images/services/cyberchef-logo.jpeg new file mode 100644 index 00000000..0405ac39 Binary files /dev/null and b/public/images/services/cyberchef-logo.jpeg differ diff --git a/public/images/services/dashy-logo.png b/public/images/services/dashy-logo.png new file mode 100644 index 00000000..78fabd25 Binary files /dev/null and b/public/images/services/dashy-logo.png differ diff --git a/public/images/services/databasus-logo.svg b/public/images/services/databasus-logo.svg new file mode 100644 index 00000000..f7fb1c84 --- /dev/null +++ b/public/images/services/databasus-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/services/databasus-screenshot.svg b/public/images/services/databasus-screenshot.svg new file mode 100644 index 00000000..d2bb46bf --- /dev/null +++ b/public/images/services/databasus-screenshot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/denolookingup-logo.svg b/public/images/services/denolookingup-logo.svg new file mode 100644 index 00000000..621fdefb --- /dev/null +++ b/public/images/services/denolookingup-logo.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/directus-logo.svg b/public/images/services/directus-logo.svg new file mode 100644 index 00000000..13dd0885 --- /dev/null +++ b/public/images/services/directus-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/diun-logo.svg b/public/images/services/diun-logo.svg new file mode 100644 index 00000000..6084a3cf --- /dev/null +++ b/public/images/services/diun-logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/public/images/services/diun-logo.webp b/public/images/services/diun-logo.webp new file mode 100644 index 00000000..7e2c76ab Binary files /dev/null and b/public/images/services/diun-logo.webp differ diff --git a/public/images/services/docker-registry-logo.png b/public/images/services/docker-registry-logo.png new file mode 100644 index 00000000..4fa75b2a Binary files /dev/null and b/public/images/services/docker-registry-logo.png differ diff --git a/public/images/services/docmost-logo.png b/public/images/services/docmost-logo.png new file mode 100644 index 00000000..ed049c7e Binary files /dev/null and b/public/images/services/docmost-logo.png differ diff --git a/public/images/services/documenso-logo.png b/public/images/services/documenso-logo.png new file mode 100644 index 00000000..baa63653 Binary files /dev/null and b/public/images/services/documenso-logo.png differ diff --git a/public/images/services/documenso.png b/public/images/services/documenso.png new file mode 100644 index 00000000..184354cd Binary files /dev/null and b/public/images/services/documenso.png differ diff --git a/public/images/services/docuseal-logo.png b/public/images/services/docuseal-logo.png new file mode 100644 index 00000000..3f1aed12 Binary files /dev/null and b/public/images/services/docuseal-logo.png differ diff --git a/public/images/services/docuseal.webp b/public/images/services/docuseal.webp new file mode 100644 index 00000000..090ec538 Binary files /dev/null and b/public/images/services/docuseal.webp differ diff --git a/public/images/services/dokuwiki-logo.png b/public/images/services/dokuwiki-logo.png new file mode 100644 index 00000000..a1f49956 Binary files /dev/null and b/public/images/services/dokuwiki-logo.png differ diff --git a/public/images/services/dolibarr.png b/public/images/services/dolibarr.png new file mode 100644 index 00000000..f09119af Binary files /dev/null and b/public/images/services/dolibarr.png differ diff --git a/public/images/services/dozzle-logo.svg b/public/images/services/dozzle-logo.svg new file mode 100644 index 00000000..bf88e872 --- /dev/null +++ b/public/images/services/dozzle-logo.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/services/drizzle-logo.jpeg b/public/images/services/drizzle-logo.jpeg new file mode 100644 index 00000000..d84ff854 Binary files /dev/null and b/public/images/services/drizzle-logo.jpeg differ diff --git a/public/images/services/drupal-logo.svg b/public/images/services/drupal-logo.svg new file mode 100644 index 00000000..bd77106d --- /dev/null +++ b/public/images/services/drupal-logo.svg @@ -0,0 +1 @@ +Risorsa 28 \ No newline at end of file diff --git a/public/images/services/duplicati-logo.webp b/public/images/services/duplicati-logo.webp new file mode 100644 index 00000000..5bc80377 Binary files /dev/null and b/public/images/services/duplicati-logo.webp differ diff --git a/public/images/services/easyappointments-logo.png b/public/images/services/easyappointments-logo.png new file mode 100644 index 00000000..8f00d335 Binary files /dev/null and b/public/images/services/easyappointments-logo.png differ diff --git a/public/images/services/elasticsearch-logo.svg b/public/images/services/elasticsearch-logo.svg new file mode 100644 index 00000000..bfc5bfb6 --- /dev/null +++ b/public/images/services/elasticsearch-logo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/images/services/electricsql.svg b/public/images/services/electricsql.svg new file mode 100644 index 00000000..bbffe200 --- /dev/null +++ b/public/images/services/electricsql.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/services/emby-logo.png b/public/images/services/emby-logo.png new file mode 100644 index 00000000..ca84b696 Binary files /dev/null and b/public/images/services/emby-logo.png differ diff --git a/public/images/services/ente-logo.webp b/public/images/services/ente-logo.webp new file mode 100644 index 00000000..053dfec4 Binary files /dev/null and b/public/images/services/ente-logo.webp differ diff --git a/public/images/services/esphome-logo.svg b/public/images/services/esphome-logo.svg new file mode 100644 index 00000000..623449d7 --- /dev/null +++ b/public/images/services/esphome-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/espocrm.svg b/public/images/services/espocrm.svg new file mode 100644 index 00000000..79d96f8c --- /dev/null +++ b/public/images/services/espocrm.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/evolution-api-logo.svg b/public/images/services/evolution-api-logo.svg new file mode 100644 index 00000000..a019d7b4 --- /dev/null +++ b/public/images/services/evolution-api-logo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/excalidraw-logo.svg b/public/images/services/excalidraw-logo.svg new file mode 100644 index 00000000..ee996762 --- /dev/null +++ b/public/images/services/excalidraw-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/services/faraday-logo.png b/public/images/services/faraday-logo.png new file mode 100644 index 00000000..0965efe8 Binary files /dev/null and b/public/images/services/faraday-logo.png differ diff --git a/public/images/services/fider-logo.svg b/public/images/services/fider-logo.svg new file mode 100644 index 00000000..0c7f0332 --- /dev/null +++ b/public/images/services/fider-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/filebrowser-logo.svg b/public/images/services/filebrowser-logo.svg new file mode 100644 index 00000000..5e78eccf --- /dev/null +++ b/public/images/services/filebrowser-logo.svg @@ -0,0 +1,147 @@ + +image/svg+xml + + + + + \ No newline at end of file diff --git a/public/images/services/fileflows-logo.svg b/public/images/services/fileflows-logo.svg new file mode 100644 index 00000000..ee37e9ba --- /dev/null +++ b/public/images/services/fileflows-logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/images/services/fileflows.webp b/public/images/services/fileflows.webp new file mode 100644 index 00000000..95c590fa Binary files /dev/null and b/public/images/services/fileflows.webp differ diff --git a/public/images/services/firefly-iii-logo.svg b/public/images/services/firefly-iii-logo.svg new file mode 100644 index 00000000..cd371be1 --- /dev/null +++ b/public/images/services/firefly-iii-logo.svg @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/public/images/services/firefox-logo.png b/public/images/services/firefox-logo.png new file mode 100644 index 00000000..d397bdcf Binary files /dev/null and b/public/images/services/firefox-logo.png differ diff --git a/public/images/services/fizzy-logo.png b/public/images/services/fizzy-logo.png new file mode 100644 index 00000000..44efbd78 Binary files /dev/null and b/public/images/services/fizzy-logo.png differ diff --git a/public/images/services/flipt-logo.svg b/public/images/services/flipt-logo.svg new file mode 100644 index 00000000..1156e964 --- /dev/null +++ b/public/images/services/flipt-logo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/flowise-logo.svg b/public/images/services/flowise-logo.svg new file mode 100644 index 00000000..8db9c9fa --- /dev/null +++ b/public/images/services/flowise-logo.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/public/images/services/flowise.jpg b/public/images/services/flowise.jpg new file mode 100644 index 00000000..19df2df1 Binary files /dev/null and b/public/images/services/flowise.jpg differ diff --git a/public/images/services/forgejo-logo.svg b/public/images/services/forgejo-logo.svg new file mode 100644 index 00000000..804b05e2 --- /dev/null +++ b/public/images/services/forgejo-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/formbricks-logo.png b/public/images/services/formbricks-logo.png new file mode 100644 index 00000000..3f2194c2 Binary files /dev/null and b/public/images/services/formbricks-logo.png differ diff --git a/public/images/services/formbricks-screenshot.webp b/public/images/services/formbricks-screenshot.webp new file mode 100644 index 00000000..66abc8eb Binary files /dev/null and b/public/images/services/formbricks-screenshot.webp differ diff --git a/public/images/services/foundryvtt-logo.png b/public/images/services/foundryvtt-logo.png new file mode 100644 index 00000000..c6a04508 Binary files /dev/null and b/public/images/services/foundryvtt-logo.png differ diff --git a/public/images/services/freescout-logo.png b/public/images/services/freescout-logo.png new file mode 100644 index 00000000..ff282fbc Binary files /dev/null and b/public/images/services/freescout-logo.png differ diff --git a/public/images/services/garage-logo.svg b/public/images/services/garage-logo.svg new file mode 100644 index 00000000..18aedeaa --- /dev/null +++ b/public/images/services/garage-logo.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/ghost-logo.svg b/public/images/services/ghost-logo.svg new file mode 100644 index 00000000..682b10ed --- /dev/null +++ b/public/images/services/ghost-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/services/gitea-logo.svg b/public/images/services/gitea-logo.svg new file mode 100644 index 00000000..281c748e --- /dev/null +++ b/public/images/services/gitea-logo.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/public/images/services/githubrunner-logo.png b/public/images/services/githubrunner-logo.png new file mode 100644 index 00000000..fb5b5c1b Binary files /dev/null and b/public/images/services/githubrunner-logo.png differ diff --git a/public/images/services/gitlab-logo.svg b/public/images/services/gitlab-logo.svg new file mode 100644 index 00000000..1c7cb071 --- /dev/null +++ b/public/images/services/gitlab-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/glance-logo.png b/public/images/services/glance-logo.png new file mode 100644 index 00000000..8323483b Binary files /dev/null and b/public/images/services/glance-logo.png differ diff --git a/public/images/services/glances-logo.png b/public/images/services/glances-logo.png new file mode 100644 index 00000000..31e1a09f Binary files /dev/null and b/public/images/services/glances-logo.png differ diff --git a/public/images/services/glitchtip-logo.png b/public/images/services/glitchtip-logo.png new file mode 100644 index 00000000..86631752 Binary files /dev/null and b/public/images/services/glitchtip-logo.png differ diff --git a/public/images/services/glpi-logo.svg b/public/images/services/glpi-logo.svg new file mode 100644 index 00000000..608e976c --- /dev/null +++ b/public/images/services/glpi-logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/goatcounter.svg b/public/images/services/goatcounter.svg new file mode 100644 index 00000000..9477e035 --- /dev/null +++ b/public/images/services/goatcounter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/goatcounter.webp b/public/images/services/goatcounter.webp new file mode 100644 index 00000000..510dafbe Binary files /dev/null and b/public/images/services/goatcounter.webp differ diff --git a/public/images/services/gotenberg-logo.png b/public/images/services/gotenberg-logo.png new file mode 100644 index 00000000..5db2c6f8 Binary files /dev/null and b/public/images/services/gotenberg-logo.png differ diff --git a/public/images/services/gotify-logo.svg b/public/images/services/gotify-logo.svg new file mode 100644 index 00000000..ebaa2f26 --- /dev/null +++ b/public/images/services/gotify-logo.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/gotify-ui.webp b/public/images/services/gotify-ui.webp new file mode 100644 index 00000000..4f2b662e Binary files /dev/null and b/public/images/services/gotify-ui.webp differ diff --git a/public/images/services/gowa-logo.svg b/public/images/services/gowa-logo.svg new file mode 100644 index 00000000..1121b05b --- /dev/null +++ b/public/images/services/gowa-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/grafana-logo.svg b/public/images/services/grafana-logo.svg new file mode 100644 index 00000000..03870197 --- /dev/null +++ b/public/images/services/grafana-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/gramps-web-screenshot.png b/public/images/services/gramps-web-screenshot.png new file mode 100644 index 00000000..62c0d9ce Binary files /dev/null and b/public/images/services/gramps-web-screenshot.png differ diff --git a/public/images/services/grampsweb-logo.svg b/public/images/services/grampsweb-logo.svg new file mode 100644 index 00000000..eeef3304 --- /dev/null +++ b/public/images/services/grampsweb-logo.svg @@ -0,0 +1,154 @@ + +image/svg+xml diff --git a/public/images/services/grimmory.svg b/public/images/services/grimmory.svg new file mode 100644 index 00000000..cd8230fa --- /dev/null +++ b/public/images/services/grimmory.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/services/grist-logo.svg b/public/images/services/grist-logo.svg new file mode 100644 index 00000000..82975b76 --- /dev/null +++ b/public/images/services/grist-logo.svg @@ -0,0 +1,18 @@ + + + + grist-logo-icon-transparent + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/grist-logo.webp b/public/images/services/grist-logo.webp new file mode 100644 index 00000000..738864da Binary files /dev/null and b/public/images/services/grist-logo.webp differ diff --git a/public/images/services/grocy-logo.svg b/public/images/services/grocy-logo.svg new file mode 100644 index 00000000..24bb0d25 --- /dev/null +++ b/public/images/services/grocy-logo.svg @@ -0,0 +1,21 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + + + diff --git a/public/images/services/hatchet-logo.svg b/public/images/services/hatchet-logo.svg new file mode 100644 index 00000000..7c46ae4c --- /dev/null +++ b/public/images/services/hatchet-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/services/heimdall-logo.svg b/public/images/services/heimdall-logo.svg new file mode 100644 index 00000000..6ecfa845 --- /dev/null +++ b/public/images/services/heimdall-logo.svg @@ -0,0 +1,11 @@ + + + + background + + + + Layer 1 + + + \ No newline at end of file diff --git a/public/images/services/heyform-logo.svg b/public/images/services/heyform-logo.svg new file mode 100644 index 00000000..ff29ca65 --- /dev/null +++ b/public/images/services/heyform-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/services/hoarder-logo.png b/public/images/services/hoarder-logo.png new file mode 100644 index 00000000..30ef32ac Binary files /dev/null and b/public/images/services/hoarder-logo.png differ diff --git a/public/images/services/homarr-logo.svg b/public/images/services/homarr-logo.svg new file mode 100644 index 00000000..4d428960 --- /dev/null +++ b/public/images/services/homarr-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/services/homarr.png b/public/images/services/homarr.png new file mode 100644 index 00000000..823bb50b Binary files /dev/null and b/public/images/services/homarr.png differ diff --git a/public/images/services/homeassistant-logo.svg b/public/images/services/homeassistant-logo.svg new file mode 100644 index 00000000..7bce628c --- /dev/null +++ b/public/images/services/homeassistant-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/services/homebox-logo.svg b/public/images/services/homebox-logo.svg new file mode 100644 index 00000000..08670bbb --- /dev/null +++ b/public/images/services/homebox-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/services/homepage-logo.png b/public/images/services/homepage-logo.png new file mode 100644 index 00000000..67e9d0d1 Binary files /dev/null and b/public/images/services/homepage-logo.png differ diff --git a/public/images/services/hoppscotch-logo.png b/public/images/services/hoppscotch-logo.png new file mode 100644 index 00000000..84c72843 Binary files /dev/null and b/public/images/services/hoppscotch-logo.png differ diff --git a/public/images/services/imgcompress-logo.webp b/public/images/services/imgcompress-logo.webp new file mode 100644 index 00000000..fb781f6d Binary files /dev/null and b/public/images/services/imgcompress-logo.webp differ diff --git a/public/images/services/imgcompress-ui.webp b/public/images/services/imgcompress-ui.webp new file mode 100644 index 00000000..85669025 Binary files /dev/null and b/public/images/services/imgcompress-ui.webp differ diff --git a/public/images/services/immich-logo.svg b/public/images/services/immich-logo.svg new file mode 100644 index 00000000..9d844a77 --- /dev/null +++ b/public/images/services/immich-logo.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/immich.webp b/public/images/services/immich.webp new file mode 100644 index 00000000..3d088f65 Binary files /dev/null and b/public/images/services/immich.webp differ diff --git a/public/images/services/infisical-logo.svg b/public/images/services/infisical-logo.svg new file mode 100644 index 00000000..1bd27a18 --- /dev/null +++ b/public/images/services/infisical-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/services/infisical.webp b/public/images/services/infisical.webp new file mode 100644 index 00000000..01175185 Binary files /dev/null and b/public/images/services/infisical.webp differ diff --git a/public/images/services/invoiceninja-logo.png b/public/images/services/invoiceninja-logo.png new file mode 100644 index 00000000..5141cd4d Binary files /dev/null and b/public/images/services/invoiceninja-logo.png differ diff --git a/public/images/services/ittools-logo.svg b/public/images/services/ittools-logo.svg new file mode 100644 index 00000000..3de5ecff --- /dev/null +++ b/public/images/services/ittools-logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/services/jellyfin-logo.svg b/public/images/services/jellyfin-logo.svg new file mode 100644 index 00000000..fbf03077 --- /dev/null +++ b/public/images/services/jellyfin-logo.svg @@ -0,0 +1,15 @@ + diff --git a/public/images/services/jenkins-logo.svg b/public/images/services/jenkins-logo.svg new file mode 100644 index 00000000..0529fff1 --- /dev/null +++ b/public/images/services/jenkins-logo.svg @@ -0,0 +1,283 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/public/images/services/joplin-logo.png b/public/images/services/joplin-logo.png new file mode 100644 index 00000000..d17a1d2c Binary files /dev/null and b/public/images/services/joplin-logo.png differ diff --git a/public/images/services/jupyternotebook-logo.svg b/public/images/services/jupyternotebook-logo.svg new file mode 100644 index 00000000..a13ac1fe --- /dev/null +++ b/public/images/services/jupyternotebook-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/karakeep-logo.svg b/public/images/services/karakeep-logo.svg new file mode 100644 index 00000000..6215461d --- /dev/null +++ b/public/images/services/karakeep-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/keycloak-logo.svg b/public/images/services/keycloak-logo.svg new file mode 100644 index 00000000..e3d5bdf2 --- /dev/null +++ b/public/images/services/keycloak-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/kimai-logo.svg b/public/images/services/kimai-logo.svg new file mode 100644 index 00000000..35b14697 --- /dev/null +++ b/public/images/services/kimai-logo.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/kuzzle-logo.png b/public/images/services/kuzzle-logo.png new file mode 100644 index 00000000..a7bf3702 Binary files /dev/null and b/public/images/services/kuzzle-logo.png differ diff --git a/public/images/services/labelstudio-logo.png b/public/images/services/labelstudio-logo.png new file mode 100644 index 00000000..afa5160b Binary files /dev/null and b/public/images/services/labelstudio-logo.png differ diff --git a/public/images/services/labelstudio1.webp b/public/images/services/labelstudio1.webp new file mode 100644 index 00000000..e67a03a5 Binary files /dev/null and b/public/images/services/labelstudio1.webp differ diff --git a/public/images/services/labelstudio2.webp b/public/images/services/labelstudio2.webp new file mode 100644 index 00000000..e9e0ef13 Binary files /dev/null and b/public/images/services/labelstudio2.webp differ diff --git a/public/images/services/labelstudio3.webp b/public/images/services/labelstudio3.webp new file mode 100644 index 00000000..b848a93a Binary files /dev/null and b/public/images/services/labelstudio3.webp differ diff --git a/public/images/services/langflow.svg b/public/images/services/langflow.svg new file mode 100644 index 00000000..08bd5557 --- /dev/null +++ b/public/images/services/langflow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/services/langfuse-logo.svg b/public/images/services/langfuse-logo.svg new file mode 100644 index 00000000..b04e0749 --- /dev/null +++ b/public/images/services/langfuse-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/services/langfuse.webp b/public/images/services/langfuse.webp new file mode 100644 index 00000000..5bc96374 Binary files /dev/null and b/public/images/services/langfuse.webp differ diff --git a/public/images/services/leantime-logo.svg b/public/images/services/leantime-logo.svg new file mode 100644 index 00000000..dac70d77 --- /dev/null +++ b/public/images/services/leantime-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/leantime-logo.webp b/public/images/services/leantime-logo.webp new file mode 100644 index 00000000..b9ba2c9c Binary files /dev/null and b/public/images/services/leantime-logo.webp differ diff --git a/public/images/services/leantime-screenshots.webp b/public/images/services/leantime-screenshots.webp new file mode 100644 index 00000000..f4337743 Binary files /dev/null and b/public/images/services/leantime-screenshots.webp differ diff --git a/public/images/services/librechat-logo.svg b/public/images/services/librechat-logo.svg new file mode 100644 index 00000000..36a536d6 --- /dev/null +++ b/public/images/services/librechat-logo.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/libreoffice-logo.svg b/public/images/services/libreoffice-logo.svg new file mode 100644 index 00000000..227471be --- /dev/null +++ b/public/images/services/libreoffice-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/librespeed.png b/public/images/services/librespeed.png new file mode 100644 index 00000000..1405e3c1 Binary files /dev/null and b/public/images/services/librespeed.png differ diff --git a/public/images/services/libretranslate-logo.svg b/public/images/services/libretranslate-logo.svg new file mode 100644 index 00000000..103d47d6 --- /dev/null +++ b/public/images/services/libretranslate-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/limesurvey-logo.svg b/public/images/services/limesurvey-logo.svg new file mode 100644 index 00000000..7f84f0f9 --- /dev/null +++ b/public/images/services/limesurvey-logo.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/limesurvey.webp b/public/images/services/limesurvey.webp new file mode 100644 index 00000000..41cf3182 Binary files /dev/null and b/public/images/services/limesurvey.webp differ diff --git a/public/images/services/linkding-logo.svg b/public/images/services/linkding-logo.svg new file mode 100644 index 00000000..e3a79db4 --- /dev/null +++ b/public/images/services/linkding-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/listmonk-logo.svg b/public/images/services/listmonk-logo.svg new file mode 100644 index 00000000..a4e5efd5 --- /dev/null +++ b/public/images/services/listmonk-logo.svg @@ -0,0 +1,2 @@ + + diff --git a/public/images/services/litellm-logo.svg b/public/images/services/litellm-logo.svg new file mode 100644 index 00000000..01830c3f --- /dev/null +++ b/public/images/services/litellm-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/litellm1.avif b/public/images/services/litellm1.avif new file mode 100644 index 00000000..825be614 Binary files /dev/null and b/public/images/services/litellm1.avif differ diff --git a/public/images/services/litellm2.avif b/public/images/services/litellm2.avif new file mode 100644 index 00000000..4a7de211 Binary files /dev/null and b/public/images/services/litellm2.avif differ diff --git a/public/images/services/litellm3.avif b/public/images/services/litellm3.avif new file mode 100644 index 00000000..df1f24e7 Binary files /dev/null and b/public/images/services/litellm3.avif differ diff --git a/public/images/services/litellm4.avif b/public/images/services/litellm4.avif new file mode 100644 index 00000000..61acd2a3 Binary files /dev/null and b/public/images/services/litellm4.avif differ diff --git a/public/images/services/litequeen-logo.svg b/public/images/services/litequeen-logo.svg new file mode 100644 index 00000000..aa0b8e03 --- /dev/null +++ b/public/images/services/litequeen-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/lobe-chat.screenshot.webp b/public/images/services/lobe-chat.screenshot.webp new file mode 100644 index 00000000..e80d11a6 Binary files /dev/null and b/public/images/services/lobe-chat.screenshot.webp differ diff --git a/public/images/services/lobechat-logo.webp b/public/images/services/lobechat-logo.webp new file mode 100644 index 00000000..42b1930f Binary files /dev/null and b/public/images/services/lobechat-logo.webp differ diff --git a/public/images/services/lowcoder-logo.svg b/public/images/services/lowcoder-logo.svg new file mode 100644 index 00000000..0dfeb16f --- /dev/null +++ b/public/images/services/lowcoder-logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/mage-ai.svg b/public/images/services/mage-ai.svg new file mode 100644 index 00000000..11e445b4 --- /dev/null +++ b/public/images/services/mage-ai.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/mailpit-logo.svg b/public/images/services/mailpit-logo.svg new file mode 100644 index 00000000..e569e71c --- /dev/null +++ b/public/images/services/mailpit-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/services/marimo-logo.png b/public/images/services/marimo-logo.png new file mode 100644 index 00000000..caafea81 Binary files /dev/null and b/public/images/services/marimo-logo.png differ diff --git a/public/images/services/marimo-logo.svg b/public/images/services/marimo-logo.svg new file mode 100644 index 00000000..30a70b48 --- /dev/null +++ b/public/images/services/marimo-logo.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/martin.png b/public/images/services/martin.png new file mode 100644 index 00000000..d1a99e14 Binary files /dev/null and b/public/images/services/martin.png differ diff --git a/public/images/services/matrix-logo.svg b/public/images/services/matrix-logo.svg new file mode 100644 index 00000000..bc41720a --- /dev/null +++ b/public/images/services/matrix-logo.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/public/images/services/mattermost-logo.svg b/public/images/services/mattermost-logo.svg new file mode 100644 index 00000000..b01d38eb --- /dev/null +++ b/public/images/services/mattermost-logo.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/images/services/mautic-logo.svg b/public/images/services/mautic-logo.svg new file mode 100644 index 00000000..b528f72e --- /dev/null +++ b/public/images/services/mautic-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/public/images/services/maybe-logo.svg b/public/images/services/maybe-logo.svg new file mode 100644 index 00000000..9a8aa75c --- /dev/null +++ b/public/images/services/maybe-logo.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/mealie-logo.png b/public/images/services/mealie-logo.png new file mode 100644 index 00000000..74a2d7b6 Binary files /dev/null and b/public/images/services/mealie-logo.png differ diff --git a/public/images/services/meilisearch-logo.svg b/public/images/services/meilisearch-logo.svg new file mode 100644 index 00000000..85c35a45 --- /dev/null +++ b/public/images/services/meilisearch-logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/memos-logo.png b/public/images/services/memos-logo.png new file mode 100644 index 00000000..e510a33e Binary files /dev/null and b/public/images/services/memos-logo.png differ diff --git a/public/images/services/memos-screenshots.webp b/public/images/services/memos-screenshots.webp new file mode 100644 index 00000000..b944f46b Binary files /dev/null and b/public/images/services/memos-screenshots.webp differ diff --git a/public/images/services/memos.webp b/public/images/services/memos.webp new file mode 100644 index 00000000..31262970 Binary files /dev/null and b/public/images/services/memos.webp differ diff --git a/public/images/services/metabase-logo.svg b/public/images/services/metabase-logo.svg new file mode 100644 index 00000000..255d169d --- /dev/null +++ b/public/images/services/metabase-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/metamcp.png b/public/images/services/metamcp.png new file mode 100644 index 00000000..e1eeb5c0 Binary files /dev/null and b/public/images/services/metamcp.png differ diff --git a/public/images/services/metamcp_screenshot.png b/public/images/services/metamcp_screenshot.png new file mode 100644 index 00000000..670e06b6 Binary files /dev/null and b/public/images/services/metamcp_screenshot.png differ diff --git a/public/images/services/mindsdb.svg b/public/images/services/mindsdb.svg new file mode 100644 index 00000000..53799dd1 --- /dev/null +++ b/public/images/services/mindsdb.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/services/minecraft-logo.svg b/public/images/services/minecraft-logo.svg new file mode 100644 index 00000000..10ae9042 --- /dev/null +++ b/public/images/services/minecraft-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/miniflux.svg b/public/images/services/miniflux.svg new file mode 100644 index 00000000..33ae73a8 --- /dev/null +++ b/public/images/services/miniflux.svg @@ -0,0 +1 @@ +icon \ No newline at end of file diff --git a/public/images/services/minio-logo.svg b/public/images/services/minio-logo.svg new file mode 100644 index 00000000..0496de20 --- /dev/null +++ b/public/images/services/minio-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/mixpost-logo.svg b/public/images/services/mixpost-logo.svg new file mode 100644 index 00000000..bd915e77 --- /dev/null +++ b/public/images/services/mixpost-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/images/services/moodle-logo.png b/public/images/services/moodle-logo.png new file mode 100644 index 00000000..340f425b Binary files /dev/null and b/public/images/services/moodle-logo.png differ diff --git a/public/images/services/mosquitto-logo.svg b/public/images/services/mosquitto-logo.svg new file mode 100644 index 00000000..7e7dde5b --- /dev/null +++ b/public/images/services/mosquitto-logo.svg @@ -0,0 +1 @@ + image/svg+xml \ No newline at end of file diff --git a/public/images/services/n8n-logo.png b/public/images/services/n8n-logo.png new file mode 100644 index 00000000..6ef98587 Binary files /dev/null and b/public/images/services/n8n-logo.png differ diff --git a/public/images/services/navidrome-logo.svg b/public/images/services/navidrome-logo.svg new file mode 100644 index 00000000..cae50d73 --- /dev/null +++ b/public/images/services/navidrome-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/navidrome-screenshots.webp b/public/images/services/navidrome-screenshots.webp new file mode 100644 index 00000000..915af266 Binary files /dev/null and b/public/images/services/navidrome-screenshots.webp differ diff --git a/public/images/services/navidrome.webp b/public/images/services/navidrome.webp new file mode 100644 index 00000000..0ff2df13 Binary files /dev/null and b/public/images/services/navidrome.webp differ diff --git a/public/images/services/neon-logo.svg b/public/images/services/neon-logo.svg new file mode 100644 index 00000000..ffe172aa --- /dev/null +++ b/public/images/services/neon-logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/netbird-client.webp b/public/images/services/netbird-client.webp new file mode 100644 index 00000000..62506acb Binary files /dev/null and b/public/images/services/netbird-client.webp differ diff --git a/public/images/services/netbird-logo.png b/public/images/services/netbird-logo.png new file mode 100644 index 00000000..1b2405c0 Binary files /dev/null and b/public/images/services/netbird-logo.png differ diff --git a/public/images/services/newapi-logo.png b/public/images/services/newapi-logo.png new file mode 100644 index 00000000..15db2269 Binary files /dev/null and b/public/images/services/newapi-logo.png differ diff --git a/public/images/services/nextcloud-logo.svg b/public/images/services/nextcloud-logo.svg new file mode 100644 index 00000000..c9938c99 --- /dev/null +++ b/public/images/services/nextcloud-logo.svg @@ -0,0 +1,73 @@ + + + +image/svg+xml + + + + + + \ No newline at end of file diff --git a/public/images/services/nexus-arm-logo.png b/public/images/services/nexus-arm-logo.png new file mode 100644 index 00000000..823ea4e8 Binary files /dev/null and b/public/images/services/nexus-arm-logo.png differ diff --git a/public/images/services/nexus-logo.png b/public/images/services/nexus-logo.png new file mode 100644 index 00000000..823ea4e8 Binary files /dev/null and b/public/images/services/nexus-logo.png differ diff --git a/public/images/services/nexus0.webp b/public/images/services/nexus0.webp new file mode 100644 index 00000000..72cac6a6 Binary files /dev/null and b/public/images/services/nexus0.webp differ diff --git a/public/images/services/nexus1.webp b/public/images/services/nexus1.webp new file mode 100644 index 00000000..b14cf416 Binary files /dev/null and b/public/images/services/nexus1.webp differ diff --git a/public/images/services/nexus2.webp b/public/images/services/nexus2.webp new file mode 100644 index 00000000..593d8e50 Binary files /dev/null and b/public/images/services/nexus2.webp differ diff --git a/public/images/services/nitropage-logo.svg b/public/images/services/nitropage-logo.svg new file mode 100644 index 00000000..bedc12ed --- /dev/null +++ b/public/images/services/nitropage-logo.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/nocobase.png b/public/images/services/nocobase.png new file mode 100644 index 00000000..5278e4ac Binary files /dev/null and b/public/images/services/nocobase.png differ diff --git a/public/images/services/nocodb-logo.svg b/public/images/services/nocodb-logo.svg new file mode 100644 index 00000000..d4c96f9b --- /dev/null +++ b/public/images/services/nocodb-logo.svg @@ -0,0 +1,10 @@ + + + NocoDB + + + + + + + \ No newline at end of file diff --git a/public/images/services/nocodb1.webp b/public/images/services/nocodb1.webp new file mode 100644 index 00000000..5f07f158 Binary files /dev/null and b/public/images/services/nocodb1.webp differ diff --git a/public/images/services/nocodb2.webp b/public/images/services/nocodb2.webp new file mode 100644 index 00000000..d15d5e76 Binary files /dev/null and b/public/images/services/nocodb2.webp differ diff --git a/public/images/services/nocodb3.webp b/public/images/services/nocodb3.webp new file mode 100644 index 00000000..eb462e15 Binary files /dev/null and b/public/images/services/nocodb3.webp differ diff --git a/public/images/services/nocodb4.webp b/public/images/services/nocodb4.webp new file mode 100644 index 00000000..9f467880 Binary files /dev/null and b/public/images/services/nocodb4.webp differ diff --git a/public/images/services/nocodb5.webp b/public/images/services/nocodb5.webp new file mode 100644 index 00000000..5d1341d3 Binary files /dev/null and b/public/images/services/nocodb5.webp differ diff --git a/public/images/services/nodebb-logo.svg b/public/images/services/nodebb-logo.svg new file mode 100644 index 00000000..cc1c56f8 --- /dev/null +++ b/public/images/services/nodebb-logo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/images/services/ntfy-logo.svg b/public/images/services/ntfy-logo.svg new file mode 100644 index 00000000..9e5b5136 --- /dev/null +++ b/public/images/services/ntfy-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/observium-logo.webp b/public/images/services/observium-logo.webp new file mode 100644 index 00000000..6935da5f Binary files /dev/null and b/public/images/services/observium-logo.webp differ diff --git a/public/images/services/observium-screenshots.webp b/public/images/services/observium-screenshots.webp new file mode 100644 index 00000000..862ae303 Binary files /dev/null and b/public/images/services/observium-screenshots.webp differ diff --git a/public/images/services/observium.webp b/public/images/services/observium.webp new file mode 100644 index 00000000..ff48b319 Binary files /dev/null and b/public/images/services/observium.webp differ diff --git a/public/images/services/odoo-logo.svg b/public/images/services/odoo-logo.svg new file mode 100644 index 00000000..073cf91e --- /dev/null +++ b/public/images/services/odoo-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/ollama-logo.svg b/public/images/services/ollama-logo.svg new file mode 100644 index 00000000..3df9a9fb --- /dev/null +++ b/public/images/services/ollama-logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/services/ollama.gif b/public/images/services/ollama.gif new file mode 100644 index 00000000..6e56b74a Binary files /dev/null and b/public/images/services/ollama.gif differ diff --git a/public/images/services/ollama.webp b/public/images/services/ollama.webp new file mode 100644 index 00000000..3ce8e041 Binary files /dev/null and b/public/images/services/ollama.webp differ diff --git a/public/images/services/oncecampfire-logo.png b/public/images/services/oncecampfire-logo.png new file mode 100644 index 00000000..d1158445 Binary files /dev/null and b/public/images/services/oncecampfire-logo.png differ diff --git a/public/images/services/onedev-logo.svg b/public/images/services/onedev-logo.svg new file mode 100644 index 00000000..fb9c9c06 --- /dev/null +++ b/public/images/services/onedev-logo.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/onetime-secret-logo.webp b/public/images/services/onetime-secret-logo.webp new file mode 100644 index 00000000..8f25b1b1 Binary files /dev/null and b/public/images/services/onetime-secret-logo.webp differ diff --git a/public/images/services/onetimesecret.svg b/public/images/services/onetimesecret.svg new file mode 100644 index 00000000..eff9738d --- /dev/null +++ b/public/images/services/onetimesecret.svg @@ -0,0 +1,6 @@ + + +Onetime Secret + + + diff --git a/public/images/services/openarchiver-logo.svg b/public/images/services/openarchiver-logo.svg new file mode 100644 index 00000000..94c43f51 --- /dev/null +++ b/public/images/services/openarchiver-logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/openblocks-logo.svg b/public/images/services/openblocks-logo.svg new file mode 100644 index 00000000..0dfeb16f --- /dev/null +++ b/public/images/services/openblocks-logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/openclaw-logo.svg b/public/images/services/openclaw-logo.svg new file mode 100644 index 00000000..7bfb7fc4 --- /dev/null +++ b/public/images/services/openclaw-logo.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/openpanel-logo.svg b/public/images/services/openpanel-logo.svg new file mode 100644 index 00000000..8508fc69 --- /dev/null +++ b/public/images/services/openpanel-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/openwebui-dashboard.png b/public/images/services/openwebui-dashboard.png new file mode 100644 index 00000000..a38ddaf6 Binary files /dev/null and b/public/images/services/openwebui-dashboard.png differ diff --git a/public/images/services/openwebui-logo.svg b/public/images/services/openwebui-logo.svg new file mode 100644 index 00000000..af01b222 --- /dev/null +++ b/public/images/services/openwebui-logo.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/public/images/services/opnform.svg b/public/images/services/opnform.svg new file mode 100644 index 00000000..70562a4b --- /dev/null +++ b/public/images/services/opnform.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/orangehrm-logo.svg b/public/images/services/orangehrm-logo.svg new file mode 100644 index 00000000..b976d57e --- /dev/null +++ b/public/images/services/orangehrm-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/orangehrm-logo.webp b/public/images/services/orangehrm-logo.webp new file mode 100644 index 00000000..2621785d Binary files /dev/null and b/public/images/services/orangehrm-logo.webp differ diff --git a/public/images/services/organizr-logo.png b/public/images/services/organizr-logo.png new file mode 100644 index 00000000..92541ea7 Binary files /dev/null and b/public/images/services/organizr-logo.png differ diff --git a/public/images/services/osticket-logo.png b/public/images/services/osticket-logo.png new file mode 100644 index 00000000..65885b71 Binary files /dev/null and b/public/images/services/osticket-logo.png differ diff --git a/public/images/services/outline.webp b/public/images/services/outline.webp new file mode 100644 index 00000000..f9f0184a Binary files /dev/null and b/public/images/services/outline.webp differ diff --git a/public/images/services/overseerr-logo.svg b/public/images/services/overseerr-logo.svg new file mode 100644 index 00000000..8116787c --- /dev/null +++ b/public/images/services/overseerr-logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/services/overseerr.webp b/public/images/services/overseerr.webp new file mode 100644 index 00000000..55a0c9f7 Binary files /dev/null and b/public/images/services/overseerr.webp differ diff --git a/public/images/services/owncloud-logo.svg b/public/images/services/owncloud-logo.svg new file mode 100644 index 00000000..83631e3f --- /dev/null +++ b/public/images/services/owncloud-logo.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/pairdrop-logo.png b/public/images/services/pairdrop-logo.png new file mode 100644 index 00000000..b0e9ee5d Binary files /dev/null and b/public/images/services/pairdrop-logo.png differ diff --git a/public/images/services/pangolin_newt.svg b/public/images/services/pangolin_newt.svg new file mode 100644 index 00000000..5e81a57f --- /dev/null +++ b/public/images/services/pangolin_newt.svg @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/public/images/services/paperless-logo.png b/public/images/services/paperless-logo.png new file mode 100644 index 00000000..d32a9a99 Binary files /dev/null and b/public/images/services/paperless-logo.png differ diff --git a/public/images/services/passbolt-logo.svg b/public/images/services/passbolt-logo.svg new file mode 100644 index 00000000..b071b475 --- /dev/null +++ b/public/images/services/passbolt-logo.svg @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/public/images/services/passbolt-screenshot.webp b/public/images/services/passbolt-screenshot.webp new file mode 100644 index 00000000..7c6cdec6 Binary files /dev/null and b/public/images/services/passbolt-screenshot.webp differ diff --git a/public/images/services/passbolt.webp b/public/images/services/passbolt.webp new file mode 100644 index 00000000..50cecfb4 Binary files /dev/null and b/public/images/services/passbolt.webp differ diff --git a/public/images/services/paymenter-logo.svg b/public/images/services/paymenter-logo.svg new file mode 100644 index 00000000..e1203bb3 --- /dev/null +++ b/public/images/services/paymenter-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/penpot-logo.svg b/public/images/services/penpot-logo.svg new file mode 100644 index 00000000..6439292b --- /dev/null +++ b/public/images/services/penpot-logo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/images/services/pgadmin-logo.svg b/public/images/services/pgadmin-logo.svg new file mode 100644 index 00000000..1ff22385 --- /dev/null +++ b/public/images/services/pgadmin-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/pgbackweb-logo.png b/public/images/services/pgbackweb-logo.png new file mode 100644 index 00000000..6c76c807 Binary files /dev/null and b/public/images/services/pgbackweb-logo.png differ diff --git a/public/images/services/pgbackweb-screenshots.webp b/public/images/services/pgbackweb-screenshots.webp new file mode 100644 index 00000000..72ebeacd Binary files /dev/null and b/public/images/services/pgbackweb-screenshots.webp differ diff --git a/public/images/services/pgbackweb.webp b/public/images/services/pgbackweb.webp new file mode 100644 index 00000000..ee5f1391 Binary files /dev/null and b/public/images/services/pgbackweb.webp differ diff --git a/public/images/services/phpmyadmin-logo.svg b/public/images/services/phpmyadmin-logo.svg new file mode 100644 index 00000000..1e32d14f --- /dev/null +++ b/public/images/services/phpmyadmin-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/pihole-logo.svg b/public/images/services/pihole-logo.svg new file mode 100644 index 00000000..a4efefcc --- /dev/null +++ b/public/images/services/pihole-logo.svg @@ -0,0 +1 @@ +NewVortex \ No newline at end of file diff --git a/public/images/services/pingvinshare-logo.svg b/public/images/services/pingvinshare-logo.svg new file mode 100644 index 00000000..4f1f7a7b --- /dev/null +++ b/public/images/services/pingvinshare-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/plane-logo.svg b/public/images/services/plane-logo.svg new file mode 100644 index 00000000..899e1a86 --- /dev/null +++ b/public/images/services/plane-logo.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/images/services/plausible-logo.svg b/public/images/services/plausible-logo.svg new file mode 100644 index 00000000..0effe278 --- /dev/null +++ b/public/images/services/plausible-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/plex-logo.svg b/public/images/services/plex-logo.svg new file mode 100644 index 00000000..0646bb60 --- /dev/null +++ b/public/images/services/plex-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/plex.webp b/public/images/services/plex.webp new file mode 100644 index 00000000..61daa90c Binary files /dev/null and b/public/images/services/plex.webp differ diff --git a/public/images/services/plunk-logo.svg b/public/images/services/plunk-logo.svg new file mode 100644 index 00000000..3f6ed479 --- /dev/null +++ b/public/images/services/plunk-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/pocket-id_screenshot.webp b/public/images/services/pocket-id_screenshot.webp new file mode 100644 index 00000000..d7916eba Binary files /dev/null and b/public/images/services/pocket-id_screenshot.webp differ diff --git a/public/images/services/pocketbase-logo.svg b/public/images/services/pocketbase-logo.svg new file mode 100644 index 00000000..5b5de956 --- /dev/null +++ b/public/images/services/pocketbase-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/services/pocketid-logo.webp b/public/images/services/pocketid-logo.webp new file mode 100644 index 00000000..89e5ed8d Binary files /dev/null and b/public/images/services/pocketid-logo.webp differ diff --git a/public/images/services/portainer-logo.png b/public/images/services/portainer-logo.png new file mode 100644 index 00000000..2a4010f1 Binary files /dev/null and b/public/images/services/portainer-logo.png differ diff --git a/public/images/services/posthog-logo.svg b/public/images/services/posthog-logo.svg new file mode 100644 index 00000000..c7eb64fd --- /dev/null +++ b/public/images/services/posthog-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/services/postiz-logo.png b/public/images/services/postiz-logo.png new file mode 100644 index 00000000..1d787f8c Binary files /dev/null and b/public/images/services/postiz-logo.png differ diff --git a/public/images/services/prefect-logo.png b/public/images/services/prefect-logo.png new file mode 100644 index 00000000..2f87ec0d Binary files /dev/null and b/public/images/services/prefect-logo.png differ diff --git a/public/images/services/prefect.avif b/public/images/services/prefect.avif new file mode 100644 index 00000000..4cd25014 Binary files /dev/null and b/public/images/services/prefect.avif differ diff --git a/public/images/services/prefect.webp b/public/images/services/prefect.webp new file mode 100644 index 00000000..d19ea1e9 Binary files /dev/null and b/public/images/services/prefect.webp differ diff --git a/public/images/services/privatebin-logo.svg b/public/images/services/privatebin-logo.svg new file mode 100644 index 00000000..d63c65db --- /dev/null +++ b/public/images/services/privatebin-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/prowlarr-logo.svg b/public/images/services/prowlarr-logo.svg new file mode 100644 index 00000000..a1a5a8ce --- /dev/null +++ b/public/images/services/prowlarr-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/prowlarr.webp b/public/images/services/prowlarr.webp new file mode 100644 index 00000000..7d8ee45a Binary files /dev/null and b/public/images/services/prowlarr.webp differ diff --git a/public/images/services/proxyscotch.png b/public/images/services/proxyscotch.png new file mode 100644 index 00000000..84c72843 Binary files /dev/null and b/public/images/services/proxyscotch.png differ diff --git a/public/images/services/pterodactly-with-wings1.png b/public/images/services/pterodactly-with-wings1.png new file mode 100644 index 00000000..9f00a39a Binary files /dev/null and b/public/images/services/pterodactly-with-wings1.png differ diff --git a/public/images/services/pterodactly-with-wings2.png b/public/images/services/pterodactly-with-wings2.png new file mode 100644 index 00000000..aa6194e4 Binary files /dev/null and b/public/images/services/pterodactly-with-wings2.png differ diff --git a/public/images/services/pterodactyl-logo.png b/public/images/services/pterodactyl-logo.png new file mode 100644 index 00000000..a5addb87 Binary files /dev/null and b/public/images/services/pterodactyl-logo.png differ diff --git a/public/images/services/pterodactyl-screenshot-1.webp b/public/images/services/pterodactyl-screenshot-1.webp new file mode 100644 index 00000000..78d6bc70 Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-1.webp differ diff --git a/public/images/services/pterodactyl-screenshot-2.webp b/public/images/services/pterodactyl-screenshot-2.webp new file mode 100644 index 00000000..8c010a15 Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-2.webp differ diff --git a/public/images/services/pterodactyl-screenshot-3.webp b/public/images/services/pterodactyl-screenshot-3.webp new file mode 100644 index 00000000..5560e8b1 Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-3.webp differ diff --git a/public/images/services/pterodactyl-screenshot-4.webp b/public/images/services/pterodactyl-screenshot-4.webp new file mode 100644 index 00000000..8ee90b04 Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-4.webp differ diff --git a/public/images/services/pterodactyl-screenshot-5.webp b/public/images/services/pterodactyl-screenshot-5.webp new file mode 100644 index 00000000..eba7c507 Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-5.webp differ diff --git a/public/images/services/pterodactyl-screenshot-6.webp b/public/images/services/pterodactyl-screenshot-6.webp new file mode 100644 index 00000000..6cac7c1a Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-6.webp differ diff --git a/public/images/services/pterodactyl-screenshot-7.webp b/public/images/services/pterodactyl-screenshot-7.webp new file mode 100644 index 00000000..3fb27dea Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-7.webp differ diff --git a/public/images/services/pterodactyl-screenshot-8.webp b/public/images/services/pterodactyl-screenshot-8.webp new file mode 100644 index 00000000..f11387d7 Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-8.webp differ diff --git a/public/images/services/pterodactyl-screenshot-9.webp b/public/images/services/pterodactyl-screenshot-9.webp new file mode 100644 index 00000000..8df43ccc Binary files /dev/null and b/public/images/services/pterodactyl-screenshot-9.webp differ diff --git a/public/images/services/pydio-screenshot-1.webp b/public/images/services/pydio-screenshot-1.webp new file mode 100644 index 00000000..7eb7289e Binary files /dev/null and b/public/images/services/pydio-screenshot-1.webp differ diff --git a/public/images/services/pydio-screenshot-2.webp b/public/images/services/pydio-screenshot-2.webp new file mode 100644 index 00000000..887b796f Binary files /dev/null and b/public/images/services/pydio-screenshot-2.webp differ diff --git a/public/images/services/pydio.webp b/public/images/services/pydio.webp new file mode 100644 index 00000000..8d9b3592 Binary files /dev/null and b/public/images/services/pydio.webp differ diff --git a/public/images/services/qbittorrent-logo.svg b/public/images/services/qbittorrent-logo.svg new file mode 100644 index 00000000..69d8cf62 --- /dev/null +++ b/public/images/services/qbittorrent-logo.svg @@ -0,0 +1,16 @@ + + + qbittorrent-new-light + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/qdrant-logo.svg b/public/images/services/qdrant-logo.svg new file mode 100644 index 00000000..443704b9 --- /dev/null +++ b/public/images/services/qdrant-logo.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/rabbitmq-logo.svg b/public/images/services/rabbitmq-logo.svg new file mode 100644 index 00000000..7a94d71b --- /dev/null +++ b/public/images/services/rabbitmq-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/radarr-logo.svg b/public/images/services/radarr-logo.svg new file mode 100644 index 00000000..93a4c923 --- /dev/null +++ b/public/images/services/radarr-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/radarr.webp b/public/images/services/radarr.webp new file mode 100644 index 00000000..515ff3e3 Binary files /dev/null and b/public/images/services/radarr.webp differ diff --git a/public/images/services/rallly-logo.svg b/public/images/services/rallly-logo.svg new file mode 100644 index 00000000..58a8ef60 --- /dev/null +++ b/public/images/services/rallly-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/readeck-logo.svg b/public/images/services/readeck-logo.svg new file mode 100644 index 00000000..07f6e615 --- /dev/null +++ b/public/images/services/readeck-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/services/redisinsight-guide1.webp b/public/images/services/redisinsight-guide1.webp new file mode 100644 index 00000000..4113fb02 Binary files /dev/null and b/public/images/services/redisinsight-guide1.webp differ diff --git a/public/images/services/redisinsight-guide2.webp b/public/images/services/redisinsight-guide2.webp new file mode 100644 index 00000000..41541c61 Binary files /dev/null and b/public/images/services/redisinsight-guide2.webp differ diff --git a/public/images/services/redisinsight-logo.png b/public/images/services/redisinsight-logo.png new file mode 100644 index 00000000..bc805627 Binary files /dev/null and b/public/images/services/redisinsight-logo.png differ diff --git a/public/images/services/redlib-logo.svg b/public/images/services/redlib-logo.svg new file mode 100644 index 00000000..16f73b5d --- /dev/null +++ b/public/images/services/redlib-logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/images/services/redmine-logo.svg b/public/images/services/redmine-logo.svg new file mode 100644 index 00000000..5c7bd0f2 --- /dev/null +++ b/public/images/services/redmine-logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/rivet-logo.svg b/public/images/services/rivet-logo.svg new file mode 100644 index 00000000..3494cd19 --- /dev/null +++ b/public/images/services/rivet-logo.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/rocketchat-logo.svg b/public/images/services/rocketchat-logo.svg new file mode 100644 index 00000000..01fde7a6 --- /dev/null +++ b/public/images/services/rocketchat-logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/services/rxresume-logo.svg b/public/images/services/rxresume-logo.svg new file mode 100644 index 00000000..6a7ffcae --- /dev/null +++ b/public/images/services/rxresume-logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/rybbit-app.webp b/public/images/services/rybbit-app.webp new file mode 100644 index 00000000..74fc8455 Binary files /dev/null and b/public/images/services/rybbit-app.webp differ diff --git a/public/images/services/rybbit.svg b/public/images/services/rybbit.svg new file mode 100644 index 00000000..05dc3381 --- /dev/null +++ b/public/images/services/rybbit.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/images/services/ryot-logo.svg b/public/images/services/ryot-logo.svg new file mode 100644 index 00000000..410f2217 --- /dev/null +++ b/public/images/services/ryot-logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/images/services/ryot.webp b/public/images/services/ryot.webp new file mode 100644 index 00000000..27ece543 Binary files /dev/null and b/public/images/services/ryot.webp differ diff --git a/public/images/services/seafile-logo.svg b/public/images/services/seafile-logo.svg new file mode 100644 index 00000000..e1c51659 --- /dev/null +++ b/public/images/services/seafile-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/seafile.webp b/public/images/services/seafile.webp new file mode 100644 index 00000000..8e554fce Binary files /dev/null and b/public/images/services/seafile.webp differ diff --git a/public/images/services/searxng-logo.svg b/public/images/services/searxng-logo.svg new file mode 100644 index 00000000..5b55fa27 --- /dev/null +++ b/public/images/services/searxng-logo.svg @@ -0,0 +1,96 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/public/images/services/seaweedfs-logo.svg b/public/images/services/seaweedfs-logo.svg new file mode 100644 index 00000000..61fce568 --- /dev/null +++ b/public/images/services/seaweedfs-logo.svg @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/sequin-logo.svg b/public/images/services/sequin-logo.svg new file mode 100644 index 00000000..623bc115 --- /dev/null +++ b/public/images/services/sequin-logo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/images/services/sessy-logo.svg b/public/images/services/sessy-logo.svg new file mode 100644 index 00000000..b82ad1f3 --- /dev/null +++ b/public/images/services/sessy-logo.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/sftpgo-logo.png b/public/images/services/sftpgo-logo.png new file mode 100644 index 00000000..19500d19 Binary files /dev/null and b/public/images/services/sftpgo-logo.png differ diff --git a/public/images/services/signoz-logo.svg b/public/images/services/signoz-logo.svg new file mode 100644 index 00000000..ac47e1c9 --- /dev/null +++ b/public/images/services/signoz-logo.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/silverbullet.png b/public/images/services/silverbullet.png new file mode 100644 index 00000000..922d3914 Binary files /dev/null and b/public/images/services/silverbullet.png differ diff --git a/public/images/services/siyuan.svg b/public/images/services/siyuan.svg new file mode 100644 index 00000000..fc15edd5 --- /dev/null +++ b/public/images/services/siyuan.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/services/soju-logo.svg b/public/images/services/soju-logo.svg new file mode 100644 index 00000000..f05aeebe --- /dev/null +++ b/public/images/services/soju-logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/services/soketi-app-manager-logo.svg b/public/images/services/soketi-app-manager-logo.svg new file mode 100644 index 00000000..a9e31c96 --- /dev/null +++ b/public/images/services/soketi-app-manager-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/services/soketi-app-manager-screenshots-1.webp b/public/images/services/soketi-app-manager-screenshots-1.webp new file mode 100644 index 00000000..233838af Binary files /dev/null and b/public/images/services/soketi-app-manager-screenshots-1.webp differ diff --git a/public/images/services/soketi-app-manager-screenshots-2.webp b/public/images/services/soketi-app-manager-screenshots-2.webp new file mode 100644 index 00000000..7b9f4057 Binary files /dev/null and b/public/images/services/soketi-app-manager-screenshots-2.webp differ diff --git a/public/images/services/soketi-logo.jpeg b/public/images/services/soketi-logo.jpeg new file mode 100644 index 00000000..00c8d82c Binary files /dev/null and b/public/images/services/soketi-logo.jpeg differ diff --git a/public/images/services/sonarr-logo.svg b/public/images/services/sonarr-logo.svg new file mode 100644 index 00000000..91c04e28 --- /dev/null +++ b/public/images/services/sonarr-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/sonarr.webp b/public/images/services/sonarr.webp new file mode 100644 index 00000000..94f050b0 Binary files /dev/null and b/public/images/services/sonarr.webp differ diff --git a/public/images/services/sparkyfitness.webp b/public/images/services/sparkyfitness.webp new file mode 100644 index 00000000..0be086ad Binary files /dev/null and b/public/images/services/sparkyfitness.webp differ diff --git a/public/images/services/statusnook-logo.svg b/public/images/services/statusnook-logo.svg new file mode 100644 index 00000000..74fd6965 --- /dev/null +++ b/public/images/services/statusnook-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/images/services/stirling-pdf-logo.png b/public/images/services/stirling-pdf-logo.png new file mode 100644 index 00000000..5edc6eae Binary files /dev/null and b/public/images/services/stirling-pdf-logo.png differ diff --git a/public/images/services/strapi-logo.svg b/public/images/services/strapi-logo.svg new file mode 100644 index 00000000..d1a71abc --- /dev/null +++ b/public/images/services/strapi-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/public/images/services/supabase-db-fix.webp b/public/images/services/supabase-db-fix.webp new file mode 100644 index 00000000..4c2442c6 Binary files /dev/null and b/public/images/services/supabase-db-fix.webp differ diff --git a/public/images/services/supabase-logo.svg b/public/images/services/supabase-logo.svg new file mode 100644 index 00000000..ad802ac1 --- /dev/null +++ b/public/images/services/supabase-logo.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/images/services/supabase-selfhost.webp b/public/images/services/supabase-selfhost.webp new file mode 100644 index 00000000..151c4a59 Binary files /dev/null and b/public/images/services/supabase-selfhost.webp differ diff --git a/public/images/services/superset-logo.svg b/public/images/services/superset-logo.svg new file mode 100644 index 00000000..522c3b28 --- /dev/null +++ b/public/images/services/superset-logo.svg @@ -0,0 +1,9 @@ + + + Superset + + + + + + diff --git a/public/images/services/supertokens-logo.svg b/public/images/services/supertokens-logo.svg new file mode 100644 index 00000000..30b435bd --- /dev/null +++ b/public/images/services/supertokens-logo.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/images/services/supertokens.png b/public/images/services/supertokens.png new file mode 100644 index 00000000..57247c6d Binary files /dev/null and b/public/images/services/supertokens.png differ diff --git a/public/images/services/sure-dashboard.png b/public/images/services/sure-dashboard.png new file mode 100644 index 00000000..c50758d3 Binary files /dev/null and b/public/images/services/sure-dashboard.png differ diff --git a/public/images/services/sure.png b/public/images/services/sure.png new file mode 100644 index 00000000..7a0bb69c Binary files /dev/null and b/public/images/services/sure.png differ diff --git a/public/images/services/swetrix-screenshot-1.webp b/public/images/services/swetrix-screenshot-1.webp new file mode 100644 index 00000000..77a62358 Binary files /dev/null and b/public/images/services/swetrix-screenshot-1.webp differ diff --git a/public/images/services/swetrix-screenshot-2.webp b/public/images/services/swetrix-screenshot-2.webp new file mode 100644 index 00000000..b5c6cf71 Binary files /dev/null and b/public/images/services/swetrix-screenshot-2.webp differ diff --git a/public/images/services/swetrix-screenshot-3.webp b/public/images/services/swetrix-screenshot-3.webp new file mode 100644 index 00000000..ea97fb5c Binary files /dev/null and b/public/images/services/swetrix-screenshot-3.webp differ diff --git a/public/images/services/swetrix-screenshot-4.webp b/public/images/services/swetrix-screenshot-4.webp new file mode 100644 index 00000000..dd8ad635 Binary files /dev/null and b/public/images/services/swetrix-screenshot-4.webp differ diff --git a/public/images/services/swetrix-screenshot-5.webp b/public/images/services/swetrix-screenshot-5.webp new file mode 100644 index 00000000..3fa729b5 Binary files /dev/null and b/public/images/services/swetrix-screenshot-5.webp differ diff --git a/public/images/services/swetrix.svg b/public/images/services/swetrix.svg new file mode 100644 index 00000000..8bb5bfdf --- /dev/null +++ b/public/images/services/swetrix.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/public/images/services/syncthing-logo.svg b/public/images/services/syncthing-logo.svg new file mode 100644 index 00000000..6a036026 --- /dev/null +++ b/public/images/services/syncthing-logo.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/tailscale-logo.svg b/public/images/services/tailscale-logo.svg new file mode 100644 index 00000000..cde7dbd5 --- /dev/null +++ b/public/images/services/tailscale-logo.svg @@ -0,0 +1,7 @@ + + + Tailscale Streamline Icon: https://streamlinehq.com + + Tailscale + + \ No newline at end of file diff --git a/public/images/services/teable-logo.png b/public/images/services/teable-logo.png new file mode 100644 index 00000000..2b9e9d9d Binary files /dev/null and b/public/images/services/teable-logo.png differ diff --git a/public/images/services/terraria.svg b/public/images/services/terraria.svg new file mode 100644 index 00000000..cbfa186b --- /dev/null +++ b/public/images/services/terraria.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/images/services/tolgee-logo.svg b/public/images/services/tolgee-logo.svg new file mode 100644 index 00000000..0f216e0c --- /dev/null +++ b/public/images/services/tolgee-logo.svg @@ -0,0 +1,5 @@ + + + + diff --git a/public/images/services/traccar-logo.png b/public/images/services/traccar-logo.png new file mode 100644 index 00000000..c747aea0 Binary files /dev/null and b/public/images/services/traccar-logo.png differ diff --git a/public/images/services/trailbase-logo.svg b/public/images/services/trailbase-logo.svg new file mode 100644 index 00000000..d2e0b8b0 --- /dev/null +++ b/public/images/services/trailbase-logo.svg @@ -0,0 +1,194 @@ + + + + diff --git a/public/images/services/transmission-logo.svg b/public/images/services/transmission-logo.svg new file mode 100644 index 00000000..9a11f77f --- /dev/null +++ b/public/images/services/transmission-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/transmission.png b/public/images/services/transmission.png new file mode 100644 index 00000000..28ad1c90 Binary files /dev/null and b/public/images/services/transmission.png differ diff --git a/public/images/services/trigger-logo.png b/public/images/services/trigger-logo.png new file mode 100644 index 00000000..72999559 Binary files /dev/null and b/public/images/services/trigger-logo.png differ diff --git a/public/images/services/triliumnext-logo.svg b/public/images/services/triliumnext-logo.svg new file mode 100644 index 00000000..17371289 --- /dev/null +++ b/public/images/services/triliumnext-logo.svg @@ -0,0 +1,28 @@ + + + TriliumNext Notes + + + + + + + + + + + + + + + diff --git a/public/images/services/twenty-logo.svg b/public/images/services/twenty-logo.svg new file mode 100644 index 00000000..eef3a382 --- /dev/null +++ b/public/images/services/twenty-logo.svg @@ -0,0 +1 @@ + diff --git a/public/images/services/typesense-logo.png b/public/images/services/typesense-logo.png new file mode 100644 index 00000000..ba91aa2d Binary files /dev/null and b/public/images/services/typesense-logo.png differ diff --git a/public/images/services/typesense.webp b/public/images/services/typesense.webp new file mode 100644 index 00000000..9bb1f0e8 Binary files /dev/null and b/public/images/services/typesense.webp differ diff --git a/public/images/services/umami-logo.svg b/public/images/services/umami-logo.svg new file mode 100644 index 00000000..b900e297 --- /dev/null +++ b/public/images/services/umami-logo.svg @@ -0,0 +1 @@ +Created by potrace 1.11, written by Peter Selinger 2001-2013 diff --git a/public/images/services/unleash.svg b/public/images/services/unleash.svg new file mode 100644 index 00000000..b79f9170 --- /dev/null +++ b/public/images/services/unleash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/unstructured-logo.png b/public/images/services/unstructured-logo.png new file mode 100644 index 00000000..a6ec855b Binary files /dev/null and b/public/images/services/unstructured-logo.png differ diff --git a/public/images/services/uptime-kuma-logo.svg b/public/images/services/uptime-kuma-logo.svg new file mode 100644 index 00000000..c4217915 --- /dev/null +++ b/public/images/services/uptime-kuma-logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/images/services/usesend-logo.svg b/public/images/services/usesend-logo.svg new file mode 100644 index 00000000..067a3f56 --- /dev/null +++ b/public/images/services/usesend-logo.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/usesend-screenshot.webp b/public/images/services/usesend-screenshot.webp new file mode 100644 index 00000000..2d32bc4f Binary files /dev/null and b/public/images/services/usesend-screenshot.webp differ diff --git a/public/images/services/vaultwarden-logo.svg b/public/images/services/vaultwarden-logo.svg new file mode 100644 index 00000000..888e50b2 --- /dev/null +++ b/public/images/services/vaultwarden-logo.svg @@ -0,0 +1,59 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/public/images/services/vert-logo.png b/public/images/services/vert-logo.png new file mode 100644 index 00000000..8990f294 Binary files /dev/null and b/public/images/services/vert-logo.png differ diff --git a/public/images/services/vert.webp b/public/images/services/vert.webp new file mode 100644 index 00000000..bb29a41b Binary files /dev/null and b/public/images/services/vert.webp differ diff --git a/public/images/services/vikunja-logo.svg b/public/images/services/vikunja-logo.svg new file mode 100644 index 00000000..53176d66 --- /dev/null +++ b/public/images/services/vikunja-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/images/services/vvveb-logo.png b/public/images/services/vvveb-logo.png new file mode 100644 index 00000000..4449f944 Binary files /dev/null and b/public/images/services/vvveb-logo.png differ diff --git a/public/images/services/wakapi-logo.svg b/public/images/services/wakapi-logo.svg new file mode 100644 index 00000000..1f5dfb0c --- /dev/null +++ b/public/images/services/wakapi-logo.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/services/weaviate-logo.webp b/public/images/services/weaviate-logo.webp new file mode 100644 index 00000000..9b87010b Binary files /dev/null and b/public/images/services/weaviate-logo.webp differ diff --git a/public/images/services/webcheck-logo.png b/public/images/services/webcheck-logo.png new file mode 100644 index 00000000..5b138476 Binary files /dev/null and b/public/images/services/webcheck-logo.png differ diff --git a/public/images/services/weblate-logo.webp b/public/images/services/weblate-logo.webp new file mode 100644 index 00000000..fae61d60 Binary files /dev/null and b/public/images/services/weblate-logo.webp differ diff --git a/public/images/services/whoogle-logo.png b/public/images/services/whoogle-logo.png new file mode 100644 index 00000000..0d89d25f Binary files /dev/null and b/public/images/services/whoogle-logo.png differ diff --git a/public/images/services/wikijs-logo.svg b/public/images/services/wikijs-logo.svg new file mode 100644 index 00000000..78073b23 --- /dev/null +++ b/public/images/services/wikijs-logo.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/services/windmill-logo.svg b/public/images/services/windmill-logo.svg new file mode 100644 index 00000000..2b06716f --- /dev/null +++ b/public/images/services/windmill-logo.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/public/images/services/wireguardeasy-logo.svg b/public/images/services/wireguardeasy-logo.svg new file mode 100644 index 00000000..81823b3e --- /dev/null +++ b/public/images/services/wireguardeasy-logo.svg @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/public/images/services/wordpress-logo.svg b/public/images/services/wordpress-logo.svg new file mode 100644 index 00000000..e8eb70d4 --- /dev/null +++ b/public/images/services/wordpress-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/services/yamtrack-logo.svg b/public/images/services/yamtrack-logo.svg new file mode 100644 index 00000000..8fd79ded --- /dev/null +++ b/public/images/services/yamtrack-logo.svg @@ -0,0 +1,28 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/public/images/services/yamtrack-screenshots-1.webp b/public/images/services/yamtrack-screenshots-1.webp new file mode 100644 index 00000000..2e62906d Binary files /dev/null and b/public/images/services/yamtrack-screenshots-1.webp differ diff --git a/public/images/services/yamtrack-screenshots-2.webp b/public/images/services/yamtrack-screenshots-2.webp new file mode 100644 index 00000000..0b001402 Binary files /dev/null and b/public/images/services/yamtrack-screenshots-2.webp differ diff --git a/public/images/services/yamtrack.webp b/public/images/services/yamtrack.webp new file mode 100644 index 00000000..31547f84 Binary files /dev/null and b/public/images/services/yamtrack.webp differ diff --git a/public/images/services/zipline1.webp b/public/images/services/zipline1.webp new file mode 100644 index 00000000..8989be55 Binary files /dev/null and b/public/images/services/zipline1.webp differ diff --git a/public/images/services/zipline2.webp b/public/images/services/zipline2.webp new file mode 100644 index 00000000..65238477 Binary files /dev/null and b/public/images/services/zipline2.webp differ diff --git a/public/images/sponsors/algora.webp b/public/images/sponsors/algora.webp new file mode 100644 index 00000000..0e309b14 Binary files /dev/null and b/public/images/sponsors/algora.webp differ diff --git a/public/images/sponsors/americancloud.webp b/public/images/sponsors/americancloud.webp new file mode 100644 index 00000000..6436b930 Binary files /dev/null and b/public/images/sponsors/americancloud.webp differ diff --git a/public/images/sponsors/arcjet.webp b/public/images/sponsors/arcjet.webp new file mode 100644 index 00000000..1f712819 Binary files /dev/null and b/public/images/sponsors/arcjet.webp differ diff --git a/public/images/sponsors/bc.webp b/public/images/sponsors/bc.webp new file mode 100644 index 00000000..32591add Binary files /dev/null and b/public/images/sponsors/bc.webp differ diff --git a/public/images/sponsors/blacksmith.webp b/public/images/sponsors/blacksmith.webp new file mode 100644 index 00000000..09ab401f Binary files /dev/null and b/public/images/sponsors/blacksmith.webp differ diff --git a/public/images/sponsors/branddev.webp b/public/images/sponsors/branddev.webp new file mode 100644 index 00000000..94d85555 Binary files /dev/null and b/public/images/sponsors/branddev.webp differ diff --git a/public/images/sponsors/cloudify.webp b/public/images/sponsors/cloudify.webp new file mode 100644 index 00000000..35aec302 Binary files /dev/null and b/public/images/sponsors/cloudify.webp differ diff --git a/public/images/sponsors/coderabbit.webp b/public/images/sponsors/coderabbit.webp new file mode 100644 index 00000000..1aed326a Binary files /dev/null and b/public/images/sponsors/coderabbit.webp differ diff --git a/public/images/sponsors/comit.webp b/public/images/sponsors/comit.webp new file mode 100644 index 00000000..58f6644b Binary files /dev/null and b/public/images/sponsors/comit.webp differ diff --git a/public/images/sponsors/comp.webp b/public/images/sponsors/comp.webp new file mode 100644 index 00000000..46fd243f Binary files /dev/null and b/public/images/sponsors/comp.webp differ diff --git a/public/images/sponsors/convex.webp b/public/images/sponsors/convex.webp new file mode 100644 index 00000000..c976bb04 Binary files /dev/null and b/public/images/sponsors/convex.webp differ diff --git a/public/images/sponsors/darweb.webp b/public/images/sponsors/darweb.webp new file mode 100644 index 00000000..8f3c71a7 Binary files /dev/null and b/public/images/sponsors/darweb.webp differ diff --git a/public/images/sponsors/glueops.webp b/public/images/sponsors/glueops.webp new file mode 100644 index 00000000..2be95a59 Binary files /dev/null and b/public/images/sponsors/glueops.webp differ diff --git a/public/images/sponsors/goldenvm.webp b/public/images/sponsors/goldenvm.webp new file mode 100644 index 00000000..e1195166 Binary files /dev/null and b/public/images/sponsors/goldenvm.webp differ diff --git a/public/images/sponsors/gozunga.webp b/public/images/sponsors/gozunga.webp new file mode 100644 index 00000000..f5fd6003 Binary files /dev/null and b/public/images/sponsors/gozunga.webp differ diff --git a/public/images/sponsors/hetzner.webp b/public/images/sponsors/hetzner.webp new file mode 100644 index 00000000..f06c6167 Binary files /dev/null and b/public/images/sponsors/hetzner.webp differ diff --git a/public/images/sponsors/hostinger.webp b/public/images/sponsors/hostinger.webp new file mode 100644 index 00000000..daee5fef Binary files /dev/null and b/public/images/sponsors/hostinger.webp differ diff --git a/public/images/sponsors/jobscollider.webp b/public/images/sponsors/jobscollider.webp new file mode 100644 index 00000000..9ecfd0bd Binary files /dev/null and b/public/images/sponsors/jobscollider.webp differ diff --git a/public/images/sponsors/juxtdigital.webp b/public/images/sponsors/juxtdigital.webp new file mode 100644 index 00000000..0dc7e289 Binary files /dev/null and b/public/images/sponsors/juxtdigital.webp differ diff --git a/public/images/sponsors/liquidweb.webp b/public/images/sponsors/liquidweb.webp new file mode 100644 index 00000000..20cfd296 Binary files /dev/null and b/public/images/sponsors/liquidweb.webp differ diff --git a/public/images/sponsors/logto.webp b/public/images/sponsors/logto.webp new file mode 100644 index 00000000..2a27838c Binary files /dev/null and b/public/images/sponsors/logto.webp differ diff --git a/public/images/sponsors/macarne.webp b/public/images/sponsors/macarne.webp new file mode 100644 index 00000000..701c78e3 Binary files /dev/null and b/public/images/sponsors/macarne.webp differ diff --git a/public/images/sponsors/massivegrid.webp b/public/images/sponsors/massivegrid.webp new file mode 100644 index 00000000..2603793d Binary files /dev/null and b/public/images/sponsors/massivegrid.webp differ diff --git a/public/images/sponsors/pfglabs.webp b/public/images/sponsors/pfglabs.webp new file mode 100644 index 00000000..0e784c47 Binary files /dev/null and b/public/images/sponsors/pfglabs.webp differ diff --git a/public/images/sponsors/quant.webp b/public/images/sponsors/quant.webp new file mode 100644 index 00000000..ee0b68fd Binary files /dev/null and b/public/images/sponsors/quant.webp differ diff --git a/public/images/sponsors/saasykit.webp b/public/images/sponsors/saasykit.webp new file mode 100644 index 00000000..6c6d5b40 Binary files /dev/null and b/public/images/sponsors/saasykit.webp differ diff --git a/public/images/sponsors/stream.webp b/public/images/sponsors/stream.webp new file mode 100644 index 00000000..6038621a Binary files /dev/null and b/public/images/sponsors/stream.webp differ diff --git a/public/images/sponsors/supadata.webp b/public/images/sponsors/supadata.webp new file mode 100644 index 00000000..55ad59d1 Binary files /dev/null and b/public/images/sponsors/supadata.webp differ diff --git a/public/images/sponsors/supaguide.webp b/public/images/sponsors/supaguide.webp new file mode 100644 index 00000000..7c632adc Binary files /dev/null and b/public/images/sponsors/supaguide.webp differ diff --git a/public/images/sponsors/syntax.webp b/public/images/sponsors/syntax.webp new file mode 100644 index 00000000..603c981b Binary files /dev/null and b/public/images/sponsors/syntax.webp differ diff --git a/public/images/sponsors/tigris.webp b/public/images/sponsors/tigris.webp new file mode 100644 index 00000000..471417ad Binary files /dev/null and b/public/images/sponsors/tigris.webp differ diff --git a/public/images/sponsors/tolgee.webp b/public/images/sponsors/tolgee.webp new file mode 100644 index 00000000..56e10e98 Binary files /dev/null and b/public/images/sponsors/tolgee.webp differ diff --git a/public/images/sponsors/trieve.webp b/public/images/sponsors/trieve.webp new file mode 100644 index 00000000..6d2549d4 Binary files /dev/null and b/public/images/sponsors/trieve.webp differ diff --git a/public/images/sponsors/ubicloud.webp b/public/images/sponsors/ubicloud.webp new file mode 100644 index 00000000..bca7a7ae Binary files /dev/null and b/public/images/sponsors/ubicloud.webp differ diff --git a/public/images/sponsors/wzit.webp b/public/images/sponsors/wzit.webp new file mode 100644 index 00000000..3d468dd5 Binary files /dev/null and b/public/images/sponsors/wzit.webp differ diff --git a/public/images/sponsors/yaak.webp b/public/images/sponsors/yaak.webp new file mode 100644 index 00000000..db540f9b Binary files /dev/null and b/public/images/sponsors/yaak.webp differ diff --git a/public/images/team/aditya.webp b/public/images/team/aditya.webp new file mode 100644 index 00000000..3aadb083 Binary files /dev/null and b/public/images/team/aditya.webp differ diff --git a/public/images/team/andras.webp b/public/images/team/andras.webp new file mode 100644 index 00000000..42d424ba Binary files /dev/null and b/public/images/team/andras.webp differ diff --git a/public/images/team/coollabs-logo-smaller.webp b/public/images/team/coollabs-logo-smaller.webp new file mode 100644 index 00000000..0ed33acf Binary files /dev/null and b/public/images/team/coollabs-logo-smaller.webp differ diff --git a/public/images/team/coollabs.webp b/public/images/team/coollabs.webp new file mode 100644 index 00000000..b26514e0 Binary files /dev/null and b/public/images/team/coollabs.webp differ diff --git a/public/images/team/oren.webp b/public/images/team/oren.webp new file mode 100644 index 00000000..6088d12b Binary files /dev/null and b/public/images/team/oren.webp differ diff --git a/public/images/team/peak.webp b/public/images/team/peak.webp new file mode 100644 index 00000000..42a45501 Binary files /dev/null and b/public/images/team/peak.webp differ diff --git a/public/images/team/shadowarcanist.webp b/public/images/team/shadowarcanist.webp new file mode 100644 index 00000000..364ae7d3 Binary files /dev/null and b/public/images/team/shadowarcanist.webp differ diff --git a/public/images/terminal/terminal-diagram.webp b/public/images/terminal/terminal-diagram.webp new file mode 100644 index 00000000..c4eefaa3 Binary files /dev/null and b/public/images/terminal/terminal-diagram.webp differ diff --git a/public/images/troubleshoot/applications/bad-gateway/1.webp b/public/images/troubleshoot/applications/bad-gateway/1.webp new file mode 100644 index 00000000..ed90936b Binary files /dev/null and b/public/images/troubleshoot/applications/bad-gateway/1.webp differ diff --git a/public/images/troubleshoot/applications/bad-gateway/2.webp b/public/images/troubleshoot/applications/bad-gateway/2.webp new file mode 100644 index 00000000..65816a36 Binary files /dev/null and b/public/images/troubleshoot/applications/bad-gateway/2.webp differ diff --git a/public/images/troubleshoot/applications/bad-gateway/3.webp b/public/images/troubleshoot/applications/bad-gateway/3.webp new file mode 100644 index 00000000..779c2fc0 Binary files /dev/null and b/public/images/troubleshoot/applications/bad-gateway/3.webp differ diff --git a/public/images/troubleshoot/applications/bad-gateway/4.webp b/public/images/troubleshoot/applications/bad-gateway/4.webp new file mode 100644 index 00000000..1388e730 Binary files /dev/null and b/public/images/troubleshoot/applications/bad-gateway/4.webp differ diff --git a/public/images/troubleshoot/applications/bad-gateway/5.webp b/public/images/troubleshoot/applications/bad-gateway/5.webp new file mode 100644 index 00000000..e91442df Binary files /dev/null and b/public/images/troubleshoot/applications/bad-gateway/5.webp differ diff --git a/public/images/troubleshoot/applications/bad-gateway/no-available-server/update-traefik-version.webp b/public/images/troubleshoot/applications/bad-gateway/no-available-server/update-traefik-version.webp new file mode 100644 index 00000000..ee532470 Binary files /dev/null and b/public/images/troubleshoot/applications/bad-gateway/no-available-server/update-traefik-version.webp differ diff --git a/public/images/troubleshoot/dashboard/dashboard-slow-performance/rocket-loader.webp b/public/images/troubleshoot/dashboard/dashboard-slow-performance/rocket-loader.webp new file mode 100644 index 00000000..3da43055 Binary files /dev/null and b/public/images/troubleshoot/dashboard/dashboard-slow-performance/rocket-loader.webp differ diff --git a/public/images/troubleshoot/dashboard/dashbord-inaccessible/1.webp b/public/images/troubleshoot/dashboard/dashbord-inaccessible/1.webp new file mode 100644 index 00000000..5ae2fd8c Binary files /dev/null and b/public/images/troubleshoot/dashboard/dashbord-inaccessible/1.webp differ diff --git a/public/images/troubleshoot/dashboard/dashbord-inaccessible/2.webp b/public/images/troubleshoot/dashboard/dashbord-inaccessible/2.webp new file mode 100644 index 00000000..a4de8019 Binary files /dev/null and b/public/images/troubleshoot/dashboard/dashbord-inaccessible/2.webp differ diff --git a/public/images/troubleshoot/dashboard/dashbord-inaccessible/3.webp b/public/images/troubleshoot/dashboard/dashbord-inaccessible/3.webp new file mode 100644 index 00000000..5342b801 Binary files /dev/null and b/public/images/troubleshoot/dashboard/dashbord-inaccessible/3.webp differ diff --git a/public/images/troubleshoot/dashboard/dashbord-inaccessible/4.webp b/public/images/troubleshoot/dashboard/dashbord-inaccessible/4.webp new file mode 100644 index 00000000..5ee62cfe Binary files /dev/null and b/public/images/troubleshoot/dashboard/dashbord-inaccessible/4.webp differ diff --git a/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/1.webp b/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/1.webp new file mode 100644 index 00000000..a9beaa3a Binary files /dev/null and b/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/1.webp differ diff --git a/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/2.webp b/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/2.webp new file mode 100644 index 00000000..ddedd642 Binary files /dev/null and b/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/2.webp differ diff --git a/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/3.webp b/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/3.webp new file mode 100644 index 00000000..a029f38d Binary files /dev/null and b/public/images/troubleshoot/dns-and-domains/lets-encrypt-not-working/3.webp differ diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 00000000..8c381154 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,22 @@ +{ + "name": "Jean Docs", + "short_name": "Jean Docs", + "start_url": "/docs/", + "scope": "/docs/", + "display": "standalone", + "background_color": "#071412", + "theme_color": "#6b16ed", + "icons": [ + { + "src": "/docs/brand/favicon.ico", + "sizes": "16x16 32x32", + "type": "image/x-icon" + }, + { + "src": "/docs/brand/logo.webp", + "sizes": "640x640", + "type": "image/webp", + "purpose": "any" + } + ] +} diff --git a/scripts/generate-fumadocs-content.mjs b/scripts/generate-fumadocs-content.mjs new file mode 100644 index 00000000..913d7c7c --- /dev/null +++ b/scripts/generate-fumadocs-content.mjs @@ -0,0 +1,669 @@ +import { mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises' +import path from 'node:path' + +const root = process.cwd() +const sourceDir = path.join(root, 'docs') +const outputDir = path.join(root, 'content/docs') +const ignoredDirs = new Set(['.vitepress', 'public']) + +const folderIndexAliases = new Map([ + ['applications/build-packs/overview', 'applications/build-packs/index.mdx'], + ['applications/ci-cd/introduction', 'applications/ci-cd/index.mdx'], + ['integrations/cloudflare/tunnels/overview', 'integrations/cloudflare/tunnels/index.mdx'], + ['knowledge-base/overview', 'knowledge-base/index.mdx'], + ['knowledge-base/proxy/traefik/overview', 'knowledge-base/proxy/traefik/index.mdx'], + ['knowledge-base/proxy/caddy/overview', 'knowledge-base/proxy/caddy/index.mdx'], + ['troubleshoot/overview', 'troubleshoot/index.mdx'], +]) + +const routeAliases = new Map( + [...folderIndexAliases.keys()].map((route) => [`/${route}`, `/${path.posix.dirname(route)}`]), +) + +const sidebarMetas = { + '': { + pages: [ + 'index', + 'get-started', + 'applications', + 'services', + 'databases', + 'integrations', + 'knowledge-base', + 'api-reference', + 'troubleshoot', + ], + }, + 'get-started': { + title: 'Get Started', + pages: [ + 'introduction', + 'installation', + 'upgrade', + 'downgrade', + 'uninstallation', + 'cloud', + 'usage', + 'concepts', + 'screenshots', + 'videos', + 'team', + 'support', + 'sponsors', + 'contribute', + ], + }, + 'get-started/contribute': { + title: 'Contribute', + pages: ['coolify', 'service', 'documentation'], + }, + applications: { + title: 'Applications', + pages: [ + '---Frameworks---', + 'django', + 'jekyll', + 'laravel', + 'phoenix', + 'rails', + 'symfony', + 'nextjs', + 'vite', + 'vuejs', + 'nuxt', + 'svelte-kit', + 'vitepress', + '---Build Packs---', + 'build-packs', + '---CI/CD---', + 'ci-cd', + ], + }, + 'applications/build-packs': { + title: 'Build Packs', + pages: ['static', 'nixpacks', 'dockerfile', 'docker-compose'], + }, + 'applications/build-packs/nixpacks': { + pages: ['node-versioning'], + }, + 'applications/ci-cd': { + title: 'CI/CD', + pages: ['github', 'gitlab/integration', 'bitbucket/integration', 'gitea/integration', 'other-providers'], + }, + 'applications/ci-cd/github': { + title: 'Github', + pages: [ + 'overview', + 'actions', + 'auto-deploy', + 'preview-deploy', + 'public-repository', + 'deploy-key', + 'setup-app', + 'switch-apps', + ], + }, + services: { + title: 'Services', + pages: ['overview', 'all'], + }, + databases: { + title: 'Databases', + pages: ['ssl', 'backups', 'mysql', 'mariadb', 'postgresql', 'mongodb', 'redis', 'dragonfly', 'keydb', 'clickhouse'], + }, + integrations: { + title: 'Integrations', + pages: ['cloudflare', 'external:[Crowdsec](https://www.crowdsec.net/blog/securing-automated-app-deployment-crowdsec-and-coolify)'], + }, + 'integrations/cloudflare': { + title: 'Cloudflare', + pages: ['tunnels', 'ddos-protection'], + }, + 'integrations/cloudflare/tunnels': { + title: 'Tunnels', + pages: ['all-resource', 'single-resource', 'server-ssh', 'full-tls'], + }, + 'knowledge-base': { + title: 'Knowledge Base', + pages: [ + '---Internal---', + 'internal', + '---Self-hosted Instance---', + 'monitoring', + 'notifications', + 'webhook-payloads', + 'self-update', + 'commands', + 'delete-user', + 'oauth', + 'create-root-user-with-env', + 'define-custom-docker-network-with-env', + 'custom-docker-registry', + 'custom-compose-overrides', + 'change-localhost-key', + '---DNS & Domains---', + 'dns-configuration', + 'domains', + '---Destinations---', + 'destinations', + '---Resources---', + 'environment-variables', + 'persistent-storage', + 'drain-logs', + 'rolling-updates', + 'health-checks', + 'nodejs-multi-core-scaling', + 'cron-syntax', + '---How-Tos---', + 'how-to', + '---Servers---', + 'server', + '---S3---', + 's3', + '---Docker---', + 'docker', + '---Proxy---', + 'proxy', + 'faq', + ], + }, + 'knowledge-base/internal': { + title: 'Internal', + pages: ['scalability', 'terminal'], + }, + 'knowledge-base/destinations': { + title: 'Destinations', + pages: ['create', 'manage'], + }, + 'knowledge-base/how-to': { + title: 'How-Tos', + pages: [ + 'migrate-apps-different-host', + 'backup-restore-coolify', + 'hetzner-loadbalancing', + 'wordpress-multisite', + 'raspberry-pi-os', + 'macos-colima', + 'private-npm-registry', + 'ollama-with-gpu', + 'webstudio-with-hetzner', + ], + }, + 'knowledge-base/server': { + title: 'Servers', + pages: [ + 'introduction', + 'automated-cleanup', + 'build-server', + 'firewall', + 'multiple-servers', + 'sentinel', + 'non-root-user', + 'openssh', + 'oracle-cloud', + 'proxies', + 'patching', + 'terminal-access', + ], + }, + 'knowledge-base/s3': { + title: 'S3', + pages: ['introduction', 'aws', 'r2', 'supabase'], + }, + 'knowledge-base/docker': { + title: 'Docker', + pages: ['compose', 'custom-commands', 'registry', 'swarm'], + }, + 'knowledge-base/proxy': { + title: 'Proxy', + pages: ['traefik', 'caddy'], + }, + 'knowledge-base/proxy/traefik': { + title: 'Traefik', + pages: [ + 'basic-auth', + 'custom-ssl-certs', + 'dashboard', + 'custom-middlewares', + 'dynamic-config', + 'load-balancing', + 'dns-challenge', + 'wildcard-certs', + 'protect-services-with-authentik', + ], + }, + 'knowledge-base/proxy/traefik/custom-middlewares': { + pages: ['redirects'], + }, + 'knowledge-base/proxy/caddy': { + title: 'Caddy', + pages: ['basic-auth', 'dns-challenge'], + }, + 'api-reference': { + title: 'API Reference', + pages: ['authorization', 'api'], + }, + troubleshoot: { + title: 'Troubleshoot', + pages: ['installation', 'applications', 'dashboard', 'docker', 'server', 'dns-and-domains'], + }, + 'troubleshoot/installation': { + title: 'Installation', + pages: ['install-script-failed', 'docker-install-failed'], + }, + 'troubleshoot/applications': { + title: 'Applications', + pages: ['bad-gateway', 'no-available-server', 'gateway-timeout', 'failed-to-get-token'], + }, + 'troubleshoot/dashboard': { + title: 'Dashboard', + pages: ['dashboard-inaccessible', 'dashboard-slow-performance', 'disable-2fa-manually'], + }, + 'troubleshoot/docker': { + title: 'Docker', + pages: ['expired-github-personal-access-token'], + }, + 'troubleshoot/server': { + title: 'Server', + pages: ['connection-issues', 'crash-during-build', 'two-factor-stopped-working', 'raspberry-crashes', 'validation-issues'], + }, + 'troubleshoot/dns-and-domains': { + title: 'DNS & Domains', + pages: ['wildcard-ssl-certs', 'lets-encrypt-not-working', 'certificate-resolver-doesnt-exist'], + }, +} + +function toPosix(value) { + return value.split(path.sep).join('/') +} + +async function walk(dir) { + const entries = await readdir(dir, { withFileTypes: true }) + const files = [] + + for (const entry of entries) { + if (ignoredDirs.has(entry.name)) continue + + const fullPath = path.join(dir, entry.name) + const relativeDir = toPosix(path.relative(sourceDir, fullPath)) + if (entry.isDirectory() && relativeDir === 'api-reference/api') { + continue + } + + if (entry.isDirectory()) { + files.push(...await walk(fullPath)) + continue + } + + if (entry.isFile() && entry.name.endsWith('.md')) { + files.push(fullPath) + } + } + + return files +} + +function splitCodeFences(markdown) { + const parts = [] + const regex = /```[\s\S]*?```/g + let lastIndex = 0 + let match + + while ((match = regex.exec(markdown)) !== null) { + if (match.index > lastIndex) { + parts.push({ type: 'text', value: markdown.slice(lastIndex, match.index) }) + } + + parts.push({ type: 'code', value: match[0] }) + lastIndex = regex.lastIndex + } + + if (lastIndex < markdown.length) { + parts.push({ type: 'text', value: markdown.slice(lastIndex) }) + } + + return parts +} + +function escapeAttribute(value) { + return value.replaceAll('&', '&').replaceAll('"', '"') +} + +function normalizeLink(url) { + if ( + !url || + url.startsWith('http://') || + url.startsWith('https://') || + url.startsWith('mailto:') || + url.startsWith('tel:') || + url.startsWith('#') + ) { + return url + } + + if (url === '/') return '/' + + let normalized = url + if (normalized.startsWith('/docs/')) normalized = normalized.replace(/^\/docs/, '') || '/' + if (!normalized.startsWith('/')) return normalized + + const [pathname, suffix = ''] = normalized.split(/(?=[?#])/, 2) + return `${routeAliases.get(pathname) ?? pathname}${suffix}` +} + +function normalizeAsset(url) { + if (!url || url.startsWith('http://') || url.startsWith('https://') || url.startsWith('data:')) { + return url + } + + if (url.startsWith('/docs/')) return url + if (url.startsWith('/images/')) return `/docs${url}` + return url +} + +function convertContainerOpen(raw) { + const match = raw.match(/^:{3,4}\s*([a-zA-Z-]+)\s*(.*)$/) + if (!match) return raw + + const kind = match[1].toLowerCase() + const title = match[2]?.trim() + + if (kind === 'details') { + return `\n
${title ? `\n${title}` : ''}\n` + } + + const typeMap = { + danger: 'error', + warning: 'warn', + tip: 'info', + info: 'info', + success: 'success', + neutral: 'info', + } + const type = typeMap[kind] ?? 'info' + const titleProp = title ? ` title="${escapeAttribute(title)}"` : '' + return `\n\n` +} + +function convertContainers(text) { + const stack = [] + const lines = text.split('\n') + + const converted = lines + .map((line) => { + if (/^:{3,4}\s*$/.test(line.trim())) { + if (stack.length === 0) return '' + const kind = stack.pop() + return kind === 'details' ? '\n
\n' : '\n\n' + } + + const containerLine = line.trim().replace(/^[-*]\s+/, '') + if (/^:{3,4}\s*[a-zA-Z-]+/.test(containerLine)) { + const kind = containerLine.match(/^:{3,4}\s*([a-zA-Z-]+)/)?.[1]?.toLowerCase() + stack.push(kind === 'details' ? 'details' : 'callout') + return convertContainerOpen(containerLine) + } + + return line + }) + + while (stack.length > 0) { + const kind = stack.pop() + converted.push(kind === 'details' ? '\n\n' : '\n\n') + } + + return converted.join('\n') +} + +function convertVueTeamPage(markdown) { + if (!markdown.includes('