Merge branch 'next' into shadow/big-shadow

This commit is contained in:
ShadowArcanist
2025-11-16 23:19:27 +05:30
61 changed files with 965 additions and 382 deletions
@@ -0,0 +1,78 @@
name: Enforce PR Standards
on:
pull_request_target:
types: [opened, reopened, edited]
permissions:
pull-requests: write
contents: read
jobs:
validate-pr:
runs-on: [self-hosted, arm64]
steps:
- name: Validate PR
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const pr = context.payload.pull_request;
const owner = context.repo.owner;
const repo = context.repo.repo;
const prNumber = pr.number;
const prUser = pr.user.login;
const currentBase = pr.base.ref;
const body = pr.body?.trim() || '';
// Step 1: Close PR if description is empty
if (body === '') {
console.log(`PR #${prNumber} has an empty description. Closing...`);
await github.rest.issues.createComment({
owner,
repo,
issue_number: prNumber,
body: `Hi @${prUser},\n\nThis PR has been automatically closed because it has no description.\nPlease provide a valid description explaining your changes in a new PR.`
});
await github.rest.pulls.update({
owner,
repo,
pull_number: prNumber,
state: 'closed'
});
return;
}
// Step 2: Check if user is a member
let isMember = false;
try {
await github.rest.orgs.checkMembershipForUser({
org: owner,
username: prUser
});
isMember = true;
} catch (error) {
console.log(`User ${prUser} is not a member of the org.`);
}
// Step 3: Change base branch to `next` if needed
if (!isMember && currentBase !== 'next') {
console.log(`Changing base branch from ${currentBase} to next for PR #${prNumber}`);
await github.rest.pulls.update({
owner,
repo,
pull_number: prNumber,
base: 'next'
});
await github.rest.issues.createComment({
owner,
repo,
issue_number: prNumber,
body: `Hi @${prUser},\n\nThe base branch of this PR has been automatically changed to \`next\`.\nAll contributors must commit changes to the \`next\` branch.\n\nA maintainer will review your PR within 5 to 7 business days. Thank you!`
});
}
BIN
View File
Binary file not shown.
+86 -29
View File
@@ -42,19 +42,50 @@ export default defineConfig({
]
},
transformPageData(pageData) {
const baseUrl = env.VITE_SITE_URL ?? 'https://coolify.io/docs/'
const defaultImage = 'https://coolcdn.b-cdn.net/assets/coolify/og-image-docs.png'
const defaultDescription = 'Self hosting with superpowers: An open-source & self-hostable Heroku / Netlify / Vercel alternative.'
// Build canonical URL for this page
const pageUrl = `${baseUrl}${pageData.relativePath.replace(/((^|\/)index)?\.md$/, '$2')}`
// Extract values with fallback chain
const baseTitle = pageData.frontmatter.title || pageData.title || 'Coolify Docs'
const title = baseTitle === 'Coolify Docs' ? baseTitle : `${baseTitle} | Coolify`
const description = pageData.frontmatter.description || defaultDescription
// Handle image with relative to absolute URL conversion
const relativeImage = pageData.frontmatter.image
const image = relativeImage
? `${baseUrl.replace(/\/$/, '')}${relativeImage.startsWith('/') ? relativeImage : '/' + relativeImage}`.replace(/\/docs\/docs\//, '/docs/')
: defaultImage
// Initialize head array if it doesn't exist
pageData.frontmatter.head ??= []
// Add Open Graph tags
pageData.frontmatter.head.push(
['meta', { property: 'og:title', content: title }],
['meta', { property: 'og:description', content: description }],
['meta', { property: 'og:url', content: pageUrl }],
['meta', { property: 'og:image', content: image }]
)
// Add Twitter Card tags
pageData.frontmatter.head.push(
['meta', { property: 'twitter:title', content: title }],
['meta', { property: 'twitter:description', content: description }],
['meta', { property: 'twitter:url', content: pageUrl }],
['meta', { property: 'twitter:image', content: image }]
)
},
head: [
['meta', { name: 'theme-color', content: '#000000' }],
['meta', { property: 'og:type', content: 'website' }],
['meta', { property: 'og:title', content: 'Coolify Docs' }],
['meta', { property: 'og:url', content: env.VITE_SITE_URL ?? 'https://coolify.io/docs/' }],
['meta', { property: 'og:description', content: 'Self hosting with superpowers: An open-source & self-hostable Heroku / Netlify / Vercel alternative.' }],
['meta', { property: 'og:image', content: 'https://coolcdn.b-cdn.net/assets/coolify/og-image-docs.png' }],
['meta', { property: 'twitter:site', content: '@coolifyio' }],
['meta', { property: 'twitter:card', content: 'summary_large_image' }],
['meta', { property: 'twitter:title', content: 'Coolify Docs' }],
['meta', { property: 'twitter:description', content: 'Self hosting with superpowers: An open-source & self-hostable Heroku / Netlify / Vercel alternative.' }],
['meta', { property: 'twitter:url', content: env.VITE_SITE_URL ?? 'https://coolify.io/docs/' }],
['meta', { property: 'twitter:image', content: 'https://coolcdn.b-cdn.net/assets/coolify/og-image-docs.png' }],
['link', { rel: 'icon', href: '/docs/coolify-logo-transparent.png', alt: "Coolify's Logo" }],
['link', { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],
['script', { defer: 'true', src: 'https://analytics.coollabs.io/js/script.tagged-events.js', 'data-domain': env.VITE_ANALYTICS_DOMAIN ?? 'coolify.io/docs' }],
@@ -137,25 +168,6 @@ export default defineConfig({
],
},
{
text: 'Builds',
collapsed: true,
items: [
{ text: 'Introduction', link: '/builds/introduction' },
{
text: 'Build Packs',
collapsed: true,
items: [
{ text: 'Overview', link: '/builds/packs/overview' },
{ text: 'Static', link: '/builds/packs/static' },
{ text: 'Nixpacks', link: '/builds/packs/nixpacks' },
{ text: 'Dockerfile', link: '/builds/packs/dockerfile' },
{ text: 'Docker Compose', link: '/builds/packs/docker-compose' },
]
},
{ text: 'Build Servers', link: '/builds/servers' },
],
},
{
text: 'Applications',
collapsed: true,
@@ -163,6 +175,9 @@ export default defineConfig({
{
text: 'Overview',
link: '/applications/index',
},
{
text: 'Frameworks',
items: [
{ text: 'Django', link: '/applications/django' },
{ text: 'Jekyll', link: '/applications/jekyll' },
@@ -176,7 +191,49 @@ export default defineConfig({
{ text: 'Nuxt', link: '/applications/nuxt' },
{ text: 'SvelteKit', link: '/applications/svelte-kit' },
]
}
},
{
text: 'Build Packs',
link: '/applications/build-packs/overview',
collapsed: true,
items: [
{ text: 'Static', link: '/applications/build-packs/static' },
{ text: 'Nixpacks', link: '/applications/build-packs/nixpacks' },
{ text: 'Dockerfile', link: '/applications/build-packs/dockerfile' },
{ text: 'Docker Compose', link: '/applications/build-packs/docker-compose' },
]
},
{
text: 'CI/CD',
link: '/applications/ci-cd/introduction',
collapsed: true,
items: [
{
text: 'Github', collapsed: true, items: [
{ text: 'Integrations', link: '/applications/ci-cd/github/integration' },
{ text: 'Manually Setup GitHub App', link: '/applications/ci-cd/github/manually-setup-github-app' },
{ text: 'Move Between GitHub Apps', link: '/applications/ci-cd/github/move-between-github-apps' },
{ text: 'Github Actions', link: '/applications/ci-cd/github/github-actions' },
]
},
{
text: 'Gitlab',
link: '/applications/ci-cd/gitlab/integration',
},
{
text: 'Bitbucket',
link: '/applications/ci-cd/bitbucket/integration',
},
{
text: 'Gitea',
link: '/applications/ci-cd/gitea/integration',
},
{
text: 'Other Providers',
link: '/applications/ci-cd/other-providers',
},
]
},
],
},
{
@@ -184,7 +241,7 @@ export default defineConfig({
collapsed: true,
items: [
{ text: 'Introduction', link: '/services/introduction' },
{ text: 'All Services', link: '/services/overview' },
{ text: 'All One-Click Services', link: '/services/overview' },
{ text: 'Services Directory', link: '/services/all' }
]
},
@@ -1,10 +1,7 @@
<script setup lang="ts">
import { ref, computed, watch, onMounted, onUnmounted } from 'vue'
import { useData } from 'vitepress'
import { ref, watch, onMounted } from 'vue'
import { onKeyStroke } from '@vueuse/core'
const { isDark } = useData()
interface SearchResult {
id: string
title: string
@@ -22,6 +19,7 @@ const isLoading = ref(false)
const selectedIndex = ref(0)
const searchInputRef = ref<HTMLInputElement | null>(null)
const searchError = ref<string | null>(null)
const searchQueryId = ref<string | null>(null)
// Korrektly SDK configuration
const korrektlyConfig = {
@@ -57,12 +55,19 @@ defineExpose({
openSearch
})
const closeSearch = () => {
isOpen.value = false
const clearSearch = () => {
cancelOngoingSearch()
searchQuery.value = ''
searchResults.value = []
selectedIndex.value = 0
searchError.value = null
searchQueryId.value = null
isLoading.value = false
}
const closeSearch = () => {
clearSearch()
isOpen.value = false
}
// Keyboard shortcuts (only for modal interactions)
@@ -94,21 +99,30 @@ onKeyStroke('Enter', () => {
// Debounced search
let searchTimeout: NodeJS.Timeout | null = null
let abortController: AbortController | null = null
watch(searchQuery, async (newQuery) => {
const cancelOngoingSearch = () => {
if (searchTimeout) {
clearTimeout(searchTimeout)
searchTimeout = null
}
if (abortController) {
abortController.abort()
abortController = null
}
}
watch(searchQuery, async (newQuery) => {
cancelOngoingSearch()
if (!newQuery.trim()) {
searchResults.value = []
searchError.value = null
isLoading.value = false
return
}
searchTimeout = setTimeout(async () => {
await performSearch(newQuery)
}, 300)
searchTimeout = setTimeout(() => performSearch(newQuery), 300)
})
const performSearch = async (query: string) => {
@@ -118,6 +132,16 @@ const performSearch = async (query: string) => {
return
}
if (!korrektlyConfig.datasetId || !korrektlyConfig.apiToken) {
console.error('Korrektly dataset ID not configured')
searchError.value = 'Search is not properly configured. Please check the environment variables.'
return
}
// Create new abort controller for this search
abortController = new AbortController()
const currentAbortController = abortController
isLoading.value = true
searchError.value = null
try {
@@ -127,10 +151,10 @@ const performSearch = async (query: string) => {
search_type: 'hybrid',
})
// Check if response contains an error
if (currentAbortController.signal.aborted) return
if (response?.error || response?.message) {
const errorMessage = response.message || response.error || 'An unknown error occurred'
searchError.value = errorMessage
searchError.value = response.message || response.error || 'An unknown error occurred'
searchResults.value = []
console.error('Search API error:', response)
return
@@ -139,78 +163,68 @@ const performSearch = async (query: string) => {
// The API returns { success, data: { results: [...] } }
const results = response?.data?.results || response?.results || response?.chunks || []
searchResults.value = results.map((chunk: any) => {
// Extract metadata from array format
const getMetadata = (key: string) => {
const meta = chunk.metadata?.find((m: any) => m.key === key)
return meta?.value || ''
}
// Capture search_query_id for click tracking
searchQueryId.value = response?.data?.search_query_id || null
const title = getMetadata('title') || getMetadata('heading') || extractTitle(chunk.content_html) || 'Untitled'
const description = getMetadata('description') || ''
const hierarchy = getMetadata('hierarchy') || ''
// Build URL from source_url or group tracking_id
let url = chunk.source_url || ''
if (url.includes('/home/aditya/workspace/coollabs/coolify-docs/docs')) {
// Convert file path to URL path
url = url.replace('/home/aditya/workspace/coollabs/coolify-docs/docs', '/docs')
url = url.replace('.md', '')
} else if (chunk.group?.tracking_id) {
url = chunk.group.tracking_id.replace('/home/aditya/workspace/coollabs/coolify-docs/docs', '/docs')
url = url.replace('.md', '')
}
// Create breadcrumb from hierarchy or URL (excluding 'docs' prefix)
let breadcrumb = ''
if (hierarchy) {
// Convert "home > aditya > workspace > coollabs > coolify-docs > docs > services > n8n"
// to "services / n8n"
const parts = hierarchy.split(' > ')
const docsIndex = parts.indexOf('docs')
if (docsIndex !== -1 && docsIndex < parts.length - 1) {
breadcrumb = parts.slice(docsIndex + 1).join(' / ')
} else {
breadcrumb = hierarchy.replace(/ > /g, ' / ')
}
} else if (url) {
// Extract from URL: /docs/services/n8n -> services / n8n
breadcrumb = url.replace(/^\/docs\//, '').replace(/\//g, ' / ')
}
return {
id: chunk.id,
title,
content: description || chunk.content_html || chunk.content || '',
url,
highlight: chunk.content_html,
hierarchy,
breadcrumb,
}
})
searchResults.value = results.map((chunk: any) => transformSearchResult(chunk))
selectedIndex.value = 0
} catch (error: any) {
if (currentAbortController.signal.aborted) return
console.error('Search error:', error)
// Try to extract error message from the error object
let errorMessage = 'An unexpected error occurred while searching.'
if (error?.response?.data?.message) {
errorMessage = error.response.data.message
} else if (error?.message) {
errorMessage = error.message
} else if (typeof error === 'string') {
errorMessage = error
}
searchError.value = errorMessage
searchError.value = extractErrorMessage(error)
searchResults.value = []
} finally {
isLoading.value = false
if (!currentAbortController.signal.aborted) {
isLoading.value = false
}
}
}
const getMetadata = (chunk: any, key: string): any => {
const meta = chunk.metadata?.find((m: any) => m.key === key)
return meta?.value || ''
}
const transformSearchResult = (chunk: any): SearchResult => {
const title = getMetadata(chunk, 'title') || getMetadata(chunk, 'heading') || extractTitle(chunk.content_html) || 'Untitled'
const description = getMetadata(chunk, 'description') || ''
const hierarchy = getMetadata(chunk, 'hierarchy') || []
const url = normalizeUrl(chunk.source_url || chunk.group?.tracking_id || '')
const breadcrumb = createBreadcrumb(hierarchy, url)
return {
id: chunk.id,
title,
content: description || chunk.content_html || chunk.content || '',
url,
highlight: chunk.content_html,
hierarchy,
breadcrumb,
}
}
const normalizeUrl = (path: string): string => {
if (!path) return ''
// Find 'docs' in the path and extract everything from that point
const docsIndex = path.indexOf('/docs')
if (docsIndex !== -1) {
path = path.substring(docsIndex)
}
// Remove .md extension
return path.replace(/\.md$/, '')
}
const extractErrorMessage = (error: any): string => {
if (error?.response?.data?.message) return error.response.data.message
if (error?.message) return error.message
if (typeof error === 'string') return error
return 'An unexpected error occurred while searching.'
}
const extractTitle = (html: string): string => {
if (!html) return ''
const temp = document.createElement('div')
@@ -219,7 +233,47 @@ const extractTitle = (html: string): string => {
return heading?.textContent?.trim() || ''
}
const createBreadcrumb = (hierarchy: string[], url: string): string => {
// Try hierarchy first
if (Array.isArray(hierarchy) && hierarchy.length > 0) {
const docsIndex = hierarchy.findIndex(item => item === 'docs')
return docsIndex !== -1
? hierarchy.slice(docsIndex).join(' / ')
: hierarchy.join(' / ')
}
// Fall back to URL
if (!url) return ''
const urlParts = url.replace(/^\/+/, '').split('/')
const docsIndex = urlParts.indexOf('docs')
return docsIndex !== -1
? urlParts.slice(docsIndex).join(' / ')
: urlParts.join(' / ')
}
const trackClick = async (chunkId: string, position: number) => {
if (!korrektlySDK || !searchQueryId.value || !korrektlyConfig.datasetId) {
return
}
try {
await korrektlySDK.trackClick(korrektlyConfig.datasetId, {
search_query_id: searchQueryId.value,
chunk_id: chunkId,
position,
})
} catch (error) {
// Log error but don't block navigation
console.error('Failed to track click:', error)
}
}
const navigateToResult = (result: SearchResult) => {
// Track click in fire-and-forget manner
trackClick(result.id, selectedIndex.value)
window.location.href = result.url
closeSearch()
}
@@ -283,7 +337,8 @@ const truncate = (text: string, length: number) => {
<button
v-if="searchQuery"
class="absolute right-3 w-6 h-6 flex items-center justify-center rounded bg-[var(--vp-c-bg-soft)] text-[var(--vp-c-text-2)] hover:bg-[var(--vp-c-bg-elv)] hover:text-[var(--vp-c-text-1)] transition-all text-xl leading-none"
@click="searchQuery = ''"
@click="clearSearch"
title="Clear search"
>
×
</button>
@@ -353,7 +408,6 @@ const truncate = (text: string, length: number) => {
<!-- Initial State -->
<div v-else class="py-12 px-6 text-center text-[var(--vp-c-text-2)]">
<p class="text-sm mb-6">Start typing to search...</p>
<div class="mt-6">
<p class="text-xs font-semibold text-[var(--vp-c-text-2)] mb-3 uppercase tracking-wide">Popular searches:</p>
<div class="flex flex-wrap gap-2 justify-center">
@@ -1478,6 +1478,13 @@ const services = [
description: 'Social media scheduling and analytics tool.',
category: 'Social Media'
},
{
name: 'Pterodactyl',
slug: 'pterodactyl',
icon: '/docs/images/services/pterodactyl_logo_transparent.png',
description: 'Game server management panel with Wings daemon for hosting Minecraft, CS:GO, ARK and more.',
category: 'Gaming'
},
{
name: 'Prefect',
slug: 'prefect',
@@ -1946,6 +1953,13 @@ const services = [
icon: '/docs/images/services/pgbackweb-logo.png',
description: 'Effortless PostgreSQL backups with a user-friendly web interface.',
category: 'Database'
},
{
name: 'Postgresus',
slug: 'postgresus',
icon: '/docs/images/services/postgresus-logo.webp',
description: 'A free, open source and self-hosted tool to backup PostgreSQL. Make backups with different storages and notifications about progress.',
category: 'Backup'
},
{
name: 'Ryot',
@@ -1975,13 +1989,6 @@ const services = [
description: 'Self-hosted file converter.',
category: 'Utilities'
},
{
name: 'Wings',
slug: 'wings',
icon: '/docs/images/services/pterodactyl-logo.png',
description: 'Pterodactyl server control plane for game servers.',
category: 'Gaming'
},
{
name: 'Yamtrack',
slug: 'yamtrack',
@@ -1995,6 +2002,20 @@ const services = [
icon: '/docs/images/services/marimo.svg',
description: 'Open-source reactive notebook for Python.',
category: 'Development'
},
{
name: 'pgAdmin',
slug: 'pgadmin',
icon: '/docs/images/services/pgadmin-logo.svg',
description: 'A web-based database management tool for administering your PostgreSQL databases through a user-friendly interface.',
category: 'Development'
},
{
name: 'Redis Insight',
slug: 'redis-insight',
icon: '/docs/images/services/redisinsight-logo.png',
description: 'Official Redis GUI that lets you do both GUI- and CLI-based interactions in a fully-featured desktop GUI client.',
category: 'Development'
}
]
@@ -2269,3 +2290,4 @@ const { preloadServices, handleImageError, hasImageError, isImageLoading, getFal
</div>
</div>
</template>
@@ -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](/knowledge-base/git/github/integration#with-github-app-recommended) or [Deploy Key](/knowledge-base/git/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/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.)
### 3. Select Your Git Repository
@@ -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](/knowledge-base/git/github/integration#with-github-app-recommended) or [Deploy Key](/knowledge-base/git/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/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.)
### 3. Select Your Git Repository
@@ -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](/knowledge-base/git/github/integration#with-github-app-recommended) or [Deploy Key](/knowledge-base/git/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/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.)
### 3. Select Your Git Repository
@@ -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](/knowledge-base/git/github/integration#with-github-app-recommended) or [Deploy Key](/knowledge-base/git/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/integration#with-github-app-recommended) or [Deploy Key](/applications/ci-cd/github/integration#with-deploy-keys) if needed.)
### 4. Select Your Git Repository
@@ -15,7 +15,7 @@ For example, you moved your repositories to a new organization and want to use a
## Solution
1. Move the repositories to your new GitHub organization (or to your personal account).
2. Add the new GitHub App to Coolify, either by creating [manually](/knowledge-base/git/github/manually-setup-github-app) or automatically through Coolify's UI.
2. Add the new GitHub App to Coolify, either by creating [manually](/applications/ci-cd/github/manually-setup-github-app) or automatically through Coolify's UI.
3. Make sure the Github App installation has access to the repositories on the new place, for example by opening `https://github.com/organizations/<organization>/settings/installations` and check the added repositories.
4. Go to your application in Coolify -> `Git Source` tab and select the new Github App.
5. Make sure you change the repository name to the new one, like from `andrasbacsai/test-repo` to `coollabsio/test-repo`.
+104
View File
@@ -0,0 +1,104 @@
---
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/integration)** - 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/overview)
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
::: tip Alternative: Deploy Without Git
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/integration)** - 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/overview) to understand how Coolify transforms your code into running containers.
+114
View File
@@ -0,0 +1,114 @@
---
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`
::: warning Caution
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`).
::: warning Caution
- 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`
::: warning Caution
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.
::: warning Caution
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.
::: tip Alternative: Direct Webhooks
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 |
+27 -35
View File
@@ -9,6 +9,24 @@ Application could be any type of web application. It could be a static site, a N
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/overview) 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)
::: tip Resource Management
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
::: info
The list is not complete.
@@ -170,42 +188,16 @@ There are several types of application deployments available.
## Build Packs
These are the supported build packs:
Build packs help transform your source code into Docker images. Coolify supports several build pack options to match different deployment needs:
- Nixpacks
- Dockerfile
- Docker Image
- Docker Compose
- **[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
### Nixpacks
For detailed guides on each build pack, see the [Build Packs section](/applications/build-packs/overview).
Coolify uses [Nixpacks](https://nixpacks.com) as build pack by default. Nixpacks detect what kind of application are you trying to deploy and builds it accordingly.
But if needed, you can customize it by adding a `nixpacks.toml` file to your repository or setting the right environment variables.
For example, if you are using a NodeJS application, you can set the `NIXPACKS_NODE_VERSION` to control the NodeJS version.
:::success TIP
Worth reading their [documentation](https://nixpacks.com/docs) to understand
how it works.
:::tip Quick Start
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.
:::
### Dockerfile
Dockerfile based build packs are useful if you have a custom dockerfile inside your Git repository.
#### Custom Dockerfile Location
You can always set your custom dockerfile location. By default, it is set to `/Dockerfile`.
### Docker Image
You can deploy any docker images from any Docker compatible repository. For example, you can deploy images from Docker Hub, GitHub Container Registry, etc.
To pull images from a private registry, you need to login to your docker registry as explained here: https://coolify.io/docs/knowledge-base/docker/registry#docker-credentials
### Docker Compose
Docker Compose based deployments are useful for complex applications. You can define multiple services in a single `docker-compose.yml` file and deploy them together.
- [Languages/Frameworks](/applications/)
- [Services](/services/overview)
+1 -1
View File
@@ -271,7 +271,7 @@ stdout_logfile=/var/log/worker-inertia-ssr.log
```
> [!NOTE]
> Per 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:
> 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",
+2 -2
View File
@@ -13,11 +13,11 @@ Vite is a build tool that aims to provide a faster and leaner development experi
- Set `Build Pack` to `nixpacks`.
- Enable `Is it a static site?`.
- Set `Output Directory` to `dist`.
- Set `Publish Directory` to `dist`.
## Vanilla JavaScript build (Static)
- Set `Build Pack` to `nixpacks`.
- Enable `Is it a static site?`.
- Set `Output Directory` to `dist`.
- Set `Publish Directory` to `dist`.
-43
View File
@@ -1,43 +0,0 @@
---
title: Introduction to Builds
description: Deploy applications as Docker containers with Coolify using build packs like Nixpacks, Dockerfile, Docker Compose, or pre-built registry images.
---
<ZoomableImage src="/docs/images/builds/introduction/builds-banner.webp" alt="Coolify builds banner" />
<br />
Coolify deploys all applications as Docker containers. This means your app, database, or website runs inside a container.
No matter what you deploy or which build pack you use, it is always run as a Docker container.
## How Docker Containers Work
- **Docker Image:** To run a container, you need a Docker image.
- **Dockerfile:** The image is built using a Dockerfile, just a file with step-by-step instructions to build the docker image.
- **Build Process:** If you're building your own application, you'll need to create your docker image using a Dockerfile.
- Coolify helps with this build process by letting you use different build packs. A commonly used build pack is [Nixpacks](https://nixpacks.com?utm_source=coolify.io), which automatically prepares a Dockerfile and builds the docker image for you.
## Build Packs in Coolify
Coolify offers build packs like [Nixpack](https://nixpacks.com?utm_source=coolify.io) and **Static Build Pack** that automatically create your Docker image.
If you need more control over the process, you can write your own Dockerfile and Docker Compose file. In that case, Coolify will use your file to build the image on the server and deploy it as a container.
## Using Pre-built Images
If you already have a Docker image stored in a registry (for example, [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)), you can use that image directly in Coolify. This means you do not have to rebuild the image on your server.
## Managing Build Resources
Building Docker images can consume a lot of resources on your server, potentially causing it to crash.
To reduce the load on your main server, Coolify allows you to connect additional servers to manage the build process.
You can set up a separate [build server](/builds/servers) to handle the builds, or use external tools like [GitHub Actions](https://github.com/features/actions?utm_source=coolify.io) to build your images and push them to any container registry.
Once the images are pushed, you can easily use them on Coolify.
## What's Next?
Check the pages in the sidebar to learn more about build packs, build commands, and build servers.
-68
View File
@@ -1,68 +0,0 @@
---
title: Build Server
description: Set up a build server in Coolify to separate your build process from deployment, reduce load, and improve performance.
---
<ZoomableImage src="/docs/images/builds/servers/banner.webp" alt="Coolify banner" />
<br />
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 servers architecture matches that of your deployment servers.
::: success Tip:
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.
<ZoomableImage src="/docs/images/builds/servers/1.webp" alt="Coolify dashboard screenshot" />
- 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.
<ZoomableImage src="/docs/images/builds/servers/2.webp" alt="Coolify dashboard screenshot" />
- If you have already connected your server, enable the Build Server feature as shown in the image below.
<ZoomableImage src="/docs/images/builds/servers/3.webp" alt="Coolify dashboard screenshot" />
::: warning HEADS UP!
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.
<ZoomableImage src="/docs/images/builds/servers/3.webp" alt="Coolify dashboard screenshot" />
:::
## 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.
<ZoomableImage src="/docs/images/builds/servers/4.webp" alt="Coolify dashboard screenshot" />
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.
+1 -1
View File
@@ -55,7 +55,7 @@ Before creating a destination, ensure you have:
- Choose from available servers in your team
- Server must be online and accessible
- Can not be a [build server](/builds/servers)
- Can not be a [build server](/knowledge-base/server/build-server)
- Determines where the Docker network will be created
### Destination Type
+1 -1
View File
@@ -69,7 +69,7 @@ Cloning a resource to another destination will create a new instance of that res
### 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](/builds/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.
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.
+15 -1
View File
@@ -29,12 +29,26 @@ You need to have a `Dataset` and an `API key` from Axiom.
More information [here](https://axiom.co/docs).
## New Relic
### 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.
+1 -1
View File
@@ -42,7 +42,7 @@ If there are healthchecks both in the UI and in the Dockerfile defined and enabl
### Service Stacks
Services or Applications that use the [Docker Compose Build Pack](/builds/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.
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.
::: tip When to use health checks?
It is recommended to enable health checks for all your resources. This way, you can ensure that only healthy resources are receiving traffic.
@@ -17,7 +17,7 @@ You can easily use Traefik to loadbalance an application between:
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 are 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.
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
+54 -19
View File
@@ -1,32 +1,67 @@
---
title: "Build Server"
description: "Offload Docker image builds to dedicated build servers with Coolify to separate build loads from production deployments and improve performance."
title: Build Server
description: Set up a build server in Coolify to separate your build process from deployment, reduce load, and improve performance.
---
# Build Server
You could have a build server to build your projects on instead of building them on the server where you host your resources.
<ZoomableImage src="/docs/images/builds/servers/banner.webp" alt="Coolify banner" />
<br />
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.
This keeps the load separated, so it does not affect your application's performance.
## Requirements
Before you set up a build server, make sure that:
- The built images needs to be pushed to a container registry.
- The server needs to be authenticated to the container registry. See [this](/knowledge-base/docker/registry) for more information.
- The server needs to have access to the source code.
- The server needs Docker Engine installed.
- The server should be the same architecture as the deployment servers.
- 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 more than one build server, the used server will be chosen randomly.
::: success Tip:
If you have multiple build servers, Coolify will select one at random.
:::
## How to use
1. Add a new server to Coolify.
2. Enable the `Build Server` feature while creating a new resource.
## How to Use a Build Server
To start using a build server with Coolify, follow these steps:
After this, Coolify will use this server to build your resources, in case you enabled the `Build Server` feature for them.
1. **Add a New Server to Coolify:**
In your Coolify dashboard, go to the servers page and click the **+ Add** button.
## How to set a build server for a resource
<ZoomableImage src="/docs/images/builds/servers/1.webp" alt="Coolify dashboard screenshot" />
1. Create or go to a resource that you want to use a build server for.
2. Enable the `Build Server` feature on the `General` tab, `Build` section.
3. Make sure you set up a container registry for the resource.
- 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.
<ZoomableImage src="/docs/images/builds/servers/2.webp" alt="Coolify dashboard screenshot" />
- If you have already connected your server, enable the Build Server feature as shown in the image below.
<ZoomableImage src="/docs/images/builds/servers/3.webp" alt="Coolify dashboard screenshot" />
::: warning HEADS UP!
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.
<ZoomableImage src="/docs/images/builds/servers/3.webp" alt="Coolify dashboard screenshot" />
:::
## 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.
<ZoomableImage src="/docs/images/builds/servers/4.webp" alt="Coolify dashboard screenshot" />
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.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 795 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

+4 -1
View File
@@ -63,6 +63,7 @@ Complete directory of all one-click services available in Coolify, organized by
## Backup
- [Duplicati](/services/duplicati) - A free backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers
- [Postgresus](/services/postgresus) - A free, open source and self-hosted tool to backup PostgreSQL. Make backups with different storages and notifications about progress.
## Bookmarks
@@ -162,6 +163,7 @@ Complete directory of all one-click services available in Coolify, organized by
- [Nitropage](/services/nitropage) - Nitropage is an extensible, drag-and-drop website builder based on SolidStart, completely free and open source
- [OneDev](/services/onedev) - Self-hosted Git server with integrated CI/CD and kanban
- [Openblocks](/services/openblocks) - Open-source low code platform
- [pgAdmin](/services/pgadmin) - Web-based database management tool for PostgreSQL
- [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
@@ -169,6 +171,7 @@ Complete directory of all one-click services available in Coolify, organized by
- [Proxyscotch](/services/proxyscotch) - Tiny open-source CORS proxy made by Hoppscotch
- [PrivateBin](/services/privatebin) - Minimalist, open-source online pastebin
- [RabbitMQ](/services/rabbitmq) - Open source message broker
- [Redis Insight](/services/redis-insight) - Official Redis GUI for database interaction
- [Rivet Engine](/services/rivet-engine) - Backend engine for building and scaling stateful workloads with long-lived processes and durable state
- [Shlink](/services/shlink) - The open source URL shortener
- [Soketi](/services/soketi) - Open-source WebSocket server
@@ -231,7 +234,7 @@ Complete directory of all one-click services available in Coolify, organized by
- [FoundryVTT](/services/foundryvtt) - Virtual tabletop for tabletop role-playing games
- [Minecraft](/services/minecraft) - Minecraft game server
- [Wings](/services/wings) - Pterodactyl server control plane for game servers
- [Pterodactyl](/services/pterodactyl) - Game server management panel with Wings daemon for hosting Minecraft, CS:GO, ARK and more
## Health
+1 -4
View File
@@ -14,10 +14,7 @@ Lightweight server monitoring hub with historical data, docker stats, and alerts
- Deploy Beszel using Coolify template
- In the UI, `Add a new System`
- Enter `beszel-agent` in Host/IP
- Copy the key from the modal in the `KEY` environnement variable in Beszel's docker-compose env section (Edit Docker Compose button of Beszel service in Coolify UI)
<ZoomableImage src="/docs/images/services/beszel_doc_1.webp" alt="Beszel dashboard" />
<ZoomableImage src="/docs/images/services/beszel_doc_2.webp" alt="Beszel dashboard" />
- Copy the public Key to `KEY` env variable and token to `TOKEN` variable in Beszel's project environment variables (These are obtained from Beszel UI when adding a new system)
## Links
+1 -1
View File
@@ -14,7 +14,7 @@ Filebrowser provides a file managing interface within a specified directory and
- Deploy Filebrowser using Coolify template
- In the Filebrowser UI login with credentials:
- Username: `admin`
- Password: `admin`
- Password: randomly generated, viewable in the logs
## Screenshots
+3 -1
View File
@@ -7,7 +7,9 @@ description: "Manage household on Coolify with Grocy for grocery inventory, reci
## What is Grocy?
Grocy is a web-based self-hosted groceries & household management solution for your home
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
+23 -7
View File
@@ -2,19 +2,35 @@
description: Deploy 200+ pre-configured open-source applications instantly with Coolify's one-click services, from development tools to databases.
---
# What are One-Click Services?
# Services
Coolify's One-Click Services are a curated collection of popular open-source applications and tools that you can deploy instantly with just a few clicks. These services eliminate the complexity of manual setup and configuration, making self-hosting accessible to everyone.
## What are Services?
## How They Work
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.
One-Click Services are essentially **pre-configured Docker Compose files** that have been:
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
#### What's Included
Our service library includes a wide variety of applications developed by the open-source community:
@@ -26,7 +42,7 @@ Our service library includes a wide variety of applications developed by the ope
- **Communication**: Chat platforms, email servers, forums
- **And many more...**
## Key Benefits
#### Key Benefits
- **Instant Deployment**: No need to write Docker Compose files from scratch
- **Automatic Updates**: Services can be updated with a single click
@@ -34,7 +50,7 @@ Our service library includes a wide variety of applications developed by the ope
- **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
#### Contributing New Services
Want to add a service to Coolify's library? We welcome contributions from the community!
+8 -3
View File
@@ -3,15 +3,20 @@ title: "MinIO"
description: "Host MinIO object storage on Coolify as S3-compatible high-performance storage for backups, data lakes, and cloud-native application storage."
---
![MinIO](https://github.com/minio.png)
# MinIO Community Edition
![MinIO](/images/services/minio-logo.svg)
## What is MinIO?
MinIO is a high-performance, distributed object storage system. It is software-defined, runs on industry-standard hardware, and is 100% open source under the AGPL v3.0 license.
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/)
- [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
+8 -2
View File
@@ -7,8 +7,14 @@ description: "Run Nexus Repository on Coolify for artifact management, Docker re
## What is Sonatype Nexus
Sonatype Nexus is a repository manager that allows you to store, manage, and distribute your software artifacts.
The official container is for x86_64 architecture. The arm64 version is community maintained and synced with the official repository.
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
+18
View File
@@ -0,0 +1,18 @@
---
title: "pgAdmin"
description: "Here you can find the documentation for hosting pgAdmin with Coolify."
---
# pgAdmin
<ZoomableImage src="/docs/images/services/pgadmin-logo.svg" />
## 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)
+19
View File
@@ -0,0 +1,19 @@
---
title: "Postgresus"
description: "Postgresus is a free, open source and self-hosted tool to backup PostgreSQL. Make backups with different storages and notifications about progress."
---
<ZoomableImage src="/docs/images/services/postgresus-logo.webp" />
## What is Postgresus?
Postgresus is a free, open source and self-hosted tool to backup PostgreSQL. Make backups with different storages and notifications about progress.
## Screenshots
<ZoomableImage src="/docs/images/services/postgresus-screenshot.svg" />
## Links
- [The official website](https://postgresus.com/?utm_source=coolify.io)
- [GitHub](https://github.com/RostislavDugin/postgresus?utm_source=coolify.io)
+117 -2
View File
@@ -9,10 +9,118 @@ description: "Host game servers on Coolify with Pterodactyl panel for Minecraft,
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.
Stop settling for less. Make game servers a first-class citizen on your platform.
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`)
<ZoomableImage src="/docs/images/services/pterodactly-with-wings1.png" alt="Example node setup" />
6. Navigate to the configuration tab of your node and **save the configuration** to a safe location.
<ZoomableImage src="/docs/images/services/pterodactly-with-wings2.png" alt="Example configuration file" />
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 35 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
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-1.webp" alt="Pterodactyl interface screenshot" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-2.webp" alt="Pterodactyl interface screenshot" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-3.webp" alt="Pterodactyl interface screenshot" />
@@ -20,9 +128,16 @@ Stop settling for less. Make game servers a first-class citizen on your platform
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-5.webp" alt="Pterodactyl interface screenshot" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-6.webp" alt="Pterodactyl interface screenshot" />
### Wings Node Management
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-7.webp" alt="Wings node management in Panel" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-8.webp" alt="Wings node configuration" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-9.webp" alt="Wings node status" />
## Links
- [The official website](https://pterodactyl.io)
- [GitHub](https://github.com/pterodactyl/panel)
- [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)
+18
View File
@@ -0,0 +1,18 @@
---
title: "Redis Insight"
description: "Here you can find the documentation for hosting Redis Insight with Coolify."
---
# Redis Insight
<ZoomableImage src="/docs/images/services/redisinsight-logo.png" />
## 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.
## 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)
-60
View File
@@ -1,60 +0,0 @@
---
title: "Pterodactyl Wings"
description: "Host Pterodactyl Wings on Coolify for game server daemon, Docker container management, and distributed server node functionality."
---
<ZoomableImage src="/docs/images/services/pterodactyl_logo_transparent.png" alt="Pterodactyl_Logo_Transparent logo" />
## What is Wings?
Wings is the server-side component of the Pterodactyl® ecosystem, written in Go. It runs on each physical or virtual machine (node)
and handles the creation, management, and monitoring of game server instances.
It communicates securely with the Pterodactyl Panel via its API, pulling server configurations and sending back live statistics, logs, and event updates.
Each server runs in an isolated Docker container to ensure security and stability.
Key features include:
- **Lightweight and efficient** Go-based daemon
- **Automatic server provisioning** from panel settings
- **Docker-based isolation** for security
- **Real-time console streaming**
- **Resource usage tracking** (CPU, RAM, disk, network)
- **Support for scheduled tasks and backups**
## Installation on Coolify
When installing **Wings** 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.
- Youll 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.
## Screenshots
_(Wings itself runs in the background and doesn't have a UI, so these are typically viewed via the Panel.)_
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-7.webp" alt="Wings interface screenshot" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-8.webp" alt="Wings interface screenshot" />
<ZoomableImage src="/docs/images/services/pterodactyl-screenshot-9.webp" alt="Wings interface screenshot" />
@@ -179,6 +179,56 @@ Make sure the protocol in your domain configuration matches how you want to acce
Ensure that `Rolling Updates` are correctly configured. See [Rolling Updates documentation](/knowledge-base/rolling-updates)
### Solution 5: Update Traefik to Fix Docker API Version Issue
**Symptoms:**
- "No Available Server" error appears
- Coolify proxy logs shows the following error message:
```py
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.
::: info
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:**
Coolify won't automatically update Traefik for existing servers.
::: warning Why Coolify don't auto-update for existing servers
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.
:::
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`
<ZoomableImage src="/docs/images/troubleshoot/applications/bad-gateway/no-available-server/update-traefik-version.webp" alt="coolify proxy traefik version update" />
**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 Coolifys so youll 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.
## Advanced Debugging
### Check Traefik Configuration
@@ -55,6 +55,25 @@ If the dashboard isnt accessible via the IP address, then follow these steps:
_(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:
+23 -9
View File
@@ -98,7 +98,6 @@ location = /knowledge-base/common-issues/cloudflare { return 301 /docs/get-start
location = /knowledge-base/proxy/traefik/healthchecks { return 301 /docs/knowledge-base/health-checks; }
location = /services/superset { return 301 /docs/services/apache-superset; }
# Redirects for Integration Restructure
# clouflare
location = /knowledge-base/cloudflare/tunnels/overview { return 301 /docs/integrations/cloudflare/tunnels/overview; }
@@ -107,13 +106,28 @@ location = /knowledge-base/cloudflare/tunnels/single-resource { return 301 /docs
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; }
# webstudio
location = /integrations/webstudio { return 301 /docs/knowledge-base/how-to/webstudio-with-hetzner; }
# git
location = /knowledge-base/git/github/manually-setup-github-app { return 301 /docs/git/changeme; }
location = /knowledge-base/git/github/move-between-github-apps { return 301 /docs/git/changeme; }
location = /knowledge-base/git/github/integration { return 301 /docs/git/changeme; }
location = /knowledge-base/git/github/github-actions { return 301 /docs/git/changeme; }
location = /knowledge-base/git/gitlab/integration { return 301 /docs/git/changeme; }
location = /knowledge-base/git/bitbucket/integration { return 301 /docs/git/changeme; }
location = /knowledge-base/git/gitea/integration { return 301 /docs/git/changeme; }
# Redirects for Builds -> Applications/Build Packs
location = /builds/introduction { return 301 /docs/applications/; }
location = /builds/packs/overview { return 301 /docs/applications/build-packs/overview; }
location = /builds/packs/static { return 301 /docs/applications/build-packs/static; }
location = /builds/packs/nixpacks { return 301 /docs/applications/build-packs/nixpacks; }
location = /builds/packs/dockerfile { return 301 /docs/applications/build-packs/dockerfile; }
location = /builds/packs/docker-compose { return 301 /docs/applications/build-packs/docker-compose; }
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/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; }
+1 -1
View File
@@ -34,7 +34,7 @@
"transform-openapi": "tsx scripts/convert-openapi.ts"
},
"dependencies": {
"@korrektly/sdk": "^0.1.1",
"@korrektly/sdk": "^0.1.4",
"@vueuse/core": "12.5.0",
"globe.gl": "2.39.7",
"vitepress-openapi": "0.0.3-alpha.78"