docs(integration): fully rewrite cloudflare tunnel guides to match updated UI of Cloudflare dashboard (#649)

This commit is contained in:
ShadowArcanist
2026-06-13 12:35:55 +05:30
committed by GitHub
106 changed files with 756 additions and 642 deletions
+69 -23
View File
@@ -5,33 +5,33 @@
"": {
"name": "coolify-docs",
"dependencies": {
"@orama/orama": "^3.1.18",
"@resvg/resvg-js": "^2.6.2",
"@orama/orama": "3.1.18",
"@resvg/resvg-js": "2.6.2",
"@tanstack/react-router": "1.168.10",
"@tanstack/react-start": "1.167.16",
"@tanstack/start-static-server-functions": "1.166.25",
"fumadocs-core": "16.8.5",
"fumadocs-mdx": "14.2.11",
"fumadocs-openapi": "^10.8.1",
"fumadocs-openapi": "10.8.1",
"fumadocs-ui": "16.8.5",
"gray-matter": "^4.0.3",
"lucide-react": "^1.7.0",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"shiki": "^4.0.2",
"tslib": "^2.8.1",
"vite": "^8.0.7",
"gray-matter": "4.0.3",
"lucide-react": "1.7.0",
"react": "19.2.4",
"react-dom": "19.2.4",
"shiki": "4.0.2",
"tslib": "2.8.1",
"vite": "8.0.7",
},
"devDependencies": {
"@tailwindcss/vite": "^4.2.1",
"@types/mdx": "^2.0.13",
"@tailwindcss/vite": "4.2.1",
"@types/mdx": "2.0.13",
"@types/node": "25.0.9",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^6.0.1",
"nitro": "^3.0.260311-beta",
"tailwindcss": "^4.2.1",
"typescript": "^6.0.2",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"@vitejs/plugin-react": "6.0.1",
"nitro": "3.0.260311-beta",
"tailwindcss": "4.2.1",
"typescript": "6.0.2",
},
},
},
@@ -688,7 +688,7 @@
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
"lucide-react": ["lucide-react@1.14.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA=="],
"lucide-react": ["lucide-react@1.7.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg=="],
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
@@ -850,9 +850,9 @@
"property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
"react": ["react@19.2.5", "", {}, "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA=="],
"react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
"react-dom": ["react-dom@19.2.5", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.5" } }, "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag=="],
"react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
"react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="],
@@ -960,7 +960,7 @@
"tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="],
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
"typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="],
"ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
@@ -1004,7 +1004,7 @@
"vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
"vite": ["vite@8.0.10", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.10", "rolldown": "1.0.0-rc.17", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw=="],
"vite": ["vite@8.0.7", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.13", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw=="],
"vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
@@ -1074,6 +1074,10 @@
"anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"fumadocs-openapi/lucide-react": ["lucide-react@1.14.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA=="],
"fumadocs-ui/lucide-react": ["lucide-react@1.14.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA=="],
"gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
"htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
@@ -1090,6 +1094,8 @@
"rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.17", "", {}, "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg=="],
"vite/rolldown": ["rolldown@1.0.0-rc.13", "", { "dependencies": { "@oxc-project/types": "=0.123.0", "@rolldown/pluginutils": "1.0.0-rc.13" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.13", "@rolldown/binding-darwin-arm64": "1.0.0-rc.13", "@rolldown/binding-darwin-x64": "1.0.0-rc.13", "@rolldown/binding-freebsd-x64": "1.0.0-rc.13", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.13", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.13", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.13", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.13", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.13", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.13", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.13" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw=="],
"@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="],
"@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="],
@@ -1116,6 +1122,46 @@
"gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
"vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.123.0", "", {}, "sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew=="],
"vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.13", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g=="],
"vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA=="],
"vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug=="],
"vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA=="],
"vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13", "", { "os": "linux", "cpu": "arm" }, "sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw=="],
"vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg=="],
"vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA=="],
"vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ=="],
"vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "s390x" }, "sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg=="],
"vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "x64" }, "sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA=="],
"vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.13", "", { "os": "linux", "cpu": "x64" }, "sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w=="],
"vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.13", "", { "os": "none", "cpu": "arm64" }, "sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w=="],
"vite/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.13", "", { "dependencies": { "@emnapi/core": "1.9.1", "@emnapi/runtime": "1.9.1", "@napi-rs/wasm-runtime": "^1.1.2" }, "cpu": "none" }, "sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g=="],
"vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ=="],
"vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.13", "", { "os": "win32", "cpu": "x64" }, "sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ=="],
"vite/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.13", "", {}, "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA=="],
"@tanstack/router-plugin/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
"vite/rolldown/@rolldown/binding-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="],
"vite/rolldown/@rolldown/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="],
"vite/rolldown/@rolldown/binding-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="],
}
}
@@ -36,125 +36,132 @@ A simple high-level overview diagram to give you a visual idea of how this works
---
### Quick Links to Important Sections:
- [Create a Cloudflare Tunnel](#_1-create-a-cloudflare-tunnel)
- [Setup Encryption mode on Cloudflare](#_2-setup-encryption-mode-on-cloudflare)
- [Setup Cloudflare Tunnel on Coolify](#_3-setup-cloudflare-tunnel-on-coolify)
- [Start Coolify Proxy](#_4-start-coolify-proxy)
- [Configure Your Resource to Use the Tunnel Domain](#_5-configure-your-resource-to-use-the-tunnel-domain)
- [How to use Multiple Different Domains](#how-to-use-multiple-different-domains)
- [Known issues and Solutions](#known-issues-and-solutions)
<Callout type="info" title="Example Data">
---
<Callout type="warn" title="Example Data">
The following data is used as an example in this guide. Please replace it with your actual data when following the steps:
- **Domain Name:** shadowarcanist.com
The following data is used as an example in this guide. Please replace it with your actual data when following the steps:
- **Domain Name:** `shadowarcanist.com`
</Callout>
---
## 1. Create a Cloudflare Tunnel
To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page.
To create a Cloudflare Tunnel, first log in to your [Cloudflare dashboard](https://dash.cloudflare.com/)
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/0.webp" />
1. Go to **Networking** in the sidebar.
2. Click on **Tunnels**
3. Click on **Create tunnel** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/1.webp" />
1. On the Zero Trust page, go to **Networks** in the sidebar.
2. Click on **Tunnels**
3. Click on **Add a tunnel** button
You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button.
You will be prompted to enter a tunnel name. Enter a name that you prefer and click on **Create tunnel** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/2.webp" />
You will be prompted to enter a tunnel name. Choose a name that you prefer.
1. Select the **Docker** option
2. Copy the docker run 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.
## 2. Deploy cloudflared on Coolify
Go to your project on Coolify dashboard and click the `+ New` button to create a new resource.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/3.webp" />
Next you will see the configuration page with multiple options to install cloudflared.
Search for `Cloudflared` and click on it.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/4.webp" />
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.
Go to the **Environment Variables** page, enter your tunnel token, and deploy the Cloudflared app.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/5.webp" />
Scroll down until you see the **Next** button, then click it.
Then, you will be prompted to add a hostname.
Once cloudflared starts running you will be able to see it's status on Cloudflare dashboard
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/6.webp" />
1. **Subdomain** - (Optional) You can make your all of your resource accessible on any subdomain/domain. For this guide, we are using a wildcard subdomain.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Type** - Choose **HTTP** (this is very important).
5. **URL** - Enter **localhost:80** (this is very important).
6. After filling in the details, click the **Save Tunnel** button.
Click on continue button to create the tunnel.
## 2. Setup Encryption mode on Cloudflare
To set up encryption on Cloudflare, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/15.webp" />
1. Go to https://dash.cloudflare.com/ and select the domain you created the tunnel for.
2. Click **SSL/TLS** in the sidebar.
3. Select **Overview**.
4. Click **Configure** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/16.webp" />
Choose **Full** as the encryption mode.
## 3. Setup Cloudflare Tunnel on Coolify
To set up the tunnel on Coolify, follow these steps:
## 3. Start Coolify Proxy
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/7.webp" />
Go to your project on Coolify dashboard and click the **+ New** button to create a new resource.
1. In the Coolify dashboard, go to the **Servers** page from the sidebar.
2. Select the server where your application is running, and check if the proxy is showing as running.
## 4. Set Up TLS Encryption
To make Cloudflare use stricter encryption when connecting to your server, configure your TLS encryption in Cloudflare:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/13.webp" />
1. Go to **SSL/TLS** in Cloudflare.
2. Select **Overview**.
3. Click **Configure** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/14.webp" />
1. Choose **Full (Strict)** as the encryption mode.
2. Click **Save** button
## 5. Configure tunnel routes
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/8.webp" />
You will see many options to deploy a new app. Search for Cloudflared and click on it.
1. Click on your tunnel
2. Click on **Configure** option
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/9.webp" />
Go to the **Environment Variables** page, enter your tunnel token, and deploy the Cloudflared app. This token was copied in [Step 1](#_1-create-a-cloudflare-tunnel)
## 4. Start Coolify Proxy
To start the Coolify proxy, follow these steps:
1. Select **Routes**.
2. Click **Add route** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/10.webp" />
1. In the Coolify dashboard, go to the **Servers** page from the sidebar.
2. Select the server where coolify is running, then Click on the **Proxy** tab.
3. Open the **General** tab.
4. Click the **Start Proxy** button.
3. Select **Published Application** as the route type
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/11.webp" />
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 which is `*`
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Service URL** - Enter **http://localhost:80** (this is very important).
6. After filling in the details, click the **Add route** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/12.webp" />
<Callout type="success" title="Tip">
The Coolify proxy is used to route traffic to apps running on your server. This eliminates the need to create new hostnames on the Cloudflare tunnel every time you deploy a new app.
The Coolify proxy (runs on `http://localhost:80`) is used to route traffic to apps running on your server. This eliminates the need to create new routes on the Cloudflare tunnel every time you deploy a new app.
</Callout>
## 5. Configure Your Resource to Use the Tunnel Domain
## 6. Configure your resource domain
Enter the domain you want to use for your resource/app and deploy your resource.
Enter the domain you want to use for your resource on Coolify and deploy your resource.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/11.webp" />
<Tabs items={['Services', 'Application']}>
<Tab value="Services">
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/15.webp" />
</Tab>
<Tab value="Application">
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/16.webp" />
</Tab>
</Tabs>
<Callout type="warn" title="HEADS UP!">
@@ -167,25 +174,35 @@ If your app requires **HTTPS** for features like cookies or login, follow the [F
**Congratulations**! You've successfully set up a resource that can be accessed by anyone on the internet your domain.
## How to use Multiple Different Domains?
You don't need to create new tunnels for each domain, just create a new hostname with the new domain and point it to the `localhost:80`.
---
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/12.webp" />
## How to use multiple different domains?
You don't need to create new tunnels for each domain, just create a new routes with the new domain and point it to the `http://localhost:80`.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/17.webp" />
---
## Known issues and Solutions
When you create a new public hostname in [Step 1](#_1-create-a-cloudflare-tunnel), Cloudflare will create a DNS record for the hostname.
When you create a new routes in [Step 5](/integrations/cloudflare/tunnels/all-resource#5-configure-tunnel-routes), Cloudflare will create a DNS record for the hostname.
However, if a DNS record for the hostname already exists, Cloudflare wont create a new one.
However, if a DNS record for the hostname already exists, Cloudflare wont update existing record.
In this case, your app wont work. To fix this issue, follow the steps below:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/13.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/8.webp" />
First, copy your tunnel ID from the Tunnels page on the Cloudflare dashboard.
1. Click on your tunnel
2. Click on **Configure** option
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/14.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/18.webp" />
3. Copy your tunnel ID from the Tunnels details section.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/19.webp" />
Create a new DNS record with the following details:
@@ -32,18 +32,6 @@ To follow this guide, you'll need:
---
### Quick Links to Important Sections:
- [Create a Cloudflare Origin Certificate](#_1-create-a-cloudflare-origin-certificate)
- [Add Origin Certificate to Your Server](#_2-add-origin-certificate-to-your-server)
- [Configure Coolify to Use the Origin Certificate](#_3-configure-coolify-to-use-the-origin-certificate)
- [Setup Encryption mode on Cloudflare](#_4-setup-encryption-mode-on-cloudflare)
- [Configure Tunnel to Use HTTPS](#_5-configure-tunnel-to-use-https)
- [Configure Cloudflare to Always Use HTTPS](#_6-configure-cloudflare-to-always-use-https)
- [Update URLs from HTTP to HTTPS](#_7-update-urls-from-http-to-https)
---
<Callout type="warn" title="Example Data">
@@ -56,178 +44,170 @@ The following data is used as an example in this guide. Please replace it with y
</Callout>
## 1. Create a Cloudflare Origin Certificate
## 1. Setup Origin TLS Certificate
Communication between your server and Cloudflare is encrypted using a TLS certificate.
To create your Cloudflare Origin Certificate, follow these steps:
There are two ways to do this:
* Use a TLS certificate from Cloudflare
* Get your own TLS certificate from a trusted public Certificate Authority (this requires a DNS challenge)
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/1.webp" />
Here's a concise comparison table between a **Cloudflare Origin Certificate** and a **Public CA Certificate**:
| Feature | Cloudflare Origin Certificate | Public CA Certificate |
|----------|------------------------|----------------|
| Trusted By | Cloudflare only | Browsers, OSs, Cloudflare |
| Use Case | Cloudflare ↔ Origin only | Any direct client |
| Direct Browser Access | Shows certificate errors if users bypass Cloudflare | ✅ Works normally |
| Requires CF Proxy | ✅ Yes | ❌ No |
| Works Without CF | ❌ No | ✅ Yes |
| Issuer | Cloudflare | Public CA (eg: Let's Encrypt) |
| Cost | Free | Free |
| DNS Challenge | ❌ No | ✅ Yes |
<Callout type="success" title="Tip">
If you plan to have Cloudflare always in front of your application, use a Cloudflare Origin Certificate. Otherwise, use a Public CA Cert.
</Callout>
There are 2 ways to setup the Origin TLS Certificate so follow one of the methods from below:
<Tabs items={['Cloudflare Origin Certificate', 'Public CA Certificate']}>
<Tab value="Cloudflare Origin Certificate">
A simple high-level overview diagram to give you a visual idea of how this works:
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/cf-origin-certificate-overview-diagram.webp" />
---
## A. Create Cloudflare Origin Certificate [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/1.webp" />
1. In your Cloudflare dashboard, go to **SSL/TLS**.
2. Select **Origin Server**.
3. Select **Origin Certificates**
3. Click the **Create Certificate** button.
Youll be asked to choose a private key type, hostnames, and certificate validity.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/2.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/2.webp" />
1. Choose **RSA (2048)** for the key type.
2. Add the hostnames you want the certificate to cover.
3. Set the certificate validity to **15 years**.
4. Click the **Create** button.
<Callout type="warn" title="HEADS UP!">
- **`shadowarcanist.com`** will cover only the main domain.
- **`*.shadowarcanist.com`** will cover all subdomains.
On Cloudflares 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/)
- **`shadowarcanist.com`** will cover only the main domain.
- **`*.shadowarcanist.com`** will cover all subdomains.
On Cloudflares 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/)
</Callout>
3. Set the certificate validity to **15 years**.
Your certificate will now be generated.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/3.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/3.webp" />
1. Choose **PEM** as the key format.
2. Copy your **Certificate**.
3. Copy your **Private Key**.
2. Copy your **Origin Certificate** and save it somewhere safe
3. Copy your **Private Key** and save it somewhere safe
4. Click the **Ok** button.
Next, you'll add these to your server running Coolify and configure Coolify to use this certificate.
## 2. Add Origin Certificate to Your Server
SSH into your server or use Coolify's terminal feature. For this guide, Im using SSH:
---
## B. Add Certificate to Your Server [!toc]
SSH into your server or use Coolify's terminal feature. For this guide, Im using my external terminal:
```bash
ssh shadowarcanist@203.0.113.1
```
Once logged in, navigate to the Coolify proxy directory:
```bash
$ cd /data/coolify/proxy
```
Adding certificates slightly varies for Caddy and Traefik proxy so choose the correct one from the below section
Certificate locations slightly vary between Caddy and Traefik, so choose the one based on the proxy you are using from the section below.
<Tabs items={['Traefik', 'Caddy']}>
<Callout type="info">
<Tab value="Traefik">
== Traefik
Create the `certs` directory:
```bash
$ mkdir certs
```
Verify it was created:
```bash
$ ls
> acme.json certs docker-compose.yml dynamic
```
Now, navigate into the **certs** directory:
```bash
$ cd certs
```
Create two new files for the certificate and private key:
</Tab>
```bash
$ touch shadowarcanist.cert shadowarcanist.key
```
<Tab value="Caddy">
Verify the files were created:
```bash
$ ls
> shadowarcanist.cert shadowarcanist.key
```
Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard:
```bash
$ nano shadowarcanist.cert
```
Save and exit after pasting the certificate.
Do the same for the **shadowarcanist.key** file and paste the private key:
```bash
$ nano shadowarcanist.key
```
Save and exit.
== Caddy
Create the `caddy/data/certs` directory:
```bash
$ mkdir -p caddy/data/certs
```
Verify it was created:
```bash
$ ls caddy/data
> certs
```
Now, navigate into the **certs** directory:
```bash
$ cd caddy/data/certs
```
Create two new files for the certificate and private key:
</Tab>
</Tabs>
Create two new files for the certificate and private key:
```bash
$ touch shadowarcanist.cert shadowarcanist.key
```
Verify the files were created:
```bash
$ ls
> shadowarcanist.cert shadowarcanist.key
```
Open the **shadowarcanist.cert** file and paste the certificate from the Cloudflare dashboard:
```bash
$ nano shadowarcanist.cert
$ nano shadowarcanist.cert
```
Save and exit after pasting the certificate.
Do the same for the **shadowarcanist.key** file and paste the private key:
```bash
$ nano shadowarcanist.key
$ nano shadowarcanist.key
```
Save and exit.
</Callout>
Now the origin certificate is installed on your server.
## 3. Configure Coolify to Use the Origin Certificate
---
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/14.webp" />
## C. Configure Coolify proxy to Use the Origin Certificate [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/8.webp" />
1. Go to the **Server** section in the sidebar.
2. Select **Proxy**.
@@ -236,20 +216,18 @@ Now the origin certificate is installed on your server.
You will now be prompted to enter the Dynamic Configuration.
Adding Dynamic Configuration slightly varies for Caddy and Traefik proxy so choose the correct one from the below section
Dynamic configuration file slightly varies between Caddy and Traefik, so choose the one based on the proxy you are using from the section below.
<Callout type="info">
<Tabs items={['Traefik', 'Caddy']}>
<Tab value="Traefik">
== Traefik
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/15.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/9.webp" />
1. Choose a name for your configuration (must end with `.yaml`).
2. Enter the following details in the configuration field:
```bash
```yaml
tls:
certificates:
-
@@ -259,110 +237,132 @@ tls:
3. Save the configuration
---
If you want to add multiple certificates and keys, you can do it like this:
```bash
tls:
certificates:
-
certFile: /traefik/certs/shadowarcanist.cert
keyFile: /traefik/certs/shadowarcanist.key
-
certFile: /traefik/certs/name2.cert
keyFile: /traefik/certs/name2.key
-
certFile: /traefik/certs/name3.cert
keyFile: /traefik/certs/name3.key
```
== Caddy
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/16.webp" />
1. Choose a name for your configuration (must end with `.caddy`).
2. Enter the following details in the configuration field:
```bash
*.shadowarcanist.com, shadowarcanist.com {
tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key
}
```
> Note: The wildcard `*.shadowarcanist.com` provides coverage for all subdomains, exclude it if youre only securing a single domain (i.e, `shadowarcanist.com`).
3. Save the configuration
---
If you want to add multiple certificates and keys, you can do it like this:
```bash
*.shadowarcanist.com, shadowarcanist.com {
tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key
}
*.name2.com, name2.com {
tls /data/certs/name2.cert /data/certs/name2.key
}
*.name3.com, name3.com {
tls /data/certs/name3.cert /data/certs/name3.key
}
```
<Callout type="info" title="Adding multiple certificates">
If you want to add multiple certificates and keys, you can do it like this:
```yaml
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
```
</Callout>
</Tab>
<Tab value="Caddy">
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/10.webp" />
1. Choose a name for your configuration (must end with `.caddy`).
2. Enter the following details in the configuration field:
```bash
*.shadowarcanist.com, shadowarcanist.com {
tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key
}
```
<Callout type="info" title="Note">
The wildcard `*.shadowarcanist.com` provides coverage for all subdomains, exclude it if youre only securing a single domain (i.e, `shadowarcanist.com`).
</Callout>
3. Save the configuration
<Callout type="info" title="Adding multiple certificates">
If you want to add multiple certificates and keys, you can do it like this:
```bash
*.shadowarcanist.com, shadowarcanist.com {
tls /data/certs/shadowarcanist.cert /data/certs/shadowarcanist.key
}
*.name2.com, name2.com {
tls /data/certs/name2.cert /data/certs/name2.key
}
*.name3.com, name3.com {
tls /data/certs/name3.cert /data/certs/name3.key
}
```
</Callout>
</Tab>
</Tabs>
From now on, Coolify will use the origin certificate for requests matching the hostname.
## 4. Setup Encryption mode on Cloudflare
</Tab>
To set up encryption on Cloudflare, follow these steps:
<Tab value="Public CA Certificate">
A simple high-level overview diagram to give you a visual idea of how this works:
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/public-ca-origin-certificate-overview-diagram.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/4.webp" />
We already have guides to set up DNS challenge for TLS certificates, you can follow them here:
- [Traefik DNS challenge](/knowledge-base/proxy/traefik/dns-challenge)
- [Caddy DNS challenge](/knowledge-base/proxy/caddy/dns-challenge)
Come back to this guide after you finish setting up the DNS challenge using the guides above.
</Tab>
</Tabs>
## 2. Setup TLS Encryption
To make Cloudflare use stricter encryption when connecting to your server, configure your TLS encryption in Cloudflare:
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/5.webp" />
1. Go to **SSL/TLS** in Cloudflare.
2. Select **Overview**.
3. Click **Configure** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/5.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/6.webp" />
Choose **Full (Strict)** as the encryption mode.
1. Choose **Full (Strict)** as the encryption mode.
2. Click **Save** button
## 5. Configure Tunnel to Use HTTPS
## 3. Setup Always Use HTTPS
To make Cloudflare automatically redirect HTTP requests to HTTPS, configure your redirects in Cloudflare:
To configure the tunnel for HTTPS, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/ddos-protection/7.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/6.webp" />
1. Click the three dots icon to open the settings menu.
2. Select **Edit** to allow hostname modifications.
Next, update the hostnames as follows:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/7.webp" />
1. Change the type from **HTTP** to **HTTPS**.
2. Change the port from **80** to **443**.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/8.webp" />
3. Click on **Additional Application Settings**.
4. Select **TLS**.
5. Enter your root domain in the **Origin Server Name** field.
6. Scroll down and click the **Save Hostname** button.
## 6. Configure Cloudflare to Always Use HTTPS
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/9.webp" />
1. In the Cloudflare dashboard, go to **SSL/TLS**.
1. In Cloudflare, go to **SSL/TLS**
2. Select **Edge Certificates**.
3. Enable **Always Use HTTPS**.
## 7. Update URLs from HTTP to HTTPS
## 4. Configure Tunnel to Use HTTPS
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/17.webp" />
1. Click the three dots icon to open the settings menu.
2. Click **Edit route** option
Next, update the service URL as follows:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/full-tls/18.webp" />
Change the type from `http://localhost:80` to `https://localhost:443`
## 5. Update URLs from HTTP to HTTPS
Now, update all URLs from **HTTP** to **HTTPS** in Coolify, including resources and the instance domain on the settings page.
@@ -7,14 +7,13 @@ description: "Enable secure SSH access to Coolify servers via Cloudflare Tunnels
Accessing your server using SSH over a Cloudflare Tunnel is a secure and easy way to connect to a remote server while keeping its IP address hidden.
This guide explains how to set it up using Coolify's automated cloudflare tunnel installation.
## Who this is for?
This setup is ideal for people who:
- Want to keep their server's IP address private.
- Want to close all SSH ports on their server.
- Want to close SSH ports on their server.
- Dont want to rely on static public IPs for accessing their remote server.
- Don't have a static public IP for the server (only applies if you're doing the [manual setup](#manual-setup)).
@@ -33,342 +32,371 @@ A simple high-level overview diagram to give you a visual idea of how this works
# Setup Methods
There are two ways to set this up: automated and manual.
There are two ways to set this up:
- Automated
- Manual
The main difference is that in the manual setup, you install cloudflared yourself, while in the automated setup, Coolify does it for you.
Choose one of the links below for the setup guide:
- [Automated](#automated-setup)
- [Manual Setup](#manual-setup)
<Tabs items={['Automated', 'Manual']}>
## Automated Setup
<Tab value="Automated">
To use Coolify's automated setup for a Cloudflare Tunnel:
To use Coolify's automated setup for a Cloudflare Tunnel:
- Your remote server must have a **public IP address** and an **active SSH port** during the initial setup for Coolify to configure the tunnel. After setup, you can close all ports on the server.
- If your server doesnt have a public IP address, then this automated setup is **not for you**. Please follow the Manual setup guide instead.
- You need a domain that has it's **DNS managed by Cloudflare**.
- Your remote server must have a **public IP address** and an **active SSH port** during the initial setup for Coolify to configure the tunnel. After setup, you can close all ports on the server.
- If your server doesnt have a public IP address, then this automated setup is **not for you**. Please follow the [Manual setup guide](#manual-setup) instead.
- You need a domain that has it's **DNS managed by Cloudflare**.
### Quick Links to Important Sections:
- [Create a Private SSH Key](#_1-create-a-private-ssh-key)
- [Add Public Key to Your Server](#_2-add-public-key-to-your-server)
- [Add your Server to Coolify](#_3-add-your-server-to-coolify)
- [Validate your Server on Coolify](#_4-validate-your-server-on-coolify)
- [Create a Cloudflare Tunnel](#_5-create-a-cloudflare-tunnel)
- [Setup Cloudflare Tunnel on Coolify](#_6-setup-cloudflare-tunnel-on-coolify)
---
<Callout type="warn" title="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 Remote Server:** 203.0.113.1
- **Domain Name:** shadowarcanist.com
- **Username:** root
- **SSH Port:** 22
</Callout>
---
<Callout type="warn" title="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 Remote Server:** `192.168.1.93`
- **SSH Domain Name:** `helixa.shadowarcanist.com`
- **Username:** `root`
- **SSH Port:** `22`
</Callout>
---
## 1. Create a Private SSH Key
To create a Private SSH Key, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-1.webp" />
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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-2.webp" />
1. Click on Generate new **ED25519** or **RSA** button to generate a new SSH key.
2. Copy the public key and save it somewhere safe (you'll need it in the next step). Then, click Continue.
## 2. Add Public Key to Your Server
SSH into the server you want to connect to Coolify:
```bash
ssh root@203.0.113.1
```
Once logged in, add your public key to the authorized keys file:
```bash
$ echo "<PASTE YOUR PUBLIC KEY INSIDE OF THESE QUOTES>" >> ~/.ssh/authorized_keys
```
## 3. Add your Server to Coolify
To add your server to Coolify, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-3.webp" />
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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-4.webp" />
1. **Name** - Choose a name to easily identify your server in the dashboard.
2. **Description** - (Optional) Provide a description for your server.
3. **IP Address/Domain** - Enter the public IP address of your server.
4. **Port** - Enter the port number your server uses for SSH connections.
5. **User** - Enter the username Coolify will use (it should have root privileges on the server).
6. **Private key** - Select the private key you created in [Step 1](#_1-create-a-private-ssh-key)
7. After filling in the details, click the **Continue** button.
## 4. Validate your Server on Coolify
To validate your server, simply click the **Validate Server & Install Docker Engine** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-5.webp" />
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:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-6.webp" />
## 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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-7.webp" />
1. On the Zero Trust page, go to **Networks** in the sidebar.
2. Click on **Tunnels**
3. Click on **Add a tunnel** button
You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-8.webp" />
You will be prompted to enter a tunnel name. Choose a name that you prefer.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-9.webp" />
Next you will see the configuration page with multiple options to install cloudflared.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-10.webp" />
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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-11.webp" />
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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-12.webp" />
1. **Subdomain** - (Optional) You can make SSH accessible on any subdomain. For this guide, we are using the subdomain **ssh**.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Type** - Choose **SSH** (this is very important).
5. **URL** - Enter **localhost:22** If your SSH port is different from 22, use that port instead.
6. After filling in the details, click the **Save Tunnel** button.
## 6. Setup Cloudflare Tunnel on Coolify
To set up the tunnel on Coolify, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-13.webp" />
Go to the **Servers** page and select the server you want to connect. This is the server you added in [Step 3](#_3-add-your-server-to-coolify)
1. Click on **Cloudflare Tunnels**
2. Click on **Automated** button
You will be prompted to enter the Tunnel Token and SSH domain.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-14.webp" />
1. Enter your **Tunnel Token** (this is the token we copied in [Step 5](#_5-create-a-cloudflare-tunnel))
2. Enter your **SSH Domain** (this is the subdomain we set up in [Step 5](#_5-create-a-cloudflare-tunnel))
3. Click on **Continue** button.
Coolify will now install **cloudflared** on the server and set everything up automatically. This process will take about 30 seconds to 1 minute.
Once completed, you will see that the Cloudflare tunnel is enabled on the Cloudflare Tunnels page, like this:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-15.webp" />
At this point, your server's IP address will be automatically updated to the SSH domain by Coolify.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated-16.webp" />
You can now block your SSH port on the server if you wish.
**Congratulations**! You've successfully set up a server that can be accessed by Coolify over SSH using Cloudflare tunnels via your domain.
## 1. Create a Private SSH Key [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/0.webp" />
1. In your Coolify Dashboard, go to **Keys & Tokens**
2. Click on **Private Keys** tab
2. Click the **+ Add** button
You will be prompted to choose a key type, along with providing a name and description for the key.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/1.webp" />
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).
3. Click **Continue** button.
## 2. Add Public Key to Your Server [!toc]
SSH into the server you want to connect to Coolify:
```bash
ssh root@192.168.1.93
```
Once logged in, add your public key to the authorized keys file:
```bash
echo "<PASTE YOUR PUBLIC KEY INSIDE OF THESE QUOTES>" >> ~/.ssh/authorized_keys
```
## 3. Add your Server to Coolify [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/2.webp" />
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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/3.webp" />
1. **Name** - Choose a name to easily identify your server in the dashboard.
2. **Description** - (Optional) Provide a description for your server.
3. **IP Address/Domain** - Enter the public IP address of your server.
4. **Port** - Enter the port number your server uses for SSH connections.
5. **User** - Enter the username Coolify will use (it should have root privileges on the server).
6. **Private key** - Select the private key you created in Step 1
7. After filling in the details, click the **Continue** button.
## 4. Validate your Server on Coolify [!toc]
To validate your server, simply click the **Validate Server & Install Docker Engine** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/4.webp" />
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:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/5.webp" />
<Callout type="error" title="HEADS UP!">
**The steps above show how to do the automated setup. Below are the steps for the manual setup.**
</Callout>
## 5. Create a Cloudflare Tunnel [!toc]
To create a Cloudflare Tunnel, first log in to your [Cloudflare dashboard](https://dash.cloudflare.com/)
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/6.webp" />
1. Go to **Networking** in the sidebar.
2. Click on **Tunnels**
3. Click on **Create tunnel** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/7.webp" />
You will be prompted to enter a tunnel name. Enter a name that you prefer and click on **Create tunnel** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/8.webp" />
1. Select the **Docker** option
2. Copy the docker run 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.
## Manual Setup
## 6. Configure Cloudflare tunnel on Coolify [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/9.webp" />
1. In your Coolify Dashboard, go to **Cloudflare Tunnel**
2. Under manual section enter your **Cloudflare Token** and **SSH Domain**
3. Click on **Continue** button
<Callout type="success" title="TIP">
The Cloudflare token is included in the **docker run command** you copied in the previous step. The token begins with `eyJ`.
</Callout>
Once cloudflared starts running you will be able to see it's status on Cloudflare dashboard:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/10.webp" />
Click on continue button to create the tunnel.
## 7. Configure tunnel routes [!toc]
1. Click on your tunnel
2. Click on **Configure** option
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/11.webp" />
1. Select **Routes**.
2. Click **Add route** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/12.webp" />
3. Select **Published Application** as the route type
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/13.webp" />
1. **Subdomain** - (Optional) You can make your resource accessible on any subdomain/domain. For this guide, we are using the `helixa` subdomain.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Service URL** - Enter **ssh://localhost:22** (this is very important). If your SSH port is different from 22, use that port instead.
6. After filling in the details, click the **Add route** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/14.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/15.webp" />
Coolify will automatically change the server IP address to the Cloudflare SSH domain once the tunnel is configured.
If it doesnt update automatically then manually change the IP address to the SSH domain here:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/automated/16.webp" />
**Congratulations!** You've successfully set up a server that can be accessed by Coolify over SSH using Cloudflare tunnels via your domain.
You can now block your SSH port on the server if you wish.
</Tab>
<Tab value="Manual">
To manually setup Cloudflare Tunnel:
- You need access to your remote server to install cloudflared (a public IP for your server is not required).
- You need a domain that has it's **DNS managed by Cloudflare**.
### Quick Links to Important Sections:
- [Create a Private SSH Key](#_1-create-a-private-ssh-key-1)
- [Add Public Key to Your Server](#_2-add-public-key-to-your-server-1)
- [Create a Cloudflare Tunnel](#_3-create-a-cloudflare-tunnel)
- [Add your Server to Coolify](#_4-add-your-server-to-coolify)
- [Validate your Server on Coolify](#_5-validate-your-server-on-coolify)
- [Setup Cloudflare Tunnel on Coolify](#_6-setup-cloudflare-tunnel-on-coolify-1)
---
<Callout type="warn" title="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 Remote Server:** 203.0.113.1
- **Domain Name:** shadowarcanist.com
- **Username:** root
- **SSH Port:** 22
- **IPv4 Address of Remote Server:** `192.168.1.93`
- **SSH Domain Name:** `helixa.shadowarcanist.com`
- **Username:** `root`
- **SSH Port:** `22`
</Callout>
---
## 1. Create a Private SSH Key
## 1. Create a Private SSH Key [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/0.webp" />
1. In your Coolify Dashboard, go to **Keys & Tokens**
2. Click on **Private Keys** tab
2. Click the **+ Add** button
You will be prompted to choose a key type, along with providing a name and description for the key.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/1.webp" />
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).
3. Click **Continue** button.
## 2. Add Public Key to Your Server [!toc]
SSH into the server you want to connect to Coolify:
```bash
ssh root@192.168.1.93
```
Once logged in, add your public key to the authorized keys file:
```bash
echo "<PASTE YOUR PUBLIC KEY INSIDE OF THESE QUOTES>" >> ~/.ssh/authorized_keys
```
## 3. Add your Server to Coolify [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/2.webp" />
1. In your Coolify Dashboard, go to **Servers**
2. Click the **+ Add** button
You will be prompted to enter details about your server.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/3.webp" />
1. **Name** - Choose a name to easily identify your server in the dashboard.
2. **Description** - (Optional) Provide a description for your server.
3. **IP Address/Domain** - Enter the SSH domain that you want to acesss the server via Cloudflare tunnels.
4. **Port** - Enter the port number your server uses for SSH connections.
5. **User** - Enter the username Coolify will use (it should have root privileges on the server).
6. **Private key** - Select the private key you created in Step 1
7. After filling in the details, click the **Continue** button.
To create a Private SSH Key, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-1.webp" />
## 4. Configure Cloudflare tunnel on Coolify [!toc]
1. In your Coolify Dashboard, go to **Keys & Tokens**
2. Click the **+ Add** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/4.webp" />
You will be prompted to choose a key type, along with providing a name and description for the key.
1. In your Coolify Dashboard, go to **Cloudflare Tunnel**
2. Click the **"here"** text on the information message you see on the dashboard
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-2.webp" />
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.
## 5. Create a Cloudflare Tunnel [!toc]
To create a Cloudflare Tunnel, first log in to your [Cloudflare dashboard](https://dash.cloudflare.com/)
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/5.webp" />
1. Go to **Networking** in the sidebar.
2. Click on **Tunnels**
3. Click on **Create tunnel** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/6.webp" />
You will be prompted to enter a tunnel name. Enter a name that you prefer and click on **Create tunnel** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/7.webp" />
1. Select the **Docker** option
2. Copy the docker run command, and run it on the server terminal which you want connect to Coolify.
## 2. Add Public Key to Your Server
<Callout type="success" title="TIP">
By default, the `docker run` command runs in the foreground. This means the `cloudflared` container will stop if you close the terminal. To keep the container running in the background, add the `-d` flag when running the command.
SSH into the server you want to connect to Coolify:
For example: `docker run -d cloudflare/...`
</Callout>
```bash
ssh root@203.0.113.1
```
Once cloudflared starts running you will be able to see it's status on Cloudflare dashboard:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/8.webp" />
This server can be on your local network without a public IP address. All you need is SSH access to the terminal to run commands.
Click on continue button to create the tunnel.
Once logged in, add your public key to the authorized keys file:
## 6. Configure tunnel routes [!toc]
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/9.webp" />
1. Click on your tunnel
2. Click on **Configure** option
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/10.webp" />
1. Select **Routes**.
2. Click **Add route** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/11.webp" />
3. Select **Published Application** as the route type
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/12.webp" />
1. **Subdomain** - (Optional) You can make your resource accessible on any subdomain/domain. For this guide, we are using the `helixa` subdomain.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Service URL** - Enter **ssh://localhost:22** (this is very important). If your SSH port is different from 22, use that port instead.
6. After filling in the details, click the **Add route** button.
```bash
$ echo "<PASTE YOUR PUBLIC KEY INSIDE OF THESE QUOTES>" >> ~/.ssh/authorized_keys
```
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/13.webp" />
## 3. Create a Cloudflare Tunnel
## 7. Validate server on Coolify [!toc]
To validate your server, simply click the **Validate Server & Install Docker Engine** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/14.webp" />
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:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual/15.webp" />
To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page.
**Congratulations!** You've successfully set up a server that can be accessed by Coolify over SSH using Cloudflare tunnels via your domain.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-3.webp" />
You can now block your SSH port on the server if you wish.
1. On the Zero Trust page, go to **Networks** in the sidebar.
2. Click on **Tunnels**
3. Click on **Add a tunnel** button
</Tab>
</Tabs>
You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-4.webp" />
---
You will be prompted to enter a tunnel name. Choose a name that you prefer.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-5.webp" />
## Known issues and Solutions
Next you will see the configuration page with multiple options to install cloudflared.
When you create a new routes on Tunnel, Cloudflare will create a DNS record for the hostname.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-6.webp" />
However, if a DNS record for the hostname already exists, Cloudflare wont update existing record.
Select your preferred option and follow the installation instructions provided by Cloudflare on the page.
In this case, your app wont work. To fix this issue, follow the steps below:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-7.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/8.webp" />
Scroll down a bit and wait for your server (connector) to appear in the list. Once it appears, click the **Next** button.
1. Click on your tunnel
2. Click on **Configure** option
Then, you will be prompted to add a hostname. This is where we expose our SSH tunnel.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/18.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-8.webp" />
3. Copy your tunnel ID from the Tunnels details section.
1. **Subdomain** - (Optional) You can make SSH accessible on any subdomain. For this guide, we are using the subdomain **ssh**.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Type** - Choose **SSH** (this is very important).
5. **URL** - Enter **localhost:22** If your SSH port is different from 22, use that port instead.
6. After filling in the details, click the **Save Tunnel** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/19.webp" />
## 4. Add your Server to Coolify
Create a new DNS record with the following details:
To add your server to Coolify, follow these steps:
1. In the Cloudflare dashboard, go to **DNS**.
2. Select **Records**.
3. Add a **CNAME** record.
4. Enter the name as `*` or the name of your subdomain (this should match the hostname you have for your app on the tunnel).
5. For the **Target**, enter the tunnel ID followed by `.cfargotunnel.com`
6. Set the proxy status to **Proxied**.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-9.webp" />
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.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-10.webp" />
1. **Name** - Choose a name to easily identify your server in the dashboard.
2. **Description** - (Optional) Provide a description for your server.
3. **IP Address/Domain** - Enter the SSH domain of your server (which we set up in the previous step).
4. **Port** - Enter the port number your server uses for SSH connections.
5. **User** - Enter the username Coolify will use (it should have root privileges on the server).
6. **Private key** - Select the private key you created in [Step 1](#_1-create-a-private-ssh-key-1)
7. After filling in the details, click the **Continue** button.
## 5. Validate your Server on Coolify
To validate your server, simply click the **Validate Server & Install Docker Engine** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-11.webp" />
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:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-12.webp" />
## 6. Setup Cloudflare Tunnel on Coolify
To set up the tunnel on Coolify, follow these steps:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-13.webp" />
Go to the **Servers** page and select the server (which we added in the previous step) you want to connect.
1. Click on **Cloudflare Tunnels**
2. Click on **Manual** button
Once completed, you will see that the Cloudflare tunnel is enabled on the Cloudflare Tunnels page, like this:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/server-ssh/manual-14.webp" />
**Congratulations**! You've successfully set up a server that can be accessed by Coolify over SSH using Cloudflare tunnels via your domain.
Now, visit the domain of your application, and it should be accessible there.
@@ -37,16 +37,6 @@ A simple high-level overview diagram to give you a visual idea of how this works
---
### Quick Links to Important Sections:
- [Setup your app for tunneling](#_1-setup-your-app-for-tunneling)
- [Create a Cloudflare Tunnel](#_2-create-a-cloudflare-tunnel)
- [Setup Cloudflare Tunnel on Coolify](#_3-setup-cloudflare-tunnel-on-coolify)
- [Expose Multiple Resource on Different Domains](#expose-multiple-resource-on-different-domains)
- [Known issues and Solutions](#known-issues-and-solutions)
---
<Callout type="warn" title="Example Data">
@@ -65,7 +55,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:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/1.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/0.webp" />
1. Remove all domains from the **Domains** field.
2. Set the correct port in **Ports Exposed** (the port your app uses).
@@ -74,117 +64,139 @@ To setup your app for tunneling, follow these steps:
## 2. Create a Cloudflare Tunnel
To create a Cloudflare Tunnel, first log in to your Cloudflare account and go to the [Zero Trust](https://one.dash.cloudflare.com/) page.
To create a Cloudflare Tunnel, first log in to your [Cloudflare dashboard](https://dash.cloudflare.com/)
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/1.webp" />
1. Go to **Networking** in the sidebar.
2. Click on **Tunnels**
3. Click on **Create tunnel** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/2.webp" />
1. On the Zero Trust page, go to **Networks** in the sidebar.
2. Click on **Tunnels**
3. Click on **Add a tunnel** button
You will be prompted to choose a tunnel type. Click the **Select Cloudflared** button.
You will be prompted to enter a tunnel name. Enter a name that you prefer and click on **Create tunnel** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/3.webp" />
You will be prompted to enter a tunnel name. Choose a name that you prefer.
1. Select the **Docker** option
2. Copy the docker run 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.
## 3. Deploy cloudflared on Coolify
Go to your project on Coolify dashboard and click the `+ New` button to create a new resource.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/4.webp" />
Next you will see the configuration page with multiple options to install cloudflared.
Search for `Cloudflared` and click on it.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/5.webp" />
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.
Go to the **Environment Variables** page, enter your tunnel token, and deploy the Cloudflared app.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/6.webp" />
Scroll down until you see the **Next** button, then click it.
Then, you will be prompted to add a hostname.
Once cloudflared starts running you will be able to see it's status on Cloudflare dashboard
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/7.webp" />
1. **Subdomain** - (Optional) You can make your app/resource accessible on any subdomain/domain. For this guide, we are not using a subdomain.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Type** - Choose **HTTP** (this is very important).
5. **URL** - Enter **localhost:4477** The port 4477 is the one we mapped to the host system in [Step 1](#_1-setup-your-app-for-tunneling). Replace 4477 with your own port.
6. After filling in the details, click the **Save Tunnel** button.
Click on continue button to create the tunnel.
## 3. Setup Cloudflare Tunnel on Coolify
To set up the tunnel on Coolify, follow these steps:
## 4. Set Up TLS Encryption
To make Cloudflare use stricter encryption when connecting to your server, configure your TLS encryption in Cloudflare:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/8.webp" />
Go to your project on Coolify dashboard and click the **+ New** button to create a new resource.
1. Go to **SSL/TLS** in Cloudflare.
2. Select **Overview**.
3. Click **Configure** button
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/9.webp" />
You will see many options to deploy a new app. Search for Cloudflared and click on it.
1. Choose **Full (Strict)** as the encryption mode.
2. Click **Save** button
## 5. Configure tunnel routes
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/10.webp" />
Go to the **Environment Variables** page, enter your tunnel token, and deploy the Cloudflared app. This token was copied in [Step 2](#_2-create-a-cloudflare-tunnel)
**Congratulations**! You've successfully set up a resource that can be accessed by anyone on the internet your domain.
<Callout type="error" title="HEADS UP!">
**The steps above show how to tunnel a single resource. Below are the steps for tunneling multiple resources**
</Callout>
## Tunnel Multiple Resources
The easiest way to tunnel multiple resources is by following our [Tunnel All Resources](/integrations/cloudflare/tunnels/all-resource) guide, which uses Coolify's built-in proxy. However, if you prefer not to use the proxy, there are two alternative methods:
- [Tunnel Multiple Single Resources](#tunnel-multiple-single-resources)
- [Tunnel Coolify](#tunnel-coolify)
Tunneling multiple single resources is straightforward, but tunneling Coolify itself requires additional manual setup.
## Tunnel Multiple Single Resources
If you want to expose different apps individually, you can follow our [Tunnel All Resources](/integrations/cloudflare/tunnels/all-resource), or take an alternate approach:
1. Click on your tunnel
2. Click on **Configure** option
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/11.webp" />
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).
1. Select **Routes**.
2. Click **Add route** button
Theres no need to create a separate tunnel for each resources, simply create a new hostname and point it to the port your app is listening on.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/12.webp" />
## Tunnel Coolify
3. Select **Published Application** as the route type
Tunneling Coolify itself to make it accessible over a domain requires a bit more manual configuration. Here's how you can set it up:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/13.webp" />
### 1. Create Public Hostnames in Cloudflare Tunnel
Follow [Step 2](#_2-create-a-cloudflare-tunnel) from the main guide to create public hostnames for each service Coolify exposes. Use the following mapping:
1. **Subdomain** - (Optional) You can make your resource accessible on any subdomain/domain. For this guide, we are using the `helixa` subdomain.
2. **Domain** - Choose the domain you want to use for the tunnel.
3. **Path** - Leave this field empty.
4. **Service URL** - Enter **http://localhost:4477** (this is very important). The port 4477 is the one we mapped to the host system in [Step 1](/integrations/cloudflare/tunnels/single-resource#1-setup-your-app-for-tunneling).
6. After filling in the details, click the **Add route** button.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/14.webp" />
- **Hostnames**:
1. `app.shadowarcanist.com/terminal/ws` → `localhost:6002` (WebSocket terminal)
2. `realtime.shadowarcanist.com` → `localhost:6001` (Realtime server)
3. `app.shadowarcanist.com` → `localhost:8000` (Coolify dashboard)
- **Type**: HTTP (Ensure you select HTTP for each hostname.)
**Congratulations**! You've successfully set up a resource that can be accessed by anyone on the internet on your domain.
---
## Tunnel Multiple Resources
The easiest way to tunnel multiple resources is by following our [Tunnel All Resources](/integrations/cloudflare/tunnels/single-resource) guide, which uses Coolify's built-in proxy.
However, if you prefer not to use the proxy, there are two alternative methods:
<Tabs items={['Tunnel Multiple Single Resources', 'Tunnel Coolify']}>
<Tab value="Tunnel Multiple Single Resources">
If you want to expose different apps individually, you can follow our [Tunnel All Resources](/integrations/cloudflare/tunnels/single-resource), or take an alternate approach:
1. Follow [Step 1](/integrations/cloudflare/tunnels/single-resource#1-setup-your-app-for-tunneling) for your new resource.
2. Create a new route on Cloudflare Tunnel as described in [Step 5](/integrations/cloudflare/tunnels/single-resource#5-configure-tunnel-routes).
Theres no need to create a separate tunnel for each resources, simply create a new route and point it to the port your app is listening on.
</Tab>
<Tab value="Tunnel Coolify">
Tunneling Coolify itself to make it accessible over a domain requires a bit more manual configuration. Here's how you can set it up:
### 1. Create routes in Cloudflare Tunnel [!toc]
Follow [Step 5](/integrations/cloudflare/tunnels/single-resource#5-configure-tunnel-routes) to create routes for each service Coolify exposes. Use the following mapping:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/15.webp" />
| Domain / Path | Service | Purpose |
|--------------------------------------------|-------------------|----------------------|
| `coolify.shadowarcanist.com/terminal/ws` | `http://localhost:6002` | WebSocket terminal |
| `coolify-realtime.shadowarcanist.com` | `http://localhost:6001` | Realtime server |
| `coolify.shadowarcanist.com` | `http://localhost:8000` | Coolify dashboard |
<Callout type="warn" title="HEADS UP!">
The order of the hostnames matters! Be sure to match it exactly as shown above.
The order of the routes matters! Be sure to match it exactly as shown above.
</Callout>
---
### 2. Update Coolifys `.env` File
### 2. Update Coolifys `.env` File [!toc]
After creating public hostnames, update the `.env` file in your Coolify instance located at `/data/coolify/source` to enable connections to the realtime server. Add the following lines:
@@ -200,14 +212,14 @@ REDIS_PASSWORD=<random string>
###########
# Add these lines
PUSHER_HOST=realtime.shadowarcanist.com
PUSHER_HOST=coolify-realtime.shadowarcanist.com
PUSHER_PORT=443
###########
```
This ensures that Coolify uses the Cloudflare Tunnel for its realtime server.
### 3. Restart Coolify
### 3. Restart Coolify [!toc]
Run the following command to restart Coolify and apply the changes:
@@ -215,10 +227,10 @@ Run the following command to restart Coolify and apply the changes:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
```
### 4. Verify the Setup
### 4. Verify the Setup [!toc]
1. Access your Coolify dashboard at `https://app.shadowarcanist.com`.
2. Test the realtime functionality by visiting `https://app.shadowarcanist.com/realtime` in another browser tab. You should see a notification about a test event.
1. Access your Coolify dashboard at `https://coolify.shadowarcanist.com`.
2. Test the realtime functionality by visiting `https://coolify.shadowarcanist.com/realtime` in another browser tab. You should see a notification about a test event.
3. If you know what are you doing, you can check the network tab as well. Search for a websocket connection.
@@ -228,20 +240,31 @@ If you use a firewall, ensure that the required ports (e.g., `8000`, `6001`, `60
</Callout>
</Tab>
</Tabs>
---
## Known issues and Solutions
When you create a new public hostname in [Step 2](#_2-create-a-cloudflare-tunnel), Cloudflare will create a DNS record for the hostname.
When you create a new routes in [Step 5](/integrations/cloudflare/tunnels/single-resource#5-configure-tunnel-routes), Cloudflare will create a DNS record for the hostname.
However, if a DNS record for the hostname already exists, Cloudflare wont create a new one.
However, if a DNS record for the hostname already exists, Cloudflare wont update existing record.
In this case, your app wont work. To fix this issue, follow the steps below:
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/12.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/8.webp" />
First, copy your tunnel ID from the Tunnels page on the Cloudflare dashboard.
1. Click on your tunnel
2. Click on **Configure** option
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/single-resource/13.webp" />
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/18.webp" />
3. Copy your tunnel ID from the Tunnels details section.
<ZoomImage src="/docs/images/integrations/cloudflare/tunnels/all-resource/19.webp" />
Create a new DNS record with the following details:
Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Some files were not shown because too many files have changed in this diff Show More