diff --git a/bun.lockb b/bun.lockb
index aee2f02fb..7947a0f4d 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts
index eb2835f4a..6bf217dfc 100644
--- a/docs/.vitepress/config.mts
+++ b/docs/.vitepress/config.mts
@@ -214,7 +214,56 @@ export default defineConfig({
text: 'Integrations',
collapsed: true,
items: [
- { text: 'Webstudio', link: '/integrations/webstudio.md' },
+ {
+ text: 'Cloudflare',
+ collapsed: true,
+ items: [
+ {
+ text: 'Tunnels',
+ collapsed: true,
+ items: [
+ { text: 'Overview', link: '/integrations/cloudflare/tunnels/overview' },
+ { text: 'All Resources', link: '/integrations/cloudflare/tunnels/all-resource' },
+ { text: 'Single Resource', link: '/integrations/cloudflare/tunnels/single-resource' },
+ { text: 'Server SSH Access', link: '/integrations/cloudflare/tunnels/server-ssh' },
+ { text: 'Full TLS/HTTPS', link: '/integrations/cloudflare/tunnels/full-tls' },
+ ]
+ },
+ { text: 'DDoS Protection', link: '/integrations/cloudflare/ddos-protection' },
+ ]
+ },
+ {
+ text: 'Git',
+ collapsed: true,
+ items: [
+ {
+ text: 'Github', collapsed: true, items: [
+ { text: 'Overview', link: '/integrations/git/github/overview' },
+ { text: 'Actions', link: '/integrations/git/github/actions' },
+ { text: 'Auto Deploy', link: '/integrations/git/github/auto-deploy' },
+ { text: 'Deploy Public Repository', link: '/integrations/git/github/public-repository' },
+ { text: 'Setup Deploy Key', link: '/integrations/git/github/deploy-key' },
+ { text: 'Setup Github App', link: '/integrations/git/github/setup-app' },
+ { text: 'Switch Github Apps', link: '/integrations/git/github/switch-apps' },
+ ]
+ },
+ {
+ text: 'Gitlab', collapsed: true, items: [
+ { text: 'Integrations', link: '/integrations/git/gitlab/integration' },
+ ]
+ },
+ {
+ text: 'Bitbucket', collapsed: true, items: [
+ { text: 'Integrations', link: '/integrations/git/bitbucket/integration' },
+ ]
+ },
+ {
+ text: 'Gitea', collapsed: true, items: [
+ { text: 'Integrations', link: '/integrations/git/gitea/integration' },
+ ]
+ },
+ ]
+ },
],
},
{
@@ -295,35 +344,7 @@ export default defineConfig({
{ text: 'Raspberry Pi OS Setup', link: '/knowledge-base/how-to/raspberry-pi-os' },
{ text: 'Private NPM Registry', link: '/knowledge-base/how-to/private-npm-registry' },
{ text: 'Ollama with GPU', link: '/knowledge-base/how-to/ollama-with-gpu' },
- ]
- },
- {
- text: 'Git',
- collapsed: true,
- items: [
- {
- text: 'Github', collapsed: true, items: [
- { text: 'Manually Setup GitHub App', link: '/knowledge-base/git/github/manually-setup-github-app' },
- { text: 'Move Between GitHub Apps', link: '/knowledge-base/git/github/move-between-github-apps' },
- { text: 'Integrations', link: '/knowledge-base/git/github/integration' },
- { text: 'Github Actions', link: '/knowledge-base/git/github/github-actions' },
- ]
- },
- {
- text: 'Gitlab', collapsed: true, items: [
- { text: 'Integrations', link: '/knowledge-base/git/gitlab/integration' },
- ]
- },
- {
- text: 'Bitbucket', collapsed: true, items: [
- { text: 'Integrations', link: '/knowledge-base/git/bitbucket/integration' },
- ]
- },
- {
- text: 'Gitea', collapsed: true, items: [
- { text: 'Integrations', link: '/knowledge-base/git/gitea/integration' },
- ]
- },
+ { text: 'Webstudio with Hetzner', link: '/knowledge-base/how-to/webstudio-with-hetzner' },
]
},
{
@@ -363,24 +384,6 @@ export default defineConfig({
{ text: 'Swarm', link: '/knowledge-base/docker/swarm' },
]
},
- {
- text: 'Cloudflare',
- collapsed: true,
- items: [
- {
- text: 'Tunnels',
- collapsed: true,
- items: [
- { text: 'Overview', link: '/knowledge-base/cloudflare/tunnels/overview' },
- { text: 'All Resources', link: '/knowledge-base/cloudflare/tunnels/all-resource' },
- { text: 'Single Resource', link: '/knowledge-base/cloudflare/tunnels/single-resource' },
- { text: 'Server SSH Access', link: '/knowledge-base/cloudflare/tunnels/server-ssh' },
- { text: 'Full TLS/HTTPS', link: '/knowledge-base/cloudflare/tunnels/full-tls' },
- ]
- },
- { text: 'Origin Certificate', link: '/knowledge-base/cloudflare/origin-cert' },
- ]
- },
{
text: 'Proxy',
collapsed: true,
diff --git a/docs/.vitepress/theme/components/Services/List.vue b/docs/.vitepress/theme/components/Services/List.vue
index 4b0db5e8e..e7edbe063 100644
--- a/docs/.vitepress/theme/components/Services/List.vue
+++ b/docs/.vitepress/theme/components/Services/List.vue
@@ -1855,7 +1855,8 @@ const services = [
icon: '/public/images/services/metamcp.png',
description: 'MCP Aggregator, Orchestrator, Middleware, Gateway in one application.',
category: 'AI'
- }
+ },
+ {
name: 'CodiMD',
slug: 'codimd',
icon: '/docs/images/services/codimd-logo.png',
diff --git a/docs/integrations/cloudflare/ddos-protection.md b/docs/integrations/cloudflare/ddos-protection.md
new file mode 100644
index 000000000..16e6e7785
--- /dev/null
+++ b/docs/integrations/cloudflare/ddos-protection.md
@@ -0,0 +1,262 @@
+---
+title: Cloudflare DDoS Protection
+description: Coolify is a deployment tool designed to simplify the process of deploying and managing applications.
+---
+
+# 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).
+
+---
+
+::: info Example Data
+ 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.
+
+::: warning HEADS UP!
+ - **`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:
+```sh
+ssh shadowarcanist@203.0.113.1
+```
+
+Once logged in, navigate to the Coolify proxy directory:
+```sh
+$ cd /data/coolify/proxy
+```
+
+Check if you have a **certs** folder:
+```sh
+$ ls
+> acme.json docker-compose.yml dynamic
+```
+
+If there’s no **certs** folder, create it:
+```sh
+$ mkdir certs
+```
+
+Verify it was created:
+```sh
+$ ls
+> acme.json certs docker-compose.yml dynamic
+```
+
+Now, navigate into the **certs** directory:
+```sh
+$ cd certs
+```
+
+Create two new files for the certificate and private key:
+```sh
+$ touch shadowarcanist.cert shadowarcanist.key
+```
+
+Verify the files were created:
+```sh
+$ ls
+> shadowarcanist.cert shadowarcanist.key
+```
+
+Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard:
+```sh
+$ nano shadowarcanist.cert
+```
+Save and exit after pasting the certificate.
+
+Do the same for the **shadowarcanist.key** file and paste the private key:
+```sh
+$ 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.
+
+::: info
+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
+
+::: warning
+In this step, we're focusing on configuring Traefik (Coolify's proxy) to use the Origin Certificate.
+
+If you're using Caddy instead, please refer to their [official documentation ↗](https://caddyserver.com/docs/caddyfile/directives/tls).
+:::
+
+Now, in your Coolify dashboard:
+
+
+
+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.
+
+
+
+1. Choose a name for your configuration.
+2. Enter the following details in the configuration field:
+```sh
+tls:
+ certificates:
+ -
+ certFile: /traefik/certs/shadowarcanist.cert
+ keyFile: /traefik/certs/shadowarcanist.key
+```
+
+:::details Adding Multiple Certificates (click to view)
+
+```sh
+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
+```
+:::
+
+3. Save the configuration
+
+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.
+
+::: danger HEADS UP!!
+**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/docs/knowledge-base/cloudflare/tunnels/all-resource.md b/docs/integrations/cloudflare/tunnels/all-resource.md
similarity index 76%
rename from docs/knowledge-base/cloudflare/tunnels/all-resource.md
rename to docs/integrations/cloudflare/tunnels/all-resource.md
index c8b8aa54c..9c0b21876 100644
--- a/docs/knowledge-base/cloudflare/tunnels/all-resource.md
+++ b/docs/integrations/cloudflare/tunnels/all-resource.md
@@ -32,7 +32,7 @@ To follow this guide, you'll need:
A simple high-level overview diagram to give you a visual idea of how this works:
-
+
---
@@ -60,7 +60,7 @@ The following data is used as an example in this guide. Please replace it with y
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**
@@ -68,25 +68,25 @@ To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to
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.
@@ -99,13 +99,13 @@ Then, you will be prompted to add a hostname.
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** as the encryption mode.
@@ -113,15 +113,15 @@ Choose **Full** as the encryption mode.
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)
@@ -129,7 +129,7 @@ Go to the **Environment Variables** page, enter your tunnel token, and deploy th
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.
@@ -144,7 +144,7 @@ To start the Coolify proxy, follow these steps:
Enter the domain you want to use for your resource/app and deploy your resource.
-
+
::: warning HEADS UP!
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.
@@ -158,7 +158,7 @@ If your app requires **HTTPS** for features like cookies or login, follow the [F
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
@@ -168,11 +168,11 @@ However, if a DNS record for the hostname already exists, Cloudflare won’t cre
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:
diff --git a/docs/knowledge-base/cloudflare/tunnels/full-tls.md b/docs/integrations/cloudflare/tunnels/full-tls.md
similarity index 84%
rename from docs/knowledge-base/cloudflare/tunnels/full-tls.md
rename to docs/integrations/cloudflare/tunnels/full-tls.md
index 2d6808d5d..e3be8405c 100644
--- a/docs/knowledge-base/cloudflare/tunnels/full-tls.md
+++ b/docs/integrations/cloudflare/tunnels/full-tls.md
@@ -56,7 +56,7 @@ The following data is used as an example in this guide. Please replace it with y
To create your Cloudflare Origin Certificate, follow these steps:
-
+
1. In your Cloudflare dashboard, go to **SSL/TLS**.
2. Select **Origin Server**.
@@ -64,7 +64,7 @@ To create your Cloudflare Origin Certificate, follow these steps:
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.
@@ -85,7 +85,7 @@ To cover multiple levels, you'll need to purchase the [Advanced Certificate Mana
Your certificate will now be generated.
-
+
1. Choose **PEM** as the key format.
2. Copy your **Certificate**.
@@ -168,7 +168,7 @@ Now the origin certificate is installed on your server.
Now, in your Coolify dashboard:
-
+
1. Go to the **Server** section in the sidebar.
2. Select **Proxy**.
@@ -177,7 +177,7 @@ Now, in your Coolify dashboard:
You will now be prompted to enter the Dynamic Configuration.
-
+
1. Choose a name for your configuration.
2. Enter the following details in the configuration field:
@@ -212,13 +212,13 @@ From now on, Coolify will use the origin certificate for requests matching the h
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.
@@ -226,19 +226,19 @@ Choose **Full (Strict)** as the encryption mode.
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**.
@@ -247,7 +247,7 @@ Next, update the hostnames as follows:
## 6. Configure Cloudflare to Always Use HTTPS
-
+
1. In the Cloudflare dashboard, go to **SSL/TLS**.
2. Select **Edge Certificates**.
@@ -257,10 +257,10 @@ Next, update the hostnames as follows:
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/docs/knowledge-base/cloudflare/tunnels/overview.md b/docs/integrations/cloudflare/tunnels/overview.md
similarity index 100%
rename from docs/knowledge-base/cloudflare/tunnels/overview.md
rename to docs/integrations/cloudflare/tunnels/overview.md
diff --git a/docs/knowledge-base/cloudflare/tunnels/server-ssh.md b/docs/integrations/cloudflare/tunnels/server-ssh.md
similarity index 77%
rename from docs/knowledge-base/cloudflare/tunnels/server-ssh.md
rename to docs/integrations/cloudflare/tunnels/server-ssh.md
index ee050ef27..83f975acf 100644
--- a/docs/knowledge-base/cloudflare/tunnels/server-ssh.md
+++ b/docs/integrations/cloudflare/tunnels/server-ssh.md
@@ -27,7 +27,7 @@ This setup is ideal for people who:
A simple high-level overview diagram to give you a visual idea of how this works:
-
+
---
@@ -76,14 +76,14 @@ The following data is used as an example in this guide. Please replace it with y
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.
@@ -106,14 +106,14 @@ Once logged in, add your public key to the authorized keys file:
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.
@@ -127,19 +127,19 @@ You will be prompted to enter details about your server. Make sure the informati
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**
@@ -147,25 +147,25 @@ To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to
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.
@@ -178,7 +178,7 @@ Then, you will be prompted to add a hostname. This is where we expose our SSH tu
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)
@@ -187,7 +187,7 @@ Go to the **Servers** page and select the server you want to connect. This is th
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))
@@ -197,11 +197,11 @@ Coolify will now install **cloudflared** on the server and set everything up aut
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.
@@ -244,14 +244,14 @@ The following data is used as an example in this guide. Please replace it with y
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.
@@ -276,7 +276,7 @@ Once logged in, add your public key to the authorized keys file:
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**
@@ -284,25 +284,25 @@ To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to
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.
@@ -315,14 +315,14 @@ Then, you will be prompted to add a hostname. This is where we expose our SSH tu
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.
@@ -336,19 +336,19 @@ You will be prompted to enter details about your server. Make sure the informati
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.
@@ -357,6 +357,6 @@ Go to the **Servers** page and select the server (which we added in the previous
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/docs/knowledge-base/cloudflare/tunnels/single-resource.md b/docs/integrations/cloudflare/tunnels/single-resource.md
similarity index 82%
rename from docs/knowledge-base/cloudflare/tunnels/single-resource.md
rename to docs/integrations/cloudflare/tunnels/single-resource.md
index 843f55f93..331aa53b6 100644
--- a/docs/knowledge-base/cloudflare/tunnels/single-resource.md
+++ b/docs/integrations/cloudflare/tunnels/single-resource.md
@@ -33,7 +33,7 @@ To follow this guide, you'll need:
A simple high-level overview diagram to give you a visual idea of how this works:
-
+
---
@@ -61,7 +61,7 @@ The following data is used as an example in this guide. Please replace it with y
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).
@@ -72,7 +72,7 @@ To setup your app for tunneling, follow these steps:
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**
@@ -80,25 +80,25 @@ To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to
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.
@@ -111,15 +111,15 @@ Then, you will be prompted to add a hostname.
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)
@@ -142,7 +142,7 @@ Tunneling multiple single resources is straightforward, but tunneling Coolify it
If you want to expose different apps individually, you can follow our [Tunnel All Resources](/knowledge-base/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).
@@ -157,7 +157,7 @@ Tunneling Coolify itself to make it accessible over a domain requires a bit more
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**:
@@ -222,11 +222,11 @@ However, if a DNS record for the hostname already exists, Cloudflare won’t cre
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:
diff --git a/docs/knowledge-base/git/bitbucket/integration.md b/docs/integrations/git/bitbucket/integration.md
similarity index 100%
rename from docs/knowledge-base/git/bitbucket/integration.md
rename to docs/integrations/git/bitbucket/integration.md
diff --git a/docs/knowledge-base/git/gitea/integration.md b/docs/integrations/git/gitea/integration.md
similarity index 100%
rename from docs/knowledge-base/git/gitea/integration.md
rename to docs/integrations/git/gitea/integration.md
diff --git a/docs/knowledge-base/git/github/github-actions.md b/docs/integrations/git/github/actions.md
similarity index 100%
rename from docs/knowledge-base/git/github/github-actions.md
rename to docs/integrations/git/github/actions.md
diff --git a/docs/knowledge-base/git/github/manually-setup-github-app.md b/docs/integrations/git/github/auto-deploy.md
similarity index 100%
rename from docs/knowledge-base/git/github/manually-setup-github-app.md
rename to docs/integrations/git/github/auto-deploy.md
diff --git a/docs/integrations/git/github/deploy-key.md b/docs/integrations/git/github/deploy-key.md
new file mode 100644
index 000000000..feb8a6051
--- /dev/null
+++ b/docs/integrations/git/github/deploy-key.md
@@ -0,0 +1,129 @@
+---
+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.
+
+---
+
+::: info Example Data
+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.
+
+::: success TIP
+You can also generate a key externally using the `ssh-keygen` command and paste the private key into Coolify:
+
+```sh
+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.
+
+::: info TIP
+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
+::: warning HEADS UP!
+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 [builds](/builds/introduction) for more details.)
+
+Once configured, deploy your application.
+
+That's it!
+
diff --git a/docs/integrations/git/github/overview.md b/docs/integrations/git/github/overview.md
new file mode 100644
index 000000000..ab3cc867a
--- /dev/null
+++ b/docs/integrations/git/github/overview.md
@@ -0,0 +1,21 @@
+---
+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:
+
+1. [Public Repository](/integrations/git/github/public-repository) - Deploy applications directly using the URL of a public repository.
+2. [Private Repository using GitHub App]() - Install the GitHub App on your personal account or organization to deploy both private and public repositories.
+3. [Private Repository using Deploy Key]() - Deploy applications from private repositories using a deploy key.
+4. [Automatic Deployments on New Commits]() - Automatically deploy new versions of your application when commits are pushed to a specific branch in your GitHub repository.
+5. [Build and Deploy Using 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.
+6. [Pull Request Deployments]() - Automatically deploy new versions of your application based on pull requests.
\ No newline at end of file
diff --git a/docs/integrations/git/github/public-repository.md b/docs/integrations/git/github/public-repository.md
new file mode 100644
index 000000000..c0e2e7e17
--- /dev/null
+++ b/docs/integrations/git/github/public-repository.md
@@ -0,0 +1,53 @@
+---
+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
+::: warning HEADS UP!
+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.
+
+::: success Tip
+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](/builds/introduction) for more details.)
+
+
+Once configured, deploy your application.
+
+That's it!
\ No newline at end of file
diff --git a/docs/integrations/git/github/setup-app.md b/docs/integrations/git/github/setup-app.md
new file mode 100644
index 000000000..67f83127b
--- /dev/null
+++ b/docs/integrations/git/github/setup-app.md
@@ -0,0 +1,112 @@
+---
+title: "Setup GitHub App"
+description: ""
+---
+
+# GitHub App
+Github app allows you to grant access to a single or mulitple 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]() (Recommended)
+- [Manual Installation]()
+We highly recommend the Automated Installation method as it automates the process and reduces the chance of errors.
+
+
+::: info Example Data
+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
+
+::: info
+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.
+ ::: warning
+ 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 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
+::: warning HEADS UP!
+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](/builds/introduction) for more details.)
+
+Once configured, deploy your application.
+
+That's it!
\ No newline at end of file
diff --git a/docs/knowledge-base/git/github/move-between-github-apps.md b/docs/integrations/git/github/switch-apps.md
similarity index 85%
rename from docs/knowledge-base/git/github/move-between-github-apps.md
rename to docs/integrations/git/github/switch-apps.md
index 872d3d454..299ee78fc 100644
--- a/docs/knowledge-base/git/github/move-between-github-apps.md
+++ b/docs/integrations/git/github/switch-apps.md
@@ -1,6 +1,5 @@
---
-title: "Move Between GitHub Apps"
-description: "Migrate Coolify repositories between GitHub Apps when moving to new organizations with Git source updates and repository reconfiguration."
+title: "Switch GitHub Apps"
---
# Move Between GitHub Apps
diff --git a/docs/knowledge-base/git/gitlab/integration.md b/docs/integrations/git/gitlab/integration.md
similarity index 100%
rename from docs/knowledge-base/git/gitlab/integration.md
rename to docs/integrations/git/gitlab/integration.md
diff --git a/docs/knowledge-base/git/github/integration.md b/docs/knowledge-base/git/github/integration.md
deleted file mode 100644
index 2e0e28642..000000000
--- a/docs/knowledge-base/git/github/integration.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-title: "Integration"
-description: "Deploy public and private GitHub repositories with Coolify using GitHub App integration, deploy keys, or automated webhooks for commits and pull requests."
----
-
-# Github Integration
-This guide will show you how to use GitHub 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://github.com/coollabsio/coolify-examples`
-
-::: 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
-
-### With GitHub App (Recommended)
-
-You can use private repositories with the GitHub App integration. You will get full integration with GitHub, like automatic commit deployments and pull request deployments.
-
-1. Create a new GitHub App in the `Sources` view.
-2. Create a new resource and select the `Private Repository (with GitHub App)`.
-3. Choose your repository from the list.
-4. That's it!
-
-:::warning Note for Coolify Cloud Users
-You can make the GitHub App available to all teams on your Coolify instance by enabling the `System Wide` option.
-
-However, this feature is only available for self-hosted instances, as Coolify Cloud users cannot use the `System Wide` option due to how Coolify Cloud is set up.
-:::
-
-### With Deploy Keys
-
-1. Add a private key (aka `Deploy Keys`) to Coolify and to your GitHub repository in the `Settings` / `Deploy Keys` menu.
-
-::: warning Caution
- - 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@github.com:coollabsio/coolify-examples.git`
-
-::: warning Caution
-You need to use the SSH URL, so the one that starts with `git@`.
-:::
-
-4. That's it!
-
-## Automatic commit deployments with webhooks (Optional)
-
-You can add a custom webhook URL to your GitHub repository to trigger a new deployment when you push to your repository.
-
-::: warning Caution
-This can be set on either public or private repositories.
-
-Not required if you use GitHub App integration.
-:::
-
-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 GitHub repository.
-
-
-
-1. Set a secret key in the `GitHub Webhook Secret` input field.
-
-
-2. Go to your repository on GitHub 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, GitHub will send a webhook request to Coolify and it will trigger a new deployment.
-
-## Pull request deployments with webhooks (Optional)
-
-You can add a custom webhook URL to your GitHub repository to trigger a new deployment when you create a new merge request.
-
-::: warning Caution
-This can be set on either public or private repositories.
-
-Not required if you use GitHub App integration.
-:::
-
-The process is the same as the previous one, but you need to select the `Pull Request` events option in the `Settings` / `Webhooks` menu.
\ No newline at end of file
diff --git a/docs/integrations/webstudio.md b/docs/knowledge-base/how-to/webstudio-with-hetzner.md
similarity index 74%
rename from docs/integrations/webstudio.md
rename to docs/knowledge-base/how-to/webstudio-with-hetzner.md
index 81583a311..9673555c3 100644
--- a/docs/integrations/webstudio.md
+++ b/docs/knowledge-base/how-to/webstudio-with-hetzner.md
@@ -52,20 +52,21 @@ Skip to [Step 6](#_6-configure-your-project-on-coolify) if your server is alread
:::
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. **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.
@@ -78,43 +79,42 @@ If your server is already connected to Coolify, skip to the [next step](#_6-conf
:::
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.
-
+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
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/1.webp b/docs/public/images/integrations/cloudflare/ddos-protection/1.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/1.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/1.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/2.webp b/docs/public/images/integrations/cloudflare/ddos-protection/2.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/2.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/2.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/3.webp b/docs/public/images/integrations/cloudflare/ddos-protection/3.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/3.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/3.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/4.webp b/docs/public/images/integrations/cloudflare/ddos-protection/4.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/4.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/4.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/5.webp b/docs/public/images/integrations/cloudflare/ddos-protection/5.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/5.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/5.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/6.webp b/docs/public/images/integrations/cloudflare/ddos-protection/6.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/6.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/6.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/7.webp b/docs/public/images/integrations/cloudflare/ddos-protection/7.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/7.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/7.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/8.webp b/docs/public/images/integrations/cloudflare/ddos-protection/8.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/8.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/8.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/9.webp b/docs/public/images/integrations/cloudflare/ddos-protection/9.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/9.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/9.webp
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/header.webp b/docs/public/images/integrations/cloudflare/ddos-protection/origin-cert-illustration.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-origin-cert/header.webp
rename to docs/public/images/integrations/cloudflare/ddos-protection/origin-cert-illustration.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/1.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/1.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/1.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/1.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/10.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/10.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/10.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/10.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/11.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/11.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/11.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/11.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/12.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/12.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/12.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/12.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/13.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/13.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/13.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/13.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/14.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/14.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/14.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/14.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/15.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/15.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/15.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/15.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/16.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/16.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/16.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/16.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/2.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/2.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/2.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/2.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/3.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/3.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/3.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/3.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/4.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/4.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/4.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/4.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/5.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/5.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/5.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/5.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/6.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/6.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/6.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/6.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/7.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/7.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/7.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/7.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/8.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/8.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/8.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/8.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/9.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/9.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/9.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/9.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/all-resource/high-level-diagram.webp b/docs/public/images/integrations/cloudflare/tunnels/all-resource/high-level-diagram.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/all-resource/high-level-diagram.webp
rename to docs/public/images/integrations/cloudflare/tunnels/all-resource/high-level-diagram.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/1.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/1.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/1.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/1.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/10.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/10.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/10.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/10.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/11.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/11.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/11.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/11.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/12.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/12.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/12.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/12.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/13.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/13.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/13.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/13.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/2.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/2.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/2.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/2.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/3.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/3.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/3.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/3.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/4.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/4.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/4.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/4.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/5.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/5.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/5.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/5.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/6.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/6.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/6.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/6.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/7.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/7.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/7.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/7.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/8.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/8.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/8.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/8.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/full-tls/9.webp b/docs/public/images/integrations/cloudflare/tunnels/full-tls/9.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/full-tls/9.webp
rename to docs/public/images/integrations/cloudflare/tunnels/full-tls/9.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-1.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-1.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-1.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-1.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-10.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-10.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-10.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-10.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-11.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-11.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-11.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-11.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-12.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-12.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-12.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-12.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-13.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-13.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-13.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-13.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-14.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-14.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-14.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-14.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-15.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-15.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-15.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-15.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-16.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-16.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-16.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-16.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-2.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-2.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-2.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-2.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-3.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-3.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-3.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-3.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-4.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-4.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-4.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-4.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-5.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-5.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-5.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-5.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-6.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-6.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-6.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-6.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-7.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-7.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-7.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-7.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-8.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-8.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-8.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-8.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-9.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-9.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/automated-9.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/automated-9.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/high-level-diagram.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/high-level-diagram.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/high-level-diagram.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/high-level-diagram.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-1.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-1.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-1.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-1.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-10.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-10.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-10.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-10.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-11.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-11.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-11.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-11.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-12.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-12.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-12.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-12.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-13.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-13.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-13.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-13.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-14.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-14.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-14.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-14.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-2.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-2.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-2.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-2.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-3.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-3.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-3.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-3.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-4.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-4.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-4.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-4.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-5.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-5.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-5.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-5.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-6.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-6.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-6.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-6.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-7.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-7.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-7.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-7.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-8.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-8.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-8.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-8.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-9.webp b/docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-9.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/server-ssh/manual-9.webp
rename to docs/public/images/integrations/cloudflare/tunnels/server-ssh/manual-9.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/1.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/1.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/1.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/1.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/10.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/10.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/10.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/10.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/11.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/11.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/11.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/11.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/12.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/12.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/12.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/12.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/13.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/13.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/13.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/13.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/14.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/14.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/14.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/14.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/2.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/2.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/2.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/2.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/3.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/3.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/3.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/3.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/4.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/4.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/4.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/4.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/5.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/5.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/5.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/5.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/6.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/6.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/6.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/6.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/7.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/7.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/7.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/7.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/8.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/8.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/8.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/8.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/9.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/9.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/9.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/9.webp
diff --git a/docs/public/images/knowledge-base/cf-tunnel/single-resource/high-level-diagram.webp b/docs/public/images/integrations/cloudflare/tunnels/single-resource/high-level-diagram.webp
similarity index 100%
rename from docs/public/images/knowledge-base/cf-tunnel/single-resource/high-level-diagram.webp
rename to docs/public/images/integrations/cloudflare/tunnels/single-resource/high-level-diagram.webp
diff --git a/docs/public/images/integrations/git/github/deploy-key/1.webp b/docs/public/images/integrations/git/github/deploy-key/1.webp
new file mode 100644
index 000000000..1a89cf841
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/1.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/10.webp b/docs/public/images/integrations/git/github/deploy-key/10.webp
new file mode 100644
index 000000000..42176ba18
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/10.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/11.webp b/docs/public/images/integrations/git/github/deploy-key/11.webp
new file mode 100644
index 000000000..ce773aa24
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/11.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/12.webp b/docs/public/images/integrations/git/github/deploy-key/12.webp
new file mode 100644
index 000000000..0aa42942c
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/12.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/2-1.webp b/docs/public/images/integrations/git/github/deploy-key/2-1.webp
new file mode 100644
index 000000000..5ff3ec545
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/2-1.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/2.webp b/docs/public/images/integrations/git/github/deploy-key/2.webp
new file mode 100644
index 000000000..1c544a6a8
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/2.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/3.webp b/docs/public/images/integrations/git/github/deploy-key/3.webp
new file mode 100644
index 000000000..5ff3ec545
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/3.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/4.webp b/docs/public/images/integrations/git/github/deploy-key/4.webp
new file mode 100644
index 000000000..db7220c2d
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/4.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/5.webp b/docs/public/images/integrations/git/github/deploy-key/5.webp
new file mode 100644
index 000000000..65a35b9d9
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/5.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/6.webp b/docs/public/images/integrations/git/github/deploy-key/6.webp
new file mode 100644
index 000000000..b5b265fd2
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/6.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/7.webp b/docs/public/images/integrations/git/github/deploy-key/7.webp
new file mode 100644
index 000000000..e61c13f38
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/7.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/8.webp b/docs/public/images/integrations/git/github/deploy-key/8.webp
new file mode 100644
index 000000000..67621bb59
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/8.webp differ
diff --git a/docs/public/images/integrations/git/github/deploy-key/9.webp b/docs/public/images/integrations/git/github/deploy-key/9.webp
new file mode 100644
index 000000000..a7bd02529
Binary files /dev/null and b/docs/public/images/integrations/git/github/deploy-key/9.webp differ
diff --git a/docs/public/images/integrations/git/github/public-repository/1.webp b/docs/public/images/integrations/git/github/public-repository/1.webp
new file mode 100644
index 000000000..c84217e40
Binary files /dev/null and b/docs/public/images/integrations/git/github/public-repository/1.webp differ
diff --git a/docs/public/images/integrations/git/github/public-repository/2.webp b/docs/public/images/integrations/git/github/public-repository/2.webp
new file mode 100644
index 000000000..dc1eeec7a
Binary files /dev/null and b/docs/public/images/integrations/git/github/public-repository/2.webp differ
diff --git a/docs/public/images/integrations/git/github/public-repository/3.webp b/docs/public/images/integrations/git/github/public-repository/3.webp
new file mode 100644
index 000000000..8e67c3f45
Binary files /dev/null and b/docs/public/images/integrations/git/github/public-repository/3.webp differ
diff --git a/docs/public/images/integrations/git/github/public-repository/4.webp b/docs/public/images/integrations/git/github/public-repository/4.webp
new file mode 100644
index 000000000..d0528937d
Binary files /dev/null and b/docs/public/images/integrations/git/github/public-repository/4.webp differ
diff --git a/docs/public/images/integrations/git/github/public-repository/5.webp b/docs/public/images/integrations/git/github/public-repository/5.webp
new file mode 100644
index 000000000..fa8f0b40e
Binary files /dev/null and b/docs/public/images/integrations/git/github/public-repository/5.webp differ
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/10.webp b/docs/public/images/knowledge-base/cf-origin-cert/10.webp
deleted file mode 100644
index 14077314b..000000000
Binary files a/docs/public/images/knowledge-base/cf-origin-cert/10.webp and /dev/null differ
diff --git a/docs/public/images/knowledge-base/cf-origin-cert/11.webp b/docs/public/images/knowledge-base/cf-origin-cert/11.webp
deleted file mode 100644
index ef029789a..000000000
Binary files a/docs/public/images/knowledge-base/cf-origin-cert/11.webp and /dev/null differ
diff --git a/docs/public/images/resources/integrations/1.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/1.webp
similarity index 100%
rename from docs/public/images/resources/integrations/1.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/1.webp
diff --git a/docs/public/images/resources/integrations/10.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/10.webp
similarity index 100%
rename from docs/public/images/resources/integrations/10.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/10.webp
diff --git a/docs/public/images/resources/integrations/11.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/11.webp
similarity index 100%
rename from docs/public/images/resources/integrations/11.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/11.webp
diff --git a/docs/public/images/resources/integrations/12.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/12.webp
similarity index 100%
rename from docs/public/images/resources/integrations/12.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/12.webp
diff --git a/docs/public/images/resources/integrations/13.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/13.webp
similarity index 100%
rename from docs/public/images/resources/integrations/13.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/13.webp
diff --git a/docs/public/images/resources/integrations/14.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/14.webp
similarity index 100%
rename from docs/public/images/resources/integrations/14.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/14.webp
diff --git a/docs/public/images/resources/integrations/15.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/15.webp
similarity index 100%
rename from docs/public/images/resources/integrations/15.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/15.webp
diff --git a/docs/public/images/resources/integrations/16.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/16.webp
similarity index 100%
rename from docs/public/images/resources/integrations/16.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/16.webp
diff --git a/docs/public/images/resources/integrations/2.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/2.webp
similarity index 100%
rename from docs/public/images/resources/integrations/2.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/2.webp
diff --git a/docs/public/images/resources/integrations/3.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/3.webp
similarity index 100%
rename from docs/public/images/resources/integrations/3.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/3.webp
diff --git a/docs/public/images/resources/integrations/4.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/4.webp
similarity index 100%
rename from docs/public/images/resources/integrations/4.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/4.webp
diff --git a/docs/public/images/resources/integrations/5.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/5.webp
similarity index 100%
rename from docs/public/images/resources/integrations/5.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/5.webp
diff --git a/docs/public/images/resources/integrations/6.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/6.webp
similarity index 100%
rename from docs/public/images/resources/integrations/6.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/6.webp
diff --git a/docs/public/images/resources/integrations/7.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/7.webp
similarity index 100%
rename from docs/public/images/resources/integrations/7.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/7.webp
diff --git a/docs/public/images/resources/integrations/8.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/8.webp
similarity index 100%
rename from docs/public/images/resources/integrations/8.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/8.webp
diff --git a/docs/public/images/resources/integrations/9.webp b/docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/9.webp
similarity index 100%
rename from docs/public/images/resources/integrations/9.webp
rename to docs/public/images/knowledge-base/how-tos/webstudio-with-hetzner/9.webp
diff --git a/nginx/redirects.conf b/nginx/redirects.conf
index b26f379c3..21fa65753 100644
--- a/nginx/redirects.conf
+++ b/nginx/redirects.conf
@@ -97,3 +97,23 @@ location = /support { return 301 /docs/get-started/support; }
location = /knowledge-base/common-issues/cloudflare { return 301 /docs/get-started/support; }
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; }
+location = /knowledge-base/cloudflare/tunnels/all-resource { return 301 /docs/integrations/cloudflare/tunnels/all-resource; }
+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; }
+# 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; }