{"id":34307,"date":"2025-12-07T16:53:48","date_gmt":"2025-12-07T09:53:48","guid":{"rendered":"https:\/\/dps.media\/?p=34307"},"modified":"2025-12-07T16:53:51","modified_gmt":"2025-12-07T09:53:51","slug":"huong-dan-tu-host-supabase-tren-fastpanel-voi-docker-portainer-giai-quyet-xung-dot-port","status":"publish","type":"post","link":"https:\/\/dps.media\/zh\/huong-dan-tu-host-supabase-tren-fastpanel-voi-docker-portainer-giai-quyet-xung-dot-port\/","title":{"rendered":"\u4f7f\u7528 Docker &amp; Portainer \u5728 Fastpanel \u4e0a\u81ea\u6258\u7ba1 Supabase \u7684\u6307\u5357\uff08\u89e3\u51b3\u7aef\u53e3\u51b2\u7a81\uff09"},"content":{"rendered":"<?xml encoding=\"utf-8\" ?><p class=\"wp-block-paragraph\">\u60a8\u60f3\u5728 Fastpanel VPS \u4e0a\u8fd0\u884c Supabase\uff08Firebase \u66ff\u4ee3\u54c1\uff09\uff0c\u4f46\u9047\u5230 8000\/3000 \u7aef\u53e3\u51b2\u7a81\u9519\u8bef\uff1f\u672c\u6587\u8be6\u7ec6\u6307\u5bfc\u4f7f\u7528 Docker \u90e8\u7f72 Supabase\uff0c\u4e3a API \u548c Studio Dashboard \u5206\u79bb\u57df\u540d\uff0c\u4f7f\u7cfb\u7edf\u8fd0\u884c\u6700\u7a33\u5b9a\u3002.<\/p><p class=\"wp-block-paragraph\">Supabase \u662f Firebase \u7684\u4e00\u4e2a\u7edd\u4f73\u5f00\u6e90\u66ff\u4ee3\u65b9\u6848\u3002\u7136\u800c\uff0c\u5728\u9884\u88c5\u4e86\u63a7\u5236\u9762\u677f\uff08\u5982 Fastpanel\u3001CyberPanel...\uff09\u7684 VPS \u4e0a\u81ea\u6258\u7ba1 (Self-host) Supabase \u901a\u5e38\u4f1a\u9047\u5230\u8bb8\u591a\u56f0\u96be\uff0c\u7279\u522b\u662f\u5173\u4e8e <strong>\u53cd\u5411\u4ee3\u7406<\/strong> v\u00e0 <strong>\u7aef\u53e3\u51b2\u7a81\uff08Port Conflict\uff09<\/strong>.<\/p><p class=\"wp-block-paragraph\">\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cSupabase \u4f7f\u7528\u7aef\u53e3 <code data-no-translation=\"\">8000<\/code> \u7528\u4e8e API Gateway\uff0c\u6b64\u7aef\u53e3\u901a\u5e38\u88ab\u5176\u4ed6\u670d\u52a1\uff08\u5982 Portainer \u6216\u9ed8\u8ba4 Nginx\uff09\u5360\u7528\u3002\u6b64\u5916\uff0c\u7ba1\u7406\u4eea\u8868\u677f\uff08Supabase Studio\uff09\u5728\u7aef\u53e3 <code data-no-translation=\"\">3000<\/code> \u9690\u79d8\u8fd0\u884c\uff0c\u9700\u8981\u6b63\u786e\u914d\u7f6e\u624d\u80fd\u8bbf\u95ee\u3002.<\/p><p class=\"wp-block-paragraph\">\u5728\u672c\u6587\u4e2d\uff0c, <strong>DPS \u5a92\u4f53<\/strong> \u5c06\u5206\u4eab\u5728 Ubuntu 24.04 \u4e0a\u4f7f\u7528 Fastpanel \u90e8\u7f72 Supabase \u7684\u7ecf\u9a8c\uff0c\u91c7\u7528\u81ea\u5b9a\u4e49\u7aef\u53e3\u914d\u7f6e\uff1a <strong>API \u8fd0\u884c\u7aef\u53e3 8008<\/strong> v\u00e0 <strong>Studio \u8fd0\u884c\u7aef\u53e3 3003<\/strong>.<\/p><h2 class=\"wp-block-heading\">1. \u51c6\u5907\u8d44\u6e90<\/h2><ul class=\"wp-block-list\">\n<li><strong>VPS:<\/strong> Ubuntu 22.04 \u6216 24.04\uff08\u5efa\u8bae\u81f3\u5c11 4GB RAM\uff09\u3002.<\/li>\n\n\n\n<li><strong>Fastpanel:<\/strong> \u5df2\u9884\u88c5\u3002.<\/li>\n\n\n\n<li><strong>Docker &amp; Portainer\uff1a<\/strong> \u5df2\u5b89\u88c5\uff08\u67e5\u770b\u524d\u9762\u7684\u6307\u5357\uff09\u3002.<\/li>\n\n\n\n<li><strong>\u57df\u540d\uff1a<\/strong> \u60a8\u9700\u8981\u51c6\u5907 2 \u4e2a\u5b50\u57df\u540d\uff1a\n<ul class=\"wp-block-list\">\n<li><code data-no-translation=\"\">studio.domain.com<\/code>: \u7528\u4e8e\u7ba1\u7406\u754c\u9762\u3002.<\/li>\n\n\n\n<li><code data-no-translation=\"\">spb.domain.com<\/code>: \u7528\u4e8e API \u540e\u7aef\u3002.<\/li>\n<\/ul>\n<\/li>\n<\/ul><h2 class=\"wp-block-heading\">2. \u4e0b\u8f7d Supabase \u6e90\u4ee3\u7801<\/h2><p class=\"wp-block-paragraph\">\u4f7f\u7528 root \u6743\u9650 SSH \u8bbf\u95ee VPS \u5e76\u4e0b\u8f7d Supabase \u7684 Docker \u90e8\u7f72\u5305\uff1a<\/p><p class=\"wp-block-paragraph\">Bash<\/p><pre class=\"wp-block-code\" data-no-translation=\"\"><code data-no-translation=\"\"># Di chuy\u1ec3n \u0111\u1ebfn th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c\ncd \/opt\n\n# T\u1ea3i source code t\u1eeb Github\ngit clone --depth 1 https:\/\/github.com\/supabase\/supabase\n\n# V\u00e0o th\u01b0 m\u1ee5c ch\u1ee9a c\u1ea5u h\u00ecnh Docker\ncd supabase\/docker\n<\/code><\/pre><h2 class=\"wp-block-heading\">3. \u914d\u7f6e Docker Compose\uff08\u907f\u514d\u7aef\u53e3\u51b2\u7a81\uff09<\/h2><p class=\"wp-block-paragraph\">\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u6b65\u3002\u6211\u4eec\u5c06\u4e0d\u4f7f\u7528\u9ed8\u8ba4\u7aef\u53e3 (8000) \u4ee5\u907f\u514d\u4e0e Portainer \u6216\u5176\u4ed6\u670d\u52a1\u51b2\u7a81\u3002.<\/p><p class=\"wp-block-paragraph\">\u6253\u5f00\u6587\u4ef6 <code data-no-translation=\"\">docker-compose.yml<\/code>:<\/p><p class=\"wp-block-paragraph\">Bash<\/p><pre class=\"wp-block-code\" data-no-translation=\"\"><code data-no-translation=\"\">nano docker-compose.yml\n<\/code><\/pre><p class=\"wp-block-paragraph\"><strong>\u8fdb\u884c 2 \u4e2a\u91cd\u8981\u66f4\u6539\uff1a<\/strong><\/p><ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u4e3a Studio\uff08\u754c\u9762\uff09\u6253\u5f00\u7aef\u53e3\uff1a<\/strong> \u67e5\u627e service <code data-no-translation=\"\">studio<\/code>, \u6dfb\u52a0\u90e8\u5206 <code data-no-translation=\"\">ports<\/code> \u5c06 VPS \u7684 3003 \u7aef\u53e3\u6620\u5c04\u5230\u5bb9\u5668\u7684 3000 \u7aef\u53e3\u3002.<\/li>\n\n\n\n<li><strong>\u66f4\u6539 Kong (API) \u7684\u7aef\u53e3\uff1a<\/strong> \u67e5\u627e service <code data-no-translation=\"\">kong<\/code>, \u5c06\u6620\u5c04\u7aef\u53e3\u6539\u4e3a 8008\u3002.<\/li>\n<\/ol><p class=\"wp-block-paragraph\">\u4fee\u6539\u540e\u7684\u4ee3\u7801\u6bb5\u5c06\u5982\u4e0b\u6240\u793a\uff1a<\/p><p class=\"wp-block-paragraph\">YAML<\/p><pre class=\"wp-block-code\" data-no-translation=\"\"><code data-no-translation=\"\">services:\n  studio:\n    image: supabase\/studio:2025...\n    # ... c\u00e1c config kh\u00e1c gi\u1eef nguy\u00ean\n    ports:\n      - \"3003:3000\"  # Map Host 3003 -> Container 3000\n\n  kong:\n    image: kong:2.8.1\n    # ... c\u00e1c config kh\u00e1c gi\u1eef nguy\u00ean\n    ports:\n      - \"8008:8000\/tcp\" # Map Host 8008 -> Container 8000 (API)\n      - \"${KONG_HTTPS_PORT}:8443\/tcp\"\n<\/code><\/pre><h2 class=\"wp-block-heading\">4. \u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff08.env\uff09<\/h2><p class=\"wp-block-paragraph\">\u590d\u5236\u793a\u4f8b\u6587\u4ef6\u5e76\u7f16\u8f91\uff1a<\/p><p class=\"wp-block-paragraph\">Bash<\/p><pre class=\"wp-block-code\" data-no-translation=\"\"><code data-no-translation=\"\">cp .env.example .env\nnano .env\n<\/code><\/pre><p class=\"wp-block-paragraph\">\u60a8\u9700\u8981\u586b\u5199\u5f3a\u5bc6\u7801\uff08\u6570\u636e\u5e93\u3001JWT \u5bc6\u94a5\uff09\uff0c\u6700\u91cd\u8981\u7684\u662f\u914d\u7f6e URL \u4ee5\u5339\u914d\u5df2\u51c6\u5907\u7684 2 \u4e2a\u5b50\u57df\u540d\u3002.<\/p><p class=\"wp-block-paragraph\"><strong>\u5fc5\u987b\u4fee\u6539\u7684\u53c2\u6570\uff1a<\/strong><\/p><p class=\"wp-block-paragraph\">Bash<\/p><pre class=\"wp-block-code\" data-no-translation=\"\"><code data-no-translation=\"\"># 1. B\u1ea3o m\u1eadt (T\u1ef1 t\u1ea1o chu\u1ed7i ng\u1eabu nhi\u00ean m\u1ea1nh)\nPOSTGRES_PASSWORD=MatKhauDbCucManh!!!\nJWT_SECRET=Chuoi_JWT_Bi_Mat_Dai_It_Nhat_32_Ky_Tu\nDASHBOARD_PASSWORD=MatKhauDangNhapWeb!!!\n\n# 2. C\u1ea5u h\u00ecnh Port API (Ph\u1ea3i kh\u1edbp v\u1edbi file yml \u1edf tr\u00ean)\nKONG_HTTP_PORT=8008\n\n# 3. C\u1ea5u h\u00ecnh Domain (Quan tr\u1ecdng)\n# SITE_URL: L\u00e0 \u0111\u1ecba ch\u1ec9 truy c\u1eadp Giao di\u1ec7n Studio\nSITE_URL=https:\/\/studio.domain.com\n\n# SUPABASE_PUBLIC_URL: L\u00e0 \u0111\u1ecba ch\u1ec9 API (Studio s\u1ebd g\u1ecdi v\u00e0o link n\u00e0y \u0111\u1ec3 l\u1ea5y data)\n# L\u01afU \u00dd: Ph\u1ea3i \u0111i\u1ec1n domain API, KH\u00d4NG \u0111i\u1ec1n domain Studio\nSUPABASE_PUBLIC_URL=https:\/\/spb.domain.com\n\n# API Auth: C\u0169ng tr\u1ecf v\u1ec1 domain API\nAPI_EXTERNAL_URL=https:\/\/spb.domain.com\n\n# Redirect URL: Th\u00eam c\u1ea3 domain studio v\u00e0o \u0111\u1ec3 login xong quay v\u1ec1 \u0111\u00fang ch\u1ed7\nADDITIONAL_REDIRECT_URLS=https:\/\/studio.domain.com,https:\/\/spb.domain.com\n<\/code><\/pre><h2 class=\"wp-block-heading\">5. \u542f\u52a8 Supabase<\/h2><p class=\"wp-block-paragraph\">\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u8ba9 Docker \u4e0b\u8f7d\u5e76\u6784\u5efa\u7cfb\u7edf\uff1a<\/p><p class=\"wp-block-paragraph\">Bash<\/p><pre class=\"wp-block-code\" data-no-translation=\"\"><code data-no-translation=\"\">docker compose up -d\n<\/code><\/pre><p class=\"wp-block-paragraph\"><em>\u6ce8\u610f\uff1a\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981 5-10 \u5206\u949f\u4e0b\u8f7d\u7ea6 1GB \u955c\u50cf\u3002.<\/em><\/p><h2 class=\"wp-block-heading\">6. \u5728 Fastpanel \u4e0a\u914d\u7f6e\u53cd\u5411\u4ee3\u7406<\/h2><p class=\"wp-block-paragraph\">\u8981\u8bbf\u95ee\u7f51\u9875\u800c\u65e0\u9700\u8f93\u5165 <code data-no-translation=\"\">IP:3003<\/code>, \u6211\u4eec\u4f7f\u7528 Fastpanel \u7684 Proxy \u529f\u80fd\u3002.<\/p><h3 class=\"wp-block-heading\">\u9875\u9762 1\uff1a\u7ba1\u7406\u754c\u9762\uff08Studio\uff09<\/h3><ol start=\"1\" class=\"wp-block-list\">\n<li>\u521b\u5efa\u65b0\u7ad9\u70b9\uff1a <strong>\u53cd\u5411\u4ee3\u7406<\/strong>.<\/li>\n\n\n\n<li>\u57df\u540d\uff1a <code data-no-translation=\"\">studio.domain.com<\/code>.<\/li>\n\n\n\n<li>Upstream: <code data-no-translation=\"\">http:\/\/127.0.0.1:3003<\/code>.<\/li>\n\n\n\n<li><strong>C\u1ef1c k\u1ef3 quan tr\u1ecdng:<\/strong> \u8fdb\u5165 Settings -&gt; Static Content -&gt; <strong>\u5173\u95ed<\/strong> \u884c <em>\u201cUse NGINX for static files\u201d<\/em>.<\/li>\n\n\n\n<li>\u5b89\u88c5 SSL Let\u2019s Encrypt\u3002.<\/li>\n<\/ol><h3 class=\"wp-block-heading\">\u9875\u9762 2\uff1aAPI \u540e\u7aef\uff08Supabase\uff09<\/h3><ol start=\"1\" class=\"wp-block-list\">\n<li>\u521b\u5efa\u65b0\u7ad9\u70b9\uff1a <strong>\u53cd\u5411\u4ee3\u7406<\/strong>.<\/li>\n\n\n\n<li>\u57df\u540d\uff1a <code data-no-translation=\"\">spb.domain.com<\/code>.<\/li>\n\n\n\n<li>Upstream: <code data-no-translation=\"\">http:\/\/127.0.0.1:8008<\/code>.<\/li>\n\n\n\n<li>C\u0169ng <strong>\u5173\u95ed<\/strong> \u884c <em>\u201cUse NGINX for static files\u201d<\/em>.<\/li>\n\n\n\n<li>\u5b89\u88c5 SSL Let\u2019s Encrypt\u3002.<\/li>\n<\/ol><p class=\"wp-block-paragraph\"><em>\uff08\u6ce8\u610f\uff1a\u9875\u9762 <code data-no-translation=\"\">spb<\/code> \u76f4\u63a5\u8bbf\u95ee\u65f6\u4f1a\u62a5 404 Not Found \u9519\u8bef\uff0c\u8fd9\u662f\u6b63\u5e38\u7684\uff0c\u56e0\u4e3a API Gateway \u6ca1\u6709\u754c\u9762\uff09\u3002.<\/em><\/p><h2 class=\"wp-block-heading\">7. \u7ed3\u679c &amp; \u767b\u5f55<\/h2><p class=\"wp-block-paragraph\">\u73b0\u5728\u60a8\u8bbf\u95ee\uff1a <strong><code data-no-translation=\"\">https:\/\/studio.domain.com<\/code><\/strong><\/p><ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u8d26\u53f7\u767b\u5f55\uff1a <code data-no-translation=\"\">supabase<\/code> \/ \u60a8\u5728\u8bbe\u7f6e\u4e2d\u7684\u5bc6\u7801 <code data-no-translation=\"\">.env<\/code>.<\/li>\n<\/ul><p class=\"wp-block-paragraph\"><strong>\u5f00\u53d1\u8fde\u63a5\u53c2\u6570\uff1a<\/strong><\/p><ul class=\"wp-block-list\">\n<li><strong>\u9879\u76ee URL\uff1a<\/strong> <code data-no-translation=\"\">https:\/\/spb.domain.com<\/code><\/li>\n\n\n\n<li><strong>\u533f\u540d\/\u670d\u52a1\u5bc6\u94a5\uff1a<\/strong> \u5728 Dashboard\uff08Settings -&gt; API\uff09\u4e2d\u83b7\u53d6\u3002.<\/li>\n<\/ul><h2 class=\"wp-block-heading\">\u603b\u7ed3<\/h2><p class=\"wp-block-paragraph\">\u5206\u79bb <strong>Studio (\u7aef\u53e3 3003)<\/strong> v\u00e0 <strong>API (\u7aef\u53e3 8008)<\/strong> \u5e2e\u52a9 Supabase \u7cfb\u7edf\u5728 Fastpanel \u4e0a\u987a\u7545\u8fd0\u884c\uff0c\u800c\u4e0d\u5e72\u6270\u5176\u4ed6\u9ed8\u8ba4\u670d\u52a1\u3002\u5e0c\u671b\u8fd9\u4e2a\u6307\u5357\u80fd\u5e2e\u52a9\u4f60\u81ea\u4e3b\u638c\u63a7\u5f3a\u5927\u7684 Backend \u57fa\u7840\u8bbe\u65bd\u3002.<\/p><hr class=\"wp-block-separator has-alpha-channel-opacity\"><p class=\"wp-block-paragraph\"><em>\u6765\u6e90\uff1a <a class=\"wpil_keyword_link\" href=\"https:\/\/dps.media\/zh\/\" title=\"DPS.MEDIA \u80a1\u4efd\u516c\u53f8\" data-wpil-keyword-link=\"linked\" data-wpil-monitor-id=\"588\">dps.media<\/a><\/em><\/p><p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>B\u1ea1n mu\u1ed1n ch\u1ea1y Supabase (Firebase Alternative) tr\u00ean VPS Fastpanel nh\u01b0ng g\u1eb7p l\u1ed7i xung \u0111\u1ed9t c\u1ed5ng 8000\/3000? B\u00e0i vi\u1ebft n\u00e0y h\u01b0\u1edbng d\u1eabn chi ti\u1ebft c\u00e1ch deploy Supabase v\u1edbi Docker, t\u00e1ch ri\u00eang domain cho API v\u00e0 Studio Dashboard \u0111\u1ec3 h\u1ec7 th\u1ed1ng ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh nh\u1ea5t.Supabase l\u00e0 m\u1ed9t gi\u1ea3i ph\u00e1p thay th\u1ebf m\u00e3 ngu\u1ed3n m\u1edf tuy\u1ec7t v\u1eddi [&hellip;]<\/p>","protected":false},"author":1,"featured_media":34308,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,1621],"tags":[],"class_list":["post-34307","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","category-fastpanel"],"acf":[],"rankmath_keywords":{"primary":"","secondary":[""]},"yoast_keywords":{"primary":"","secondary":[]},"yoast_focuskw":"","rankmath_focuskw":"","seo_keywords":{"primary":"","secondary":[""]},"_links":{"self":[{"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/posts\/34307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/comments?post=34307"}],"version-history":[{"count":0,"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/posts\/34307\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/media\/34308"}],"wp:attachment":[{"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/media?parent=34307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/categories?post=34307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dps.media\/zh\/wp-json\/wp\/v2\/tags?post=34307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}