{"id":43593,"date":"2026-09-16T11:10:57","date_gmt":"2026-09-16T04:10:57","guid":{"rendered":"https:\/\/interdata.vn\/blog\/?p=43593"},"modified":"2026-09-16T11:10:57","modified_gmt":"2026-09-16T04:10:57","slug":"tu-host-supabase-tren-ubuntu-server","status":"publish","type":"post","link":"https:\/\/interdata.vn\/blog\/tu-host-supabase-tren-ubuntu-server\/","title":{"rendered":"H\u01b0\u1edbng D\u1eabn T\u1ef1 Host Supabase Tr\u00ean Ubuntu Server Chi Ti\u1ebft T\u1eeb A-Z"},"content":{"rendered":"<p style=\"text-align: justify;\"><span style=\"font-size: 100%;\"><strong>T\u1ef1 host Supabase tr\u00ean Ubuntu Server<\/strong> l\u00e0 l\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean mu\u1ed1n s\u1edf h\u1eefu h\u1ea1 t\u1ea7ng Backend-as-a-Service (BaaS) m\u1ea1nh m\u1ebd, to\u00e0n quy\u1ec1n ki\u1ec3m so\u00e1t c\u01a1 s\u1edf d\u1eef li\u1ec7u PostgreSQL m\u00e0 kh\u00f4ng lo ng\u1ea1i chi ph\u00ed t\u0103ng cao theo quy m\u00f4 t\u1eeb c\u00e1c d\u1ecbch v\u1ee5 Cloud. B\u00e0i vi\u1ebft n\u00e0y c\u1ee7a <a href=\"https:\/\/interdata.vn\/\">InterData<\/a> s\u1ebd h\u01b0\u1edbng d\u1eabn b\u1ea1n t\u1eebng b\u01b0\u1edbc tri\u1ec3n khai h\u1ec7 th\u1ed1ng ho\u00e0n ch\u1ec9nh b\u1eb1ng Docker Compose, t\u1ed1i \u01b0u b\u1ea3o m\u1eadt v\u00e0 s\u1eb5n s\u00e0ng \u0111\u01b0a v\u00e0o v\u1eadn h\u00e0nh th\u1ef1c t\u1ebf.<\/span><\/p>\n<div style=\"background-color: #eff6ff; padding: 20px; border: 1.5px solid #BFDBFE; border-radius: 12px; margin-bottom: 30px; box-shadow: 0 8px 20px rgba(37,99,235,0.05);\">\n<p style=\"font-family: 'Be Vietnam Pro', sans-serif; font-weight: bold; font-size: 18px; margin: 0 0 15px; color: #1e3a8a;\">N\u1ed8I DUNG B\u00c0I VI\u1ebeT<\/p>\n<ul style=\"list-style-type: none; padding-left: 0; margin: 0;\">\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section1\">1. Y\u00eau c\u1ea7u c\u1ea5u h\u00ecnh ph\u1ea7n c\u1ee9ng \u0111\u1ec3 t\u1ef1 host Supabase tr\u00ean Ubuntu Server<\/a><\/li>\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section2\">2. B\u01b0\u1edbc 1: Chu\u1ea9n b\u1ecb Ubuntu Server v\u00e0 c\u00e0i \u0111\u1eb7t Docker Compose<\/a><\/li>\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section3\">3. B\u01b0\u1edbc 2: T\u1ea3i m\u00e3 ngu\u1ed3n Supabase v\u00e0 c\u1ea5u h\u00ecnh bi\u1ebfn m\u00f4i tr\u01b0\u1eddng an to\u00e0n<\/a><\/li>\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section4\">4. B\u01b0\u1edbc 3: Kh\u1edfi ch\u1ea1y c\u1ee5m container Supabase v\u1edbi Docker Compose<\/a><\/li>\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section5\">5. B\u01b0\u1edbc 4: Thi\u1ebft l\u1eadp Reverse Proxy Nginx, SSL v\u00e0 t\u01b0\u1eddng l\u1eeda UFW<\/a><\/li>\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section6\">6. B\u01b0\u1edbc 5: Gi\u00e1m s\u00e1t, sao l\u01b0u c\u01a1 s\u1edf d\u1eef li\u1ec7u v\u00e0 n\u00e2ng c\u1ea5p h\u1ea1 t\u1ea7ng<\/a><\/li>\n<li style=\"margin-bottom: 10px;\"><a style=\"text-decoration: none; color: #2563eb; font-weight: 600;\" href=\"#section7\">7. C\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p khi t\u1ef1 host Supabase (FAQ)<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n<style>\n.interdata-plan-carousel,.interdata-plan-carousel *{box-sizing:border-box}\n.interdata-plan-carousel{--blue:#005bea;--blue-dark:#004dcc;--text:#071832;--muted:#516173;--border:#d8e6fb;--bg:#f3f8ff;--shadow:0 5px 14px rgba(0,62,145,.08);background:var(--bg);padding:14px 56px 18px;position:relative;overflow:hidden;border-radius:20px;}\n.interdata-carousel-heading{color:#f00;font-family:Roboto,sans-serif;font-size:18px;line-height:1.35;font-weight:800;text-align:center;margin:0 0 14px}\n.interdata-plan-viewport{overflow:hidden;width:100%}\n.interdata-plan-track{display:flex;align-items:stretch;gap:12px;overflow:visible;padding:0 0 4px;transform:translate3d(0,0,0);transition:transform .45s ease;will-change:transform;touch-action:pan-y}\n.interdata-plan-card{flex:0 0 calc((100% - 24px)\/3);min-width:0;min-height:0!important;height:auto;background:#fff;border:1px solid var(--border);border-radius:8px;padding:15px 12px 13px;display:flex;flex-direction:column;box-shadow:var(--shadow)}\n.interdata-plan-title{color:var(--blue-dark);font-size:16px;line-height:1.22;font-weight:800;text-align:center;margin:0 0 7px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.interdata-plan-price{color:var(--blue-dark);font-size:24px;line-height:1;font-weight:900;text-align:center;margin-bottom:12px;white-space:nowrap;letter-spacing:0}\n.interdata-plan-price span{font-size:10px;font-weight:800;margin-left:2px}\n.interdata-plan-badge{align-self:center;display:inline-flex;align-items:center;justify-content:center;background:#ff3934;color:#fff;border-radius:5px;padding:7px 8px;font-size:9px;line-height:1;font-weight:800;margin-bottom:15px;white-space:nowrap;max-width:100%}\n.interdata-plan-features{list-style:none!important;padding:0!important;margin:0!important}\n.interdata-plan-features li{display:flex;gap:7px;align-items:flex-start;color:var(--text);font-size:12px;line-height:1.35;font-weight:700;text-align:left;margin:0 0 10px!important;padding:0!important}\n.interdata-plan-icon{width:14px;min-width:14px;height:14px;color:#0069ff;margin-top:2px}\n.interdata-plan-icon svg{display:block;width:100%;height:100%;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}\n.interdata-plan-spacer{flex:1;min-height:16px}\n.interdata-plan-button{display:flex;align-items:center;justify-content:center;min-height:42px;width:100%;margin-top:auto!important;margin-bottom:0!important;background:var(--blue);color:#fff!important;border-radius:5px;font-size:13px;font-weight:800;text-decoration:none!important;box-shadow:0 7px 14px rgba(0,91,234,.24);transition:transform .2s ease,background .2s ease}\n.interdata-plan-button:hover{background:var(--blue-dark);color:#fff!important;transform:translateY(-1px)}\n.interdata-carousel-arrow{position:absolute;top:50%;z-index:5;width:44px;height:54px;border:2px solid #fff!important;border-radius:999px;background:var(--blue)!important;color:#fff!important;box-shadow:0 8px 22px rgba(0,62,145,.32);display:flex!important;align-items:center;justify-content:center;cursor:pointer;transform:translateY(-35%);transition:background .2s ease,color .2s ease,opacity .2s ease,transform .2s ease}\n.interdata-carousel-arrow:hover{background:var(--blue-dark)!important;color:#fff!important;transform:translateY(-35%) scale(1.04)}\n.interdata-carousel-arrow:disabled{opacity:.78;cursor:not-allowed;background:#8aa6cf!important;color:#fff!important}\n.interdata-carousel-arrow:disabled:hover{background:#8aa6cf!important;color:#fff!important;transform:translateY(-35%)}\n.interdata-carousel-arrow svg{display:none!important}\n.interdata-carousel-arrow:before{content:none!important;display:none!important}\n.interdata-carousel-mark{display:block!important;color:#fff!important;font-family:Arial,Helvetica,sans-serif!important;font-size:38px!important;font-weight:900!important;line-height:1!important;text-align:center!important;pointer-events:none!important;transform:translateY(-2px)}\n.interdata-carousel-prev{left:14px}\n.interdata-carousel-prev .interdata-carousel-mark{margin-left:-2px}\n.interdata-carousel-next{right:14px}\n.interdata-carousel-next .interdata-carousel-mark{margin-right:-2px}\n@media (max-width:800px){.interdata-plan-carousel{padding:12px 44px 16px}.interdata-plan-card{flex-basis:calc((100% - 12px)\/2)}.interdata-carousel-heading{font-size:16px}.interdata-carousel-prev{left:6px}.interdata-carousel-next{right:6px}}\n@media (max-width:480px){.interdata-plan-carousel{padding:12px 38px 16px}.interdata-plan-card{flex-basis:100%}.interdata-plan-price{font-size:23px}.interdata-carousel-arrow{width:34px;height:44px}.interdata-carousel-mark{font-size:32px!important}.interdata-carousel-prev{left:3px}.interdata-carousel-next{right:3px}}\n<\/style>\n\n<div class=\"interdata-plan-carousel\" data-interdata-carousel>\n  <div class=\"interdata-carousel-heading\">Si\u00eau \u01afu \u0110\u00e3i VPS \/ CLOUD SERVER - Ti\u1ebft Ki\u1ec7m \u0110\u1ebfn 70%<\/div>\n\n  <svg width=\"0\" height=\"0\" style=\"position:absolute;visibility:hidden\" aria-hidden=\"true\">\n    <symbol id=\"id-icon-cpu\" viewBox=\"0 0 24 24\"><rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"2\"><\/rect><path d=\"M4 9h3M4 15h3M17 9h3M17 15h3M9 4v3M15 4v3M9 17v3M15 17v3\"><\/path><path d=\"M10 10h4v4h-4z\"><\/path><\/symbol>\n    <symbol id=\"id-icon-ram\" viewBox=\"0 0 24 24\"><rect x=\"4\" y=\"8\" width=\"16\" height=\"8\" rx=\"2\"><\/rect><path d=\"M7 16v2M11 16v2M15 16v2M19 16v2M7 11h1M11 11h1M15 11h1\"><\/path><\/symbol>\n    <symbol id=\"id-icon-storage\" viewBox=\"0 0 24 24\"><rect x=\"6\" y=\"3\" width=\"12\" height=\"18\" rx=\"2\"><\/rect><path d=\"M9 7h6\"><\/path><circle cx=\"12\" cy=\"16\" r=\"1.5\"><\/circle><\/symbol>\n    <symbol id=\"id-icon-network\" viewBox=\"0 0 24 24\"><path d=\"M5 12.5a10 10 0 0 1 14 0\"><\/path><path d=\"M8.5 16a5 5 0 0 1 7 0\"><\/path><path d=\"M12 19h.01\"><\/path><\/symbol>\n    <symbol id=\"id-icon-gift\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"8\" width=\"18\" height=\"13\" rx=\"2\"><\/rect><path d=\"M12 8v13M3 12h18\"><\/path><path d=\"M7.5 8C6.1 8 5 6.9 5 5.5S6.1 3 7.5 3C10 3 12 8 12 8\"><\/path><path d=\"M16.5 8C17.9 8 19 6.9 19 5.5S17.9 3 16.5 3C14 3 12 8 12 8\"><\/path><\/symbol>\n  <\/svg>\n\n  <button class=\"interdata-carousel-arrow interdata-carousel-prev\" type=\"button\" aria-label=\"Xem 3 g\u00f3i tr\u01b0\u1edbc\" onclick=\"var r=this.closest('[data-interdata-carousel]');if(!r)return false;var t=r.querySelector('.interdata-plan-track'),c=t?t.querySelectorAll('.interdata-plan-card'):[];if(!t||!c.length)return false;var v=window.matchMedia('(max-width:480px)').matches?1:(window.matchMedia('(max-width:800px)').matches?2:3),m=Math.max(0,c.length-Math.min(v,c.length||1)),s=[],i=0;while(i&lt;m){s.push(i);i+=v}if(!s.length||s[s.length-1]!==m)s.push(m);var p=parseInt(r.getAttribute('data-inline-page')||'0',10);p=(p-1+s.length)%s.length;r.setAttribute('data-inline-page',p);var g=parseFloat(window.getComputedStyle(t).gap)||12,w=c[0].getBoundingClientRect().width;t.style.transition='transform .45s ease';t.style.transform='translate3d('+(-(w+g)*s[p])+'px,0,0)';return false;\">\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M15 18l-6-6 6-6\"><\/path><\/svg>\n    <span class=\"interdata-carousel-mark\" aria-hidden=\"true\">&#8249;<\/span>\n  <\/button>\n\n  <div class=\"interdata-plan-viewport\">\n    <div class=\"interdata-plan-track\">\n      <!-- 7 card d\u1ef1 ph\u00f2ng: JavaScript s\u1ebd \u0111\u1ed3ng b\u1ed9 l\u1ea1i t\u1eeb API portal khi trang t\u1ea3i. -->\n      <article class=\"interdata-plan-card\" data-plan-pid=\"490\">\n        <h3 class=\"interdata-plan-title\">Premium Base<\/h3>\n        <div class=\"interdata-plan-price\">299.000 \u0111<span>\/3 th\u00e1ng<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>2 vCore Intel Xeon Scalable<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>2 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>30 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>300Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/best-value-plans-2026\/best-value-plans-premium-base\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n\n      <article class=\"interdata-plan-card\" data-plan-pid=\"529\">\n        <h3 class=\"interdata-plan-title\">INTER PLATINUM 1<\/h3>\n        <div class=\"interdata-plan-price\">998.000 \u0111<span>\/n\u0103m<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>2 vCore<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>3 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>30 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>300Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/inter-platinum-series-2026\/inter-platinum-1\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n\n      <article class=\"interdata-plan-card\" data-plan-pid=\"530\">\n        <h3 class=\"interdata-plan-title\">INTER PLATINUM 2<\/h3>\n        <div class=\"interdata-plan-price\">2.666.000 \u0111<span>\/n\u0103m<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>5 vCore<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>8 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>70 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>300Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/inter-platinum-series-2026\/inter-platinum-2\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n\n      <article class=\"interdata-plan-card\" data-plan-pid=\"531\">\n        <h3 class=\"interdata-plan-title\">INTER PLATINUM 3<\/h3>\n        <div class=\"interdata-plan-price\">5.888.000 \u0111<span>\/n\u0103m<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>9 vCore<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>16 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>140 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>300Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/inter-platinum-series-2026\/inter-platinum-3\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n\n      <article class=\"interdata-plan-card\" data-plan-pid=\"521\">\n        <h3 class=\"interdata-plan-title\">BD-Cloud 1<\/h3>\n        <div class=\"interdata-plan-price\">988.000 \u0111<span>\/n\u0103m<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>3 vCore<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>3 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>30 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>300Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/best-plan-real-cloud\/bd-cloud-1\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n\n      <article class=\"interdata-plan-card\" data-plan-pid=\"522\">\n        <h3 class=\"interdata-plan-title\">BD-Cloud 2<\/h3>\n        <div class=\"interdata-plan-price\">2.988.000 \u0111<span>\/n\u0103m<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>4 vCore<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>8 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>80 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>300 Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/best-plan-real-cloud\/bd-cloud-2\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n\n      <article class=\"interdata-plan-card\" data-plan-pid=\"523\">\n        <h3 class=\"interdata-plan-title\">BD-Cloud 3<\/h3>\n        <div class=\"interdata-plan-price\">5.999.000 \u0111<span>\/n\u0103m<\/span><\/div>\n        <div class=\"interdata-plan-badge\">GIA H\u1ea0N KH\u00d4NG \u0110\u1ed4I GI\u00c1<\/div>\n        <ul class=\"interdata-plan-features\">\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-cpu\"><\/use><\/svg><\/span>8 vCore<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-ram\"><\/use><\/svg><\/span>16 GB RAM<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-storage\"><\/use><\/svg><\/span>140 GB SSD NVMe<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>1 IPv4 Private<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>400 Mbps Network Port<\/li>\n          <li><span class=\"interdata-plan-icon\"><svg><use href=\"#id-icon-network\"><\/use><\/svg><\/span>Unlimited Bandwidth<\/li>\n        <\/ul>\n\n        <a class=\"interdata-plan-button\" href=\"https:\/\/support.interdata.vn\/index.php?rp=\/store\/best-plan-real-cloud\/bd-cloud-3\" target=\"_blank\" rel=\"noopener\">\u0110\u0103ng k\u00fd ngay<\/a>\n      <\/article>\n    <\/div>\n  <\/div>\n\n  <button class=\"interdata-carousel-arrow interdata-carousel-next\" type=\"button\" aria-label=\"Xem 3 g\u00f3i ti\u1ebfp theo\" onclick=\"var r=this.closest('[data-interdata-carousel]');if(!r)return false;var t=r.querySelector('.interdata-plan-track'),c=t?t.querySelectorAll('.interdata-plan-card'):[];if(!t||!c.length)return false;var v=window.matchMedia('(max-width:480px)').matches?1:(window.matchMedia('(max-width:800px)').matches?2:3),m=Math.max(0,c.length-Math.min(v,c.length||1)),s=[],i=0;while(i&lt;m){s.push(i);i+=v}if(!s.length||s[s.length-1]!==m)s.push(m);var p=parseInt(r.getAttribute('data-inline-page')||'0',10);p=(p+1)%s.length;r.setAttribute('data-inline-page',p);var g=parseFloat(window.getComputedStyle(t).gap)||12,w=c[0].getBoundingClientRect().width;t.style.transition='transform .45s ease';t.style.transform='translate3d('+(-(w+g)*s[p])+'px,0,0)';return false;\">\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 18l6-6-6-6\"><\/path><\/svg>\n    <span class=\"interdata-carousel-mark\" aria-hidden=\"true\">&#8250;<\/span>\n  <\/button>\n<\/div>\n\n<script>\n(function(){\n  var API_GROUPS=[\n    {url:'https:\/\/support.interdata.vn\/packages.php?gid=89&module',pids:[490]},\n    {url:'https:\/\/support.interdata.vn\/packages.php?gid=100&module',pids:[529,530,531]},\n    {url:'https:\/\/support.interdata.vn\/packages.php?gid=97&module',pids:[521,522,523]}\n  ];\n  var PLAN_CYCLES={\n    490:{key:'quarterly',label:'3 th\u00e1ng'},\n    529:{key:'annually',label:'n\u0103m'},\n    530:{key:'annually',label:'n\u0103m'},\n    531:{key:'annually',label:'n\u0103m'},\n    521:{key:'annually',label:'n\u0103m'},\n    522:{key:'annually',label:'n\u0103m'},\n    523:{key:'annually',label:'n\u0103m'}\n  };\n\n  function fetchPlanData(){\n    if(window.interdataPlanApiPromise)return window.interdataPlanApiPromise;\n\n    window.interdataPlanApiPromise=Promise.all(API_GROUPS.map(function(group){\n      return fetch(group.url,{method:'GET',mode:'cors',cache:'no-store'})\n        .then(function(response){\n          if(!response.ok)throw new Error('API '+response.status);\n          return response.json();\n        })\n        .then(function(data){\n          if(!data||data.success!==true||!Array.isArray(data.products))return [];\n          return data.products.filter(function(product){\n            return group.pids.indexOf(Number(product.pid))!==-1;\n          });\n        })\n        .catch(function(error){\n          console.warn('Kh\u00f4ng th\u1ec3 c\u1eadp nh\u1eadt nh\u00f3m g\u00f3i InterData:',group.url,error);\n          return [];\n        });\n    })).then(function(groups){\n      return groups.reduce(function(all,products){return all.concat(products);},[]);\n    });\n\n    return window.interdataPlanApiPromise;\n  }\n\n  function parseDescription(html){\n    var source=String(html||'')\n      .replace(\/<brs*\/?>\/gi,'n')\n      .replace(\/<\/(p|div|li)>\/gi,'n');\n    var holder=document.createElement('div');\n    holder.innerHTML=source;\n    var strong=holder.querySelector('strong');\n    var badge=strong?strong.textContent.trim():'';\n    var lines=(holder.textContent||'').split(\/r?n\/).map(function(line){\n      return line.trim();\n    }).filter(Boolean);\n    if(badge&&lines[0]===badge)lines.shift();\n    return {badge:badge,features:lines};\n  }\n\n  function iconForFeature(feature){\n    if(\/ram\/i.test(feature))return 'id-icon-ram';\n    if(\/ssd|nvme|storage|disk\/i.test(feature))return 'id-icon-storage';\n    if(\/vcore|vcpu|cpu|xeon|amd\/i.test(feature))return 'id-icon-cpu';\n    if(\/ipv4|network|mbps|gbps|bandwidth\/i.test(feature))return 'id-icon-network';\n    return 'id-icon-gift';\n  }\n\n  function createFeatureItem(feature){\n    var item=document.createElement('li');\n    var icon=document.createElement('span');\n    var svg=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','svg');\n    var use=document.createElementNS('http:\/\/www.w3.org\/2000\/svg','use');\n    icon.className='interdata-plan-icon';\n    use.setAttribute('href','#'+iconForFeature(feature));\n    svg.appendChild(use);\n    icon.appendChild(svg);\n    item.appendChild(icon);\n    item.appendChild(document.createTextNode(feature));\n    return item;\n  }\n\n  function updateCardFromApi(root,product){\n    var pid=Number(product.pid);\n    var cycle=PLAN_CYCLES[pid];\n    var card=root.querySelector('[data-plan-pid=\"'+pid+'\"]');\n    if(!card||!cycle)return;\n\n    var title=card.querySelector('.interdata-plan-title');\n    var priceBox=card.querySelector('.interdata-plan-price');\n    var badgeBox=card.querySelector('.interdata-plan-badge');\n    var featureList=card.querySelector('.interdata-plan-features');\n    var button=card.querySelector('.interdata-plan-button');\n    var description=parseDescription(product.description);\n    var pricing=product.pricing&&product.pricing.VND;\n    var price=pricing?Number(pricing[cycle.key]):-1;\n\n    if(title&&product.name)title.textContent=product.name;\n    if(priceBox&&Number.isFinite(price)&&price>=0){\n      priceBox.textContent=Math.round(price).toLocaleString('vi-VN')+' \u0111';\n      var suffix=document.createElement('span');\n      suffix.textContent='\/'+cycle.label;\n      priceBox.appendChild(suffix);\n    }\n    if(badgeBox&&description.badge)badgeBox.textContent=description.badge;\n    if(featureList&&description.features.length){\n      featureList.textContent='';\n      description.features.forEach(function(feature){\n        featureList.appendChild(createFeatureItem(feature));\n      });\n    }\n    if(button&&product.product_url)button.href=product.product_url;\n  }\n\n  function setupInterDataCarousel(root){\n    var track=root.querySelector('.interdata-plan-track');\n    var prev=root.querySelector('.interdata-carousel-prev');\n    var next=root.querySelector('.interdata-carousel-next');\n    if(!track||!prev||!next||track.dataset.ready==='1')return;\n    track.dataset.ready='1';\n    prev.disabled=false;\n    next.disabled=false;\n    var activePage=0;\n    var touchStartX=null;\n\n    function visibleCards(){\n      if(window.matchMedia&&window.matchMedia('(max-width:480px)').matches)return 1;\n      if(window.matchMedia&&window.matchMedia('(max-width:800px)').matches)return 2;\n      return 3;\n    }\n\n    function pageStarts(){\n      var total=track.querySelectorAll('.interdata-plan-card').length;\n      var visible=Math.min(visibleCards(),total||1);\n      var maxStart=Math.max(0,total-visible);\n      var starts=[];\n      var start=0;\n      while(start<maxStart){\n        starts.push(start);\n        start+=visible;\n      }\n      if(!starts.length||starts[starts.length-1]!==maxStart)starts.push(maxStart);\n      return starts;\n    }\n\n    function renderSlide(animate){\n      var cards=track.querySelectorAll('.interdata-plan-card');\n      var starts=pageStarts();\n      if(!cards.length||!starts.length)return;\n      if(activePage>=starts.length)activePage=starts.length-1;\n      if(activePage<0)activePage=0;\n\n      var cardWidth=cards[0].getBoundingClientRect().width;\n      var trackStyle=window.getComputedStyle?window.getComputedStyle(track):null;\n      var gap=trackStyle?parseFloat(trackStyle.columnGap||trackStyle.gap):12;\n      if(!Number.isFinite(gap))gap=12;\n      if(cardWidth<=0)return;\n\n      track.style.transition=animate?'transform .45s ease':'none';\n      track.style.transform='translate3d('+(-(cardWidth+gap)*starts[activePage])+'px,0,0)';\n      prev.setAttribute('aria-disabled',starts.length>1?'false':'true');\n      next.setAttribute('aria-disabled',starts.length>1?'false':'true');\n    }\n\n    function move(direction){\n      var starts=pageStarts();\n      if(starts.length<=1)return;\n      activePage=parseInt(root.getAttribute('data-inline-page')||activePage,10)||0;\n      activePage=(activePage+direction+starts.length)%starts.length;\n      root.setAttribute('data-inline-page',activePage);\n      renderSlide(true);\n    }\n\n    track.addEventListener('touchstart',function(event){\n      touchStartX=event.touches&&event.touches[0]?event.touches[0].clientX:null;\n    },{passive:true});\n    track.addEventListener('touchend',function(event){\n      if(touchStartX===null)return;\n      var endX=event.changedTouches&&event.changedTouches[0]?event.changedTouches[0].clientX:touchStartX;\n      var distance=endX-touchStartX;\n      touchStartX=null;\n      if(Math.abs(distance)>=40)move(distance<0?1:-1);\n    },{passive:true});\n\n    function resetAfterResize(){\n      activePage=0;\n      root.setAttribute('data-inline-page','0');\n      renderSlide(false);\n    }\n\n    window.addEventListener('resize',resetAfterResize);\n    window.addEventListener('load',resetAfterResize);\n    if('ResizeObserver' in window){\n      var resizeObserver=new ResizeObserver(function(){renderSlide(false);});\n      resizeObserver.observe(root);\n    }\n    window.requestAnimationFrame(function(){renderSlide(false);});\n    window.setTimeout(function(){renderSlide(false);},250);\n    window.setTimeout(function(){renderSlide(false);},1000);\n\n    fetchPlanData().then(function(products){\n      products.forEach(function(product){updateCardFromApi(root,product);});\n      renderSlide(false);\n    });\n  }\n\n  function initInterDataCarousels(){\n    document.querySelectorAll('[data-interdata-carousel]').forEach(setupInterDataCarousel);\n  }\n\n  if(document.readyState==='loading'){\n    document.addEventListener('DOMContentLoaded',initInterDataCarousels);\n  }else{\n    initInterDataCarousels();\n  }\n\n  if('MutationObserver' in window){\n    var initQueued=false;\n    new MutationObserver(function(){\n      if(initQueued)return;\n      initQueued=true;\n      window.requestAnimationFrame(function(){\n        initQueued=false;\n        initInterDataCarousels();\n      });\n    }).observe(document.documentElement,{childList:true,subtree:true});\n  }\n})();\n<\/script>\n\n\t<div id=\"gap-1375630094\" class=\"gap-element clearfix\" style=\"display:block; height:auto;\">\n\t\t\n<style>\n#gap-1375630094 {\n  padding-top: 15px;\n}\n<\/style>\n\t<\/div>\n\t\n<h2 id=\"section1\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">1. Y\u00eau c\u1ea7u c\u1ea5u h\u00ecnh ph\u1ea7n c\u1ee9ng \u0111\u1ec3 t\u1ef1 host Supabase tr\u00ean Ubuntu Server<\/h2>\n<p style=\"text-align: justify;\">Supabase kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t \u1ee9ng d\u1ee5ng \u0111\u01a1n l\u1ebb m\u00e0 l\u00e0 m\u1ed9t h\u1ec7 sinh th\u00e1i microservices ch\u1ea1y \u0111\u1ed3ng th\u1eddi h\u01a1n 10 container \u0111\u1ed9c l\u1eadp: Kong (API Gateway), GoTrue (X\u00e1c th\u1ef1c Auth), PostgREST (REST API), Realtime Engine, Supabase Storage, Supabase Studio Dashboard, v\u00e0 l\u00f5i PostgreSQL (t\u00edch h\u1ee3p s\u1eb5n extension pgvector). Do \u0111\u00f3, vi\u1ec7c ph\u00e2n b\u1ed5 t\u00e0i nguy\u00ean ph\u1ea7n c\u1ee9ng ch\u00ednh x\u00e1c \u0111\u00f3ng vai tr\u00f2 quy\u1ebft \u0111\u1ecbnh \u0111\u1ebfn \u0111\u1ed9 \u1ed5n \u0111\u1ecbnh c\u1ee7a to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng.<\/p>\n<p style=\"text-align: justify;\">N\u1ebfu b\u1ea1n ch\u1ea1y tr\u00ean m\u00e1y ch\u1ee7 c\u00f3 c\u1ea5u h\u00ecnh d\u01b0\u1edbi m\u1ee9c t\u1ed1i thi\u1ec3u, h\u1ec7 \u0111i\u1ec1u h\u00e0nh Linux s\u1ebd k\u00edch ho\u1ea1t c\u01a1 ch\u1ebf OOM Killer (Out Of Memory) \u0111\u1ec3 t\u1eaft b\u1edbt container, d\u1eabn \u0111\u1ebfn t\u00ecnh tr\u1ea1ng m\u1ea5t k\u1ebft n\u1ed1i c\u01a1 s\u1edf d\u1eef li\u1ec7u ho\u1eb7c l\u1ed7i c\u1ed5ng Gateway. Tr\u01b0\u1edbc khi ti\u1ebfn h\u00e0nh tri\u1ec3n khai tr\u00ean <a href=\"https:\/\/interdata.vn\/blog\/ubuntu-server-la-gi\/\">h\u1ec7 \u0111i\u1ec1u h\u00e0nh Ubuntu Server<\/a>, b\u1ea1n n\u00ean th\u1ef1c hi\u1ec7n c\u00e1c thao t\u00e1c <a href=\"https:\/\/interdata.vn\/blog\/cach-kiem-tra-cau-hinh-vps\/\">ki\u1ec3m tra c\u1ea5u h\u00ecnh m\u00e1y ch\u1ee7<\/a> hi\u1ec7n t\u1ea1i \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o \u0111\u00e1p \u1ee9ng b\u1ea3ng th\u00f4ng s\u1ed1 k\u1ef9 thu\u1eadt d\u01b0\u1edbi \u0111\u00e2y.<\/p>\n<div style=\"overflow-x: auto; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse; text-align: left; font-size: 14px;\">\n<thead>\n<tr style=\"background-color: #1e3a8a; color: #ffffff;\">\n<th style=\"padding: 12px; border: 1px solid #BFDBFE;\">M\u00f4i tr\u01b0\u1eddng tri\u1ec3n khai<\/th>\n<th style=\"padding: 12px; border: 1px solid #BFDBFE;\">vCPU<\/th>\n<th style=\"padding: 12px; border: 1px solid #BFDBFE;\">Dung l\u01b0\u1ee3ng RAM<\/th>\n<th style=\"padding: 12px; border: 1px solid #BFDBFE;\">\u1ed4 c\u1ee9ng (NVMe SSD)<\/th>\n<th style=\"padding: 12px; border: 1px solid #BFDBFE;\">Khuy\u1ebfn ngh\u1ecb h\u1ea1 t\u1ea7ng<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background-color: #f8fafc;\">\n<td style=\"padding: 10px; border: 1px solid #E2E8F0; font-weight: 600;\">Dev \/ Testing \/ C\u00e1 nh\u00e2n<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">2 vCPU<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">4 GB RAM<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">30 GB<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">Cloud VPS c\u1ea5u h\u00ecnh ti\u00eau chu\u1ea9n<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0; font-weight: 600;\">Production nh\u1ecf v\u00e0 v\u1eeba (SME)<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">4 vCPU<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">8 GB RAM<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">80 GB &#8211; 100 GB<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">VPS NVMe t\u1ed1c \u0111\u1ed9 cao<\/td>\n<\/tr>\n<tr style=\"background-color: #f8fafc;\">\n<td style=\"padding: 10px; border: 1px solid #E2E8F0; font-weight: 600;\">Production l\u1edbn \/ Realtime cao<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">8 vCPU tr\u1edf l\u00ean<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">16 GB &#8211; 32 GB RAM<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">200 GB+ NVMe Enterprise<\/td>\n<td style=\"padding: 10px; border: 1px solid #E2E8F0;\">Cloud Server ho\u1eb7c Dedicated Server<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div style=\"display: flex; flex-wrap: wrap; background-color: #fff; border: 1.5px solid #BFDBFE; box-shadow: 0 8px 20px rgba(37,99,235,0.08); border-radius: 12px; overflow: hidden; margin: 30px 0;\">\n<div style=\"flex: 1; min-width: 250px; background: linear-gradient(135deg, #1E3A8A 0%, #2563EB 100%); display: flex; align-items: center; justify-content: center; padding: 25px; text-align: center;\">\n<div>\n<p style=\"color: #fff; font-size: 28px; font-family: 'Be Vietnam Pro', sans-serif; font-weight: bold; margin: 0; line-height: 1.2;\">Thu\u00ea VPS T\u1ed1c \u0110\u1ed9 Cao<\/p>\n<p style=\"color: #dbeafe; font-size: 14px; font-weight: 500; margin-top: 10px;\">CPU Intel\/AMD th\u1ebf h\u1ec7 m\u1edbi, 100% SSD NVMe Enterprise<\/p>\n<\/div>\n<\/div>\n<div style=\"flex: 2; padding: 22px; min-width: 280px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; color: #1e3a8a; margin-top: 0; font-size: 18px;\">B\u1ea1n c\u1ea7n m\u00e1y ch\u1ee7 \u1ea3o t\u1ed1i \u01b0u \u0111\u1ec3 t\u1ef1 host Supabase?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; margin-bottom: 15px; color: #374151;\">C\u00e1c g\u00f3i <a href=\"https:\/\/interdata.vn\/blog\/vps-la-gi\/\">m\u00e1y ch\u1ee7 \u1ea3o VPS<\/a> t\u1ea1i InterData cung c\u1ea5p to\u00e0n quy\u1ec1n qu\u1ea3n tr\u1ecb root, RAM chuy\u00ean d\u1ee5ng kh\u00f4ng overcommit v\u00e0 c\u1ed5ng m\u1ea1ng b\u0103ng th\u00f4ng l\u1edbn, gi\u00fap b\u1ea1n ch\u1ea1y tr\u01a1n tru to\u00e0n b\u1ed9 stack container Supabase.<\/p>\n<p><a style=\"background: linear-gradient(90deg, #2563EB 0%, #1E3A8A 100%); color: #fff; padding: 10px 22px; text-decoration: none; font-weight: 600; border-radius: 6px; font-size: 14px; display: inline-block;\" href=\"https:\/\/interdata.vn\/thue-vps\/\" target=\"_blank\" rel=\"noopener\">Xem B\u1ea3ng Gi\u00e1 Thu\u00ea VPS \u27f6<\/a><\/p>\n<\/div>\n<\/div>\n<h2 id=\"section2\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">2. B\u01b0\u1edbc 1: Chu\u1ea9n b\u1ecb Ubuntu Server v\u00e0 c\u00e0i \u0111\u1eb7t Docker Compose<\/h2>\n<p style=\"text-align: justify;\">C\u00e1c phi\u00ean b\u1ea3n Ubuntu Server khuy\u1ebfn ngh\u1ecb g\u1ed3m Ubuntu 22.04 LTS ho\u1eb7c Ubuntu 24.04 LTS. Tr\u01b0\u1edbc khi tri\u1ec3n khai, h\u00e3y k\u1ebft n\u1ed1i SSH v\u00e0o m\u00e1y ch\u1ee7 v\u1edbi quy\u1ec1n root ho\u1eb7c ng\u01b0\u1eddi d\u00f9ng c\u00f3 \u0111\u1eb7c quy\u1ec1n sudo v\u00e0 c\u1eadp nh\u1eadt to\u00e0n b\u1ed9 package index l\u00ean phi\u00ean b\u1ea3n m\u1edbi nh\u1ea5t.<\/p>\n<pre><code># C\u1eadp nh\u1eadt danh s\u00e1ch g\u00f3i v\u00e0 n\u00e2ng c\u1ea5p h\u1ec7 th\u1ed1ng\r\nsudo apt update &amp;&amp; sudo apt upgrade -y\r\n\r\n# C\u00e0i \u0111\u1eb7t c\u00e1c g\u00f3i ph\u1ee5 tr\u1ee3 c\u1ea7n thi\u1ebft\r\nsudo apt install -y curl apt-transport-https ca-certificates gnupg lsb-release git<\/code><\/pre>\n<p style=\"text-align: justify;\">Supabase s\u1eed d\u1ee5ng \u0111\u1ecbnh d\u1ea1ng compose specification chu\u1ea9n hi\u1ec7n \u0111\u1ea1i, do \u0111\u00f3 b\u1ea1n c\u1ea7n c\u00e0i \u0111\u1eb7t Docker Engine k\u00e8m plugin Docker Compose V2 (s\u1eed d\u1ee5ng c\u00fa ph\u00e1p l\u1ec7nh <code>docker compose<\/code> thay v\u00ec phi\u00ean b\u1ea3n c\u0169 <code>docker-compose<\/code>). \u0110\u1ec3 t\u00ecm hi\u1ec3u chi ti\u1ebft v\u1ec1 c\u00e1ch qu\u1ea3n l\u00fd container, b\u1ea1n c\u00f3 th\u1ec3 tham kh\u1ea3o b\u00e0i vi\u1ebft h\u01b0\u1edbng d\u1eabn <a href=\"https:\/\/interdata.vn\/blog\/cai-dat-va-su-dung-docker-compose-tren-ubuntu\/\">c\u00e0i \u0111\u1eb7t Docker Compose tr\u00ean Ubuntu<\/a>.<\/p>\n<pre><code># Th\u00eam kh\u00f3a GPG ch\u00ednh th\u1ee9c c\u1ee7a Docker\r\nsudo install -m 0755 -d \/etc\/apt\/keyrings\r\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\r\nsudo chmod a+r \/etc\/apt\/keyrings\/docker.gpg\r\n\r\n# Thi\u1ebft l\u1eadp Docker repository\r\necho \\\r\n  \"deb [arch=\"$(dpkg --print-architecture)\" signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\\r\n  \"$(. \/etc\/os-release &amp;&amp; echo \"$VERSION_CODENAME\")\" stable\" | \\\r\n  sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null\r\n\r\n# C\u00e0i \u0111\u1eb7t Docker Engine v\u00e0 Docker Compose Plugin\r\nsudo apt update\r\nsudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\r\n\r\n# Ki\u1ec3m tra phi\u00ean b\u1ea3n ho\u1ea1t \u0111\u1ed9ng\r\ndocker --version\r\ndocker compose version<\/code><\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-43599\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cai-dat-Docker-Compose-1.png\" alt=\"c\u00e0i \u0111\u1eb7t Docker Compose\" width=\"800\" height=\"688\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cai-dat-Docker-Compose-1.png 1130w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cai-dat-Docker-Compose-1-300x258.png 300w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cai-dat-Docker-Compose-1-1024x881.png 1024w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cai-dat-Docker-Compose-1-768x661.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<h2 id=\"section3\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">3. B\u01b0\u1edbc 2: T\u1ea3i m\u00e3 ngu\u1ed3n Supabase v\u00e0 c\u1ea5u h\u00ecnh bi\u1ebfn m\u00f4i tr\u01b0\u1eddng an to\u00e0n<\/h2>\n<p style=\"text-align: justify;\">\u0110\u1ec3 tr\u00e1nh k\u00e9o to\u00e0n b\u1ed9 repository l\u1edbn c\u1ee7a Supabase v\u1ec1 m\u00e1y ch\u1ee7, ch\u00fang ta ch\u1ec9 clone th\u01b0 m\u1ee5c ch\u1ee9a c\u1ea5u h\u00ecnh Docker ch\u00ednh th\u1ee9c. Thao t\u00e1c n\u00e0y gi\u00fap c\u1ea5u tr\u00fac d\u1ef1 \u00e1n tr\u00ean server g\u1ecdn g\u00e0ng v\u00e0 ti\u1ebft ki\u1ec7m b\u0103ng th\u00f4ng.<\/p>\n<pre><code># Clone th\u01b0 m\u1ee5c docker t\u1eeb kho l\u01b0u tr\u1eef ch\u00ednh th\u1ee9c c\u1ee7a Supabase\r\ngit clone --depth 1 https:\/\/github.com\/supabase\/supabase\r\ncd supabase\/docker\r\n\r\n# T\u1ea1o file c\u1ea5u h\u00ecnh m\u00f4i tr\u01b0\u1eddng t\u1eeb m\u1eabu\r\ncp .env.example .env<\/code><\/pre>\n<p style=\"text-align: justify;\"><strong>C\u1ea3nh b\u00e1o b\u1ea3o m\u1eadt quan tr\u1ecdng:<\/strong> File <code>.env.example<\/code> \u0111i k\u00e8m s\u1eb5n c\u00e1c kh\u00f3a JWT v\u00e0 m\u1eadt kh\u1ea9u m\u1eb7c \u0111\u1ecbnh c\u00f4ng khai tr\u00ean GitHub. N\u1ebfu gi\u1eef nguy\u00ean c\u00e1c gi\u00e1 tr\u1ecb n\u00e0y tr\u00ean m\u00f4i tr\u01b0\u1eddng Production, b\u1ea5t k\u1ef3 ai c\u0169ng c\u00f3 th\u1ec3 chi\u1ebfm to\u00e0n quy\u1ec1n ki\u1ec3m so\u00e1t <a href=\"https:\/\/interdata.vn\/blog\/postgresql-la-gi\/\">h\u1ec7 qu\u1ea3n tr\u1ecb c\u01a1 s\u1edf d\u1eef li\u1ec7u PostgreSQL<\/a> v\u00e0 d\u1eef li\u1ec7u ng\u01b0\u1eddi d\u00f9ng. B\u1ea1n b\u1eaft bu\u1ed9c ph\u1ea3i t\u1ea1o c\u00e1c chu\u1ed7i kh\u00f3a b\u1ea3o m\u1eadt m\u1edbi.<\/p>\n<p style=\"text-align: justify;\">S\u1eed d\u1ee5ng ti\u1ec7n \u00edch <code>openssl<\/code> tr\u00ean terminal \u0111\u1ec3 sinh c\u00e1c chu\u1ed7i b\u1ea3o m\u1eadt ng\u1eabu nhi\u00ean v\u1edbi \u0111\u1ed9 d\u00e0i 32 k\u00fd t\u1ef1 tr\u1edf l\u00ean:<\/p>\n<pre><code># T\u1ea1o chu\u1ed7i b\u00ed m\u1eadt cho JWT Secret\r\nopenssl rand -hex 32\r\n\r\n# T\u1ea1o m\u1eadt kh\u1ea9u m\u1ea1nh cho PostgreSQL root user\r\nopenssl rand -base64 24<\/code><\/pre>\n<p style=\"text-align: justify;\">M\u1edf file <code>.env<\/code> b\u1eb1ng tr\u00ecnh so\u1ea1n th\u1ea3o <code>nano .env<\/code> v\u00e0 thay \u0111\u1ed5i c\u00e1c th\u00f4ng s\u1ed1 then ch\u1ed1t sau:<\/p>\n<ul style=\"padding-left: 20px; line-height: 1.6;\">\n<li><strong>POSTGRES_PASSWORD:<\/strong> Thay b\u1eb1ng m\u1eadt kh\u1ea9u c\u01a1 s\u1edf d\u1eef li\u1ec7u b\u1ea1n v\u1eeba sinh ng\u1eabu nhi\u00ean.<\/li>\n<li><strong>JWT_SECRET:<\/strong> \u0110i\u1ec1n chu\u1ed7i JWT Secret m\u1edbi t\u1ea1o \u1edf b\u01b0\u1edbc tr\u00ean.<\/li>\n<li><strong>ANON_KEY &amp; SERVICE_ROLE_KEY:<\/strong> T\u1ea1o 2 kh\u00f3a JWT t\u01b0\u01a1ng \u1ee9ng v\u1edbi <code>JWT_SECRET<\/code> v\u1eeba \u0111\u1ed5i (ho\u1eb7c s\u1eed d\u1ee5ng c\u00f4ng c\u1ee5 jwt.io \u0111\u1ec3 k\u00fd v\u1edbi payload role <code>anon<\/code> v\u00e0 <code>service_role<\/code>).<\/li>\n<li><strong>DASHBOARD_USERNAME &amp; DASHBOARD_PASSWORD:<\/strong> Th\u00f4ng tin \u0111\u0103ng nh\u1eadp trang qu\u1ea3n tr\u1ecb Supabase Studio Dashboard.<\/li>\n<li><strong>SUPABASE_URL &amp; API_EXTERNAL_URL:<\/strong> \u0110i\u1ec1n t\u00ean mi\u1ec1n th\u1eadt s\u1eed d\u1ee5ng SSL c\u1ee7a b\u1ea1n (v\u00ed d\u1ee5: <code>https:\/\/api.yourdomain.com<\/code>).<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-43598\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cau-hinh-bien-moi-truong.png\" alt=\"c\u1ea5u h\u00ecnh bi\u1ebfn m\u00f4i tr\u01b0\u1eddng\" width=\"800\" height=\"719\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cau-hinh-bien-moi-truong.png 1002w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cau-hinh-bien-moi-truong-300x270.png 300w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/cau-hinh-bien-moi-truong-768x691.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<h2 id=\"section4\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">4. B\u01b0\u1edbc 3: Kh\u1edfi ch\u1ea1y c\u1ee5m container Supabase v\u1edbi Docker Compose<\/h2>\n<p style=\"text-align: justify;\">Sau khi \u0111\u00e3 thi\u1ebft l\u1eadp an to\u00e0n c\u00e1c bi\u1ebfn m\u00f4i tr\u01b0\u1eddng trong file <code>.env<\/code>, b\u1ea1n ti\u1ebfn h\u00e0nh t\u1ea3i c\u00e1c Docker Image ch\u00ednh th\u1ee9c v\u00e0 k\u00edch ho\u1ea1t to\u00e0n b\u1ed9 c\u1ee5m d\u1ecbch v\u1ee5 ch\u1ea1y d\u01b0\u1edbi n\u1ec1n.<\/p>\n<pre><code># T\u1ea3i tr\u01b0\u1edbc c\u00e1c Docker Image m\u1edbi nh\u1ea5t\r\ndocker compose pull\r\n\r\n# Kh\u1edfi \u0111\u1ed9ng to\u00e0n b\u1ed9 container \u1edf ch\u1ebf \u0111\u1ed9 daemon\r\ndocker compose up -d<\/code><\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-43600\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Khoi-chay-cum-container-Supabase-voi-Docker-Compose.png\" alt=\"Kh\u1edfi ch\u1ea1y c\u1ee5m container Supabase v\u1edbi Docker Compose\" width=\"500\" height=\"591\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Khoi-chay-cum-container-Supabase-voi-Docker-Compose.png 548w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Khoi-chay-cum-container-Supabase-voi-Docker-Compose-254x300.png 254w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<p style=\"text-align: justify;\">Ki\u1ec3m tra danh s\u00e1ch c\u00e1c d\u1ecbch v\u1ee5 \u0111ang ch\u1ea1y b\u1eb1ng l\u1ec7nh <code>docker compose ps<\/code>. T\u1ea5t c\u1ea3 c\u00e1c container nh\u01b0 <code>supabase-db<\/code>, <code>supabase-kong<\/code>, <code>supabase-auth<\/code>, <code>supabase-studio<\/code>, <code>supabase-storage<\/code>&#8230; ph\u1ea3i \u1edf tr\u1ea1ng th\u00e1i <strong>Up<\/strong> ho\u1eb7c <strong>healthy<\/strong>.<\/p>\n<pre><code># Ki\u1ec3m tra tr\u1ea1ng th\u00e1i ho\u1ea1t \u0111\u1ed9ng c\u1ee7a c\u00e1c container\r\ndocker compose ps<\/code><\/pre>\n<div style=\"background: linear-gradient(135deg, #EFF6FF 0%, #DBEAFE 100%); border: 1.5px solid #2563EB; border-radius: 12px; padding: 25px; margin: 30px 0; text-align: center;\">\n<p style=\"font-family: 'Be Vietnam Pro', sans-serif; font-size: 20px; font-weight: bold; color: #1e3a8a; margin: 0 0 8px;\">T\u1ed1i \u01b0u chi ph\u00ed h\u1ea1 t\u1ea7ng m\u00e1y ch\u1ee7 cho d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n<\/p>\n<p style=\"font-size: 14px; color: #4b5563; margin-bottom: 18px;\">Truy c\u1eadp Canh Me \u0111\u1ec3 c\u1eadp nh\u1eadt s\u1edbm nh\u1ea5t c\u00e1c m\u00e3 khuy\u1ebfn m\u00e3i, voucher gi\u1ea3m gi\u00e1 v\u00e0 ch\u01b0\u01a1ng tr\u00ecnh Flash Sale d\u00e0nh ri\u00eang cho d\u1ecbch v\u1ee5 m\u00e1y ch\u1ee7 t\u1ea1i InterData.<\/p>\n<p><a style=\"background: #2563EB; color: #fff; padding: 10px 25px; text-decoration: none; font-weight: 600; border-radius: 6px; font-size: 14px; display: inline-block;\" href=\"https:\/\/interdata.vn\/canhme\/\" target=\"_blank\" rel=\"noopener\">S\u0103n \u01afu \u0110\u00e3i VPS Si\u00eau Ti\u1ebft Ki\u1ec7m \u27f6<\/a><\/p>\n<\/div>\n<h2 id=\"section5\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">5. B\u01b0\u1edbc 4: Thi\u1ebft l\u1eadp Reverse Proxy Nginx, SSL v\u00e0 t\u01b0\u1eddng l\u1eeda UFW<\/h2>\n<p style=\"text-align: justify;\">Trong m\u00f4i tr\u01b0\u1eddng Production, kh\u00f4ng n\u00ean m\u1edf tr\u1ef1c ti\u1ebfp c\u1ed5ng 8000 (Kong API Gateway) ho\u1eb7c c\u1ed5ng 3000 (Supabase Studio) ra Internet. Gi\u1ea3i ph\u00e1p t\u1ed1i \u01b0u l\u00e0 s\u1eed d\u1ee5ng <a href=\"https:\/\/interdata.vn\/blog\/nginx-la-gi\/\">web server Nginx<\/a> l\u00e0m Reverse Proxy ti\u1ebfp nh\u1eadn l\u01b0u l\u01b0\u1ee3ng HTTPS v\u00e0 chuy\u1ec3n ti\u1ebfp n\u1ed9i b\u1ed9 v\u1ec1 c\u00e1c c\u1ed5ng d\u1ecbch v\u1ee5 t\u01b0\u01a1ng \u1ee9ng.<\/p>\n<p style=\"text-align: justify;\">C\u00e0i \u0111\u1eb7t Nginx v\u00e0 c\u00f4ng c\u1ee5 Certbot tr\u00ean m\u00e1y ch\u1ee7 Ubuntu:<\/p>\n<pre><code># C\u00e0i \u0111\u1eb7t Nginx v\u00e0 Certbot\r\nsudo apt install -y nginx certbot python3-certbot-nginx<\/code><\/pre>\n<p style=\"text-align: justify;\">T\u1ea1o file c\u1ea5u h\u00ecnh Virtual Host cho Supabase Studio v\u00e0 API t\u1ea1i <code>\/etc\/nginx\/sites-available\/supabase.conf<\/code>:<\/p>\n<pre><code># C\u1ea5u h\u00ecnh cho Supabase Studio Dashboard\r\nserver {\r\n    server_name studio.yourdomain.com;\r\n\r\n    location \/ {\r\n        proxy_pass http:\/\/127.0.0.1:3000;\r\n        proxy_set_header Host $host;\r\n        proxy_set_header X-Real-IP $remote_addr;\r\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n        proxy_set_header X-Forwarded-Proto $scheme;\r\n    }\r\n}\r\n\r\n# C\u1ea5u h\u00ecnh cho Kong API Gateway\r\nserver {\r\n    server_name api.yourdomain.com;\r\n\r\n    location \/ {\r\n        proxy_pass http:\/\/127.0.0.1:8000;\r\n        proxy_set_header Host $host;\r\n        proxy_set_header X-Real-IP $remote_addr;\r\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n        proxy_set_header X-Forwarded-Proto $scheme;\r\n    }\r\n}<\/code><\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-43603\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Tao-file-cau-hinh-Virtual-Host-cho-Supabase-Studio-va-API.png\" alt=\"T\u1ea1o file c\u1ea5u h\u00ecnh Virtual Host cho Supabase Studio v\u00e0 API\" width=\"600\" height=\"505\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Tao-file-cau-hinh-Virtual-Host-cho-Supabase-Studio-va-API.png 692w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Tao-file-cau-hinh-Virtual-Host-cho-Supabase-Studio-va-API-300x252.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p style=\"text-align: justify;\">K\u00edch ho\u1ea1t file c\u1ea5u h\u00ecnh v\u00e0 c\u1ea5p ph\u00e1t ch\u1ee9ng ch\u1ec9 b\u1ea3o m\u1eadt HTTPS theo quy tr\u00ecnh <a href=\"https:\/\/interdata.vn\/blog\/cai-ssl-lets-encrypt-bang-certbot\/\">c\u00e0i \u0111\u1eb7t SSL mi\u1ec5n ph\u00ed<\/a>\u00a0qua Let&#8217;s Encrypt:<\/p>\n<pre><code># K\u00edch ho\u1ea1t c\u1ea5u h\u00ecnh Nginx\r\nsudo ln -s \/etc\/nginx\/sites-available\/supabase.conf \/etc\/nginx\/sites-enabled\/\r\nsudo nginx -t\r\nsudo systemctl reload nginx\r\n\r\n# \u0110\u0103ng k\u00fd ch\u1ee9ng ch\u1ec9 SSL t\u1ef1 \u0111\u1ed9ng v\u1edbi Certbot\r\nsudo certbot --nginx -d studio.yourdomain.com -d api.yourdomain.com<\/code><\/pre>\n<p style=\"text-align: justify;\">Cu\u1ed1i c\u00f9ng, ti\u1ebfn h\u00e0nh <a href=\"https:\/\/interdata.vn\/blog\/cai-dat-va-cau-hinh-ufw\/\">c\u1ea5u h\u00ecnh t\u01b0\u1eddng l\u1eeda UFW<\/a> \u0111\u1ec3 ch\u1eb7n truy c\u1eadp tr\u1ef1c ti\u1ebfp v\u00e0o c\u00e1c c\u1ed5ng d\u1ecbch v\u1ee5 n\u1ed9i b\u1ed9 (nh\u01b0 PostgreSQL c\u1ed5ng 5432, Kong c\u1ed5ng 8000, Studio c\u1ed5ng 3000), ch\u1ec9 cho ph\u00e9p l\u01b0u l\u01b0\u1ee3ng truy c\u1eadp qua SSH, HTTP v\u00e0 HTTPS:<\/p>\n<pre><code># Thi\u1ebft l\u1eadp ch\u00ednh s\u00e1ch m\u1eb7c \u0111\u1ecbnh cho t\u01b0\u1eddng l\u1eeda\r\nsudo ufw default deny incoming\r\nsudo ufw default allow outgoing\r\n\r\n# M\u1edf c\u00e1c c\u1ed5ng c\u1ea7n thi\u1ebft\r\nsudo ufw allow 22\/tcp\r\nsudo ufw allow 80\/tcp\r\nsudo ufw allow 443\/tcp\r\n\r\n# B\u1eadt t\u01b0\u1eddng l\u1eeda UFW\r\nsudo ufw enable\r\nsudo ufw status<\/code><\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-43604\" src=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Cau-hinh-tuong-lua.png\" alt=\"C\u1ea5u h\u00ecnh t\u01b0\u1eddng l\u1eeda\" width=\"500\" height=\"329\" title=\"\" srcset=\"https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Cau-hinh-tuong-lua.png 545w, https:\/\/interdata.vn\/blog\/wp-content\/uploads\/2026\/09\/Cau-hinh-tuong-lua-300x198.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/p>\n<h2 id=\"section6\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">6. B\u01b0\u1edbc 5: Gi\u00e1m s\u00e1t, sao l\u01b0u c\u01a1 s\u1edf d\u1eef li\u1ec7u v\u00e0 n\u00e2ng c\u1ea5p h\u1ea1 t\u1ea7ng<\/h2>\n<p style=\"text-align: justify;\">Trong qu\u00e1 tr\u00ecnh v\u1eadn h\u00e0nh, vi\u1ec7c gi\u00e1m s\u00e1t t\u00e0i nguy\u00ean v\u00e0 sao l\u01b0u \u0111\u1ecbnh k\u1ef3 l\u00e0 y\u00eau c\u1ea7u b\u1eaft bu\u1ed9c \u0111\u1ec3 duy tr\u00ec t\u00ednh li\u00ean t\u1ee5c c\u1ee7a d\u1ecbch v\u1ee5 khi b\u1ea1n t\u1ef1 host Supabase tr\u00ean Ubuntu Server.<\/p>\n<p style=\"text-align: justify;\"><strong>Ki\u1ec3m tra nh\u1eadt k\u00fd h\u1ec7 th\u1ed1ng (Logs):<\/strong> Khi m\u1ed9t d\u1ecbch v\u1ee5 g\u1eb7p s\u1ef1 c\u1ed1 k\u1ebft n\u1ed1i, b\u1ea1n c\u00f3 th\u1ec3 ki\u1ec3m tra tr\u1ef1c ti\u1ebfp log c\u1ee7a container t\u01b0\u01a1ng \u1ee9ng:<\/p>\n<pre><code># Xem log th\u1eddi gian th\u1ef1c c\u1ee7a container Database\r\ndocker compose logs -f db\r\n\r\n# Xem log c\u1ee7a API Gateway Kong\r\ndocker compose logs -f kong<\/code><\/pre>\n<p style=\"text-align: justify;\"><strong>Sao l\u01b0u c\u01a1 s\u1edf d\u1eef li\u1ec7u PostgreSQL:<\/strong> B\u1ea1n c\u00f3 th\u1ec3 xu\u1ea5t to\u00e0n b\u1ed9 schema v\u00e0 d\u1eef li\u1ec7u c\u1ee7a PostgreSQL b\u1eb1ng l\u1ec7nh <code>pg_dumpall<\/code> m\u00e0 kh\u00f4ng c\u1ea7n c\u00e0i th\u00eam client tr\u00ean m\u00e1y ch\u1ee7:<\/p>\n<pre><code># T\u1ea1o file sao l\u01b0u SQL n\u00e9n theo ng\u00e0y\r\ndocker compose exec -T db pg_dumpall -U postgres | gzip &gt; \"supabase_backup_$(date +%Y%m%d_%H%M%S).sql.gz\"<\/code><\/pre>\n<p style=\"text-align: justify;\"><strong>Khi n\u00e0o c\u1ea7n n\u00e2ng c\u1ea5p t\u1eeb VPS l\u00ean Cloud Server?<\/strong><\/p>\n<p style=\"text-align: justify;\">Khi c\u01a1 s\u1edf d\u1eef li\u1ec7u \u0111\u1ea1t dung l\u01b0\u1ee3ng h\u00e0ng tr\u0103m Gigabyte, c\u00e1c truy v\u1ea5n ph\u1ee9c t\u1ea1p tr\u00ean pgvector \u0111\u00f2i h\u1ecfi t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd I\/O cao, ho\u1eb7c s\u1ed1 l\u01b0\u1ee3ng k\u1ebft n\u1ed1i WebSocket \u0111\u1ed3ng th\u1eddi qua Realtime v\u01b0\u1ee3t qu\u00e1 gi\u1edbi h\u1ea1n t\u00e0i nguy\u00ean c\u1ee7a m\u1ed9t m\u00e1y ch\u1ee7 \u1ea3o th\u00f4ng th\u01b0\u1eddng, vi\u1ec7c chuy\u1ec3n \u0111\u1ed5i sang h\u1ea1 t\u1ea7ng Cloud Server chuy\u00ean d\u1ee5ng s\u1ebd mang l\u1ea1i kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng t\u1ee9c th\u00ec v\u00e0 \u0111\u1ed9 \u1ed5n \u0111\u1ecbnh cao h\u01a1n.<\/p>\n<div style=\"display: flex; flex-wrap: wrap; background-color: #fff; border: 1.5px solid #BFDBFE; box-shadow: 0 8px 20px rgba(37,99,235,0.08); border-radius: 12px; overflow: hidden; margin: 30px 0;\">\n<div style=\"flex: 1; min-width: 250px; background: linear-gradient(135deg, #1E3A8A 0%, #2563EB 100%); display: flex; align-items: center; justify-content: center; padding: 25px; text-align: center;\">\n<div>\n<p style=\"color: #fff; font-size: 28px; font-family: 'Be Vietnam Pro', sans-serif; font-weight: bold; margin: 0; line-height: 1.2;\">Cloud Server Doanh Nghi\u1ec7p<\/p>\n<p style=\"color: #dbeafe; font-size: 14px; font-weight: 500; margin-top: 10px;\">M\u1edf r\u1ed9ng t\u00e0i nguy\u00ean t\u1ee9c th\u00ec, ch\u1ecbu t\u1ea3i h\u00e0ng tri\u1ec7u request<\/p>\n<\/div>\n<\/div>\n<div style=\"flex: 2; padding: 22px; min-width: 280px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; color: #1e3a8a; margin-top: 0; font-size: 18px;\">D\u1ef1 \u00e1n ph\u00e1t tri\u1ec3n v\u01b0\u1ee3t ng\u01b0\u1ee1ng t\u00e0i nguy\u00ean th\u00f4ng th\u01b0\u1eddng?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; margin-bottom: 15px; color: #374151;\">Khi c\u01a1 s\u1edf d\u1eef li\u1ec7u ph\u00ecnh to v\u00e0 l\u01b0\u1ee3ng ng\u01b0\u1eddi d\u00f9ng t\u0103ng v\u1ecdt, h\u1ea1 t\u1ea7ng Cloud Server cho ph\u00e9p b\u1ea1n n\u00e2ng c\u1ea5p CPU, RAM v\u00e0 dung l\u01b0\u1ee3ng \u0111\u0129a ch\u1ec9 trong v\u00e0i ph\u00fat m\u00e0 kh\u00f4ng l\u00e0m gi\u00e1n \u0111o\u1ea1n k\u1ebft n\u1ed1i c\u1ee7a \u1ee9ng d\u1ee5ng.<\/p>\n<p><a style=\"background: linear-gradient(90deg, #2563EB 0%, #1E3A8A 100%); color: #fff; padding: 10px 22px; text-decoration: none; font-weight: 600; border-radius: 6px; font-size: 14px; display: inline-block;\" href=\"https:\/\/interdata.vn\/cloud-server\/\" target=\"_blank\" rel=\"noopener\">Xem B\u1ea3ng Gi\u00e1 Cloud Server \u27f6<\/a><\/p>\n<\/div>\n<\/div>\n<h2 id=\"section7\" style=\"color: #1e3a8a; font-size: 22px; font-weight: bold; border-left: 5px solid #2563EB; padding-left: 15px; margin: 35px 0 15px;\">7. C\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p khi t\u1ef1 host Supabase (FAQ)<\/h2>\n<div style=\"margin-bottom: 15px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; font-size: 16px; font-weight: bold; color: #1e3a8a; margin-bottom: 5px;\">B\u1ea3n Supabase t\u1ef1 host c\u00f3 h\u1ed7 tr\u1ee3 extension pgvector \u0111\u1ec3 l\u00e0m AI \/ Embedding kh\u00f4ng?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; color: #4b5563; margin-top: 0;\">C\u00f3. Container PostgreSQL ch\u00ednh th\u1ee9c c\u1ee7a Supabase \u0111\u00e3 \u0111\u01b0\u1ee3c build k\u00e8m s\u1eb5n extension <code>pgvector<\/code>. B\u1ea1n ch\u1ec9 c\u1ea7n k\u00edch ho\u1ea1t tr\u1ef1c ti\u1ebfp b\u1eb1ng l\u1ec7nh <code>CREATE EXTENSION IF NOT EXISTS vector;<\/code> trong SQL Editor c\u1ee7a Supabase Studio.<\/p>\n<\/div>\n<div style=\"margin-bottom: 15px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; font-size: 16px; font-weight: bold; color: #1e3a8a; margin-bottom: 5px;\">T\u1ef1 host Supabase c\u00f3 nh\u1eefng h\u1ea1n ch\u1ebf g\u00ec so v\u1edbi b\u1ea3n Supabase Cloud?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; color: #4b5563; margin-top: 0;\">Phi\u00ean b\u1ea3n t\u1ef1 host qua Docker Compose cung c\u1ea5p g\u1ea7n nh\u01b0 to\u00e0n b\u1ed9 t\u00ednh n\u0103ng c\u1ed1t l\u00f5i (Database, Auth, Storage, Realtime, Studio). Tuy nhi\u00ean, b\u1ea1n s\u1ebd ph\u1ea3i t\u1ef1 qu\u1ea3n l\u00fd vi\u1ec7c backup, c\u1eadp nh\u1eadt phi\u00ean b\u1ea3n, c\u1ea5u h\u00ecnh b\u1ea3o m\u1eadt m\u00e1y ch\u1ee7 v\u00e0 t\u1ed1i \u01b0u h\u00f3a h\u1ea1 t\u1ea7ng thay v\u00ec \u0111\u01b0\u1ee3c t\u1ef1 \u0111\u1ed9ng h\u00f3a ho\u00e0n to\u00e0n nh\u01b0 b\u1ea3n tr\u1ea3 ph\u00ed c\u1ee7a nh\u00e0 cung c\u1ea5p.<\/p>\n<\/div>\n<div style=\"margin-bottom: 15px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; font-size: 16px; font-weight: bold; color: #1e3a8a; margin-bottom: 5px;\">T\u00f4i c\u00f3 th\u1ec3 m\u1edf c\u1ed5ng 5432 \u0111\u1ec3 k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp t\u1eeb DBeaver ho\u1eb7c TablePlus kh\u00f4ng?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; color: #4b5563; margin-top: 0;\">B\u1ea1n c\u00f3 th\u1ec3 m\u1edf c\u1ed5ng 5432, nh\u01b0ng v\u00ec l\u00fd do an to\u00e0n, kh\u00f4ng n\u00ean m\u1edf public ra to\u00e0n b\u1ed9 Internet. Thay v\u00e0o \u0111\u00f3, h\u00e3y c\u1ea5u h\u00ecnh k\u1ebft n\u1ed1i th\u00f4ng qua SSH Tunnel (Port Forwarding) ho\u1eb7c ch\u1ec9 m\u1edf c\u1ed5ng 5432 cho \u0111\u1ecba ch\u1ec9 IP t\u0129nh c\u1ed1 \u0111\u1ecbnh c\u1ee7a b\u1ea1n trong t\u01b0\u1eddng l\u1eeda UFW.<\/p>\n<\/div>\n<div style=\"margin-bottom: 15px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; font-size: 16px; font-weight: bold; color: #1e3a8a; margin-bottom: 5px;\">L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 c\u1eadp nh\u1eadt c\u00e1c container Supabase l\u00ean b\u1ea3n m\u1edbi nh\u1ea5t?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; color: #4b5563; margin-top: 0;\">Truy c\u1eadp v\u00e0o th\u01b0 m\u1ee5c ch\u1ee9a m\u00e3 ngu\u1ed3n (<code>supabase\/docker<\/code>), th\u1ef1c hi\u1ec7n l\u1ec7nh <code>git pull<\/code> \u0111\u1ec3 l\u1ea5y c\u00e1c c\u1ea5u h\u00ecnh m\u1edbi, sau \u0111\u00f3 ch\u1ea1y l\u1ec7nh <code>docker compose pull<\/code> v\u00e0 <code>docker compose up -d<\/code>. H\u00e3y lu\u00f4n t\u1ea1o b\u1ea3n sao l\u01b0u d\u1eef li\u1ec7u PostgreSQL tr\u01b0\u1edbc khi n\u00e2ng c\u1ea5p.<\/p>\n<\/div>\n<div style=\"margin-bottom: 15px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; font-size: 16px; font-weight: bold; color: #1e3a8a; margin-bottom: 5px;\">M\u00e1y ch\u1ee7 2GB RAM c\u00f3 ch\u1ea1y \u0111\u01b0\u1ee3c Supabase kh\u00f4ng?<\/h3>\n<p style=\"text-align: justify; font-size: 14px; color: #4b5563; margin-top: 0;\">M\u00e1y ch\u1ee7 2GB RAM c\u00f3 th\u1ec3 kh\u1edfi ch\u1ea1y \u0111\u01b0\u1ee3c n\u1ebfu b\u1ea1n c\u1ea5u h\u00ecnh th\u00eam b\u1ed9 nh\u1edb \u1ea3o (Swap file), tuy nhi\u00ean h\u1ec7 th\u1ed1ng s\u1ebd ch\u1ea1y r\u1ea5t ch\u1eadm v\u00e0 th\u01b0\u1eddng xuy\u00ean b\u1ecb crash khi c\u00f3 truy v\u1ea5n \u0111\u1ed3ng th\u1eddi. M\u1ee9c RAM t\u1ed1i thi\u1ec3u khuy\u1ebfn ngh\u1ecb cho m\u00f4i tr\u01b0\u1eddng th\u1eed nghi\u1ec7m l\u00e0 4GB.<\/p>\n<\/div>\n<div style=\"border-top: 2px dashed #BFDBFE; margin-top: 40px; padding-top: 25px;\">\n<h3 style=\"font-family: 'Be Vietnam Pro', sans-serif; color: #1e3a8a; font-size: 20px; font-weight: bold; margin-bottom: 12px;\">L\u1eddi k\u1ebft<\/h3>\n<p style=\"text-align: justify; font-size: 15px;\">Vi\u1ec7c n\u1eafm v\u1eefng quy tr\u00ecnh <strong>t\u1ef1 host Supabase tr\u00ean Ubuntu Server<\/strong> gi\u00fap b\u1ea1n l\u00e0m ch\u1ee7 ho\u00e0n to\u00e0n d\u1eef li\u1ec7u d\u1ef1 \u00e1n, t\u1ed1i \u01b0u h\u00f3a chi ph\u00ed h\u1ea1 t\u1ea7ng v\u00e0 linh ho\u1ea1t m\u1edf r\u1ed9ng quy m\u00f4 khi c\u1ea7n thi\u1ebft. H\u00e3y b\u1eaft \u0111\u1ea7u b\u1eb1ng vi\u1ec7c l\u1ef1a ch\u1ecdn c\u1ea5u h\u00ecnh m\u00e1y ch\u1ee7 ph\u00f9 h\u1ee3p, tu\u00e2n th\u1ee7 nghi\u00eam ng\u1eb7t c\u00e1c nguy\u00ean t\u1eafc b\u1ea3o m\u1eadt th\u00f4ng tin x\u00e1c th\u1ef1c v\u00e0 thi\u1ebft l\u1eadp c\u01a1 ch\u1ebf sao l\u01b0u \u0111\u1ecbnh k\u1ef3 \u0111\u1ec3 h\u1ec7 th\u1ed1ng lu\u00f4n v\u1eadn h\u00e0nh \u1ed5n \u0111\u1ecbnh.<\/p>\n<\/div>\n<p style=\"text-align: justify; font-size: 13px; font-style: italic; color: #6b7280; margin-top: 25px; border-top: 1px solid #E5E7EB; padding-top: 12px;\"><span style=\"font-size: 100%;\"><em>L\u01b0u \u00fd: H\u01b0\u1edbng d\u1eabn n\u00e0y d\u1ef1a tr\u00ean t\u00e0i li\u1ec7u ch\u00ednh th\u1ee9c t\u1eeb Supabase. C\u00e1c c\u1ea5u h\u00ecnh c\u1ed5ng, bi\u1ebfn m\u00f4i tr\u01b0\u1eddng v\u00e0 y\u00eau c\u1ea7u phi\u00ean b\u1ea3n Docker c\u00f3 th\u1ec3 thay \u0111\u1ed5i theo t\u1eebng b\u1ea3n c\u1eadp nh\u1eadt c\u1ee7a d\u1ef1 \u00e1n. H\u00e3y lu\u00f4n sao l\u01b0u d\u1eef li\u1ec7u tr\u01b0\u1edbc khi n\u00e2ng c\u1ea5p h\u1ec7 th\u1ed1ng production.<\/em><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u1ef1 host Supabase tr\u00ean Ubuntu Server l\u00e0 l\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u cho c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean mu\u1ed1n s\u1edf h\u1eefu h\u1ea1 t\u1ea7ng Backend-as-a-Service (BaaS) m\u1ea1nh m\u1ebd, to\u00e0n quy\u1ec1n ki\u1ec3m so\u00e1t c\u01a1 s\u1edf d\u1eef li\u1ec7u PostgreSQL m\u00e0 kh\u00f4ng lo ng\u1ea1i chi ph\u00ed t\u0103ng cao theo quy m\u00f4 t\u1eeb c\u00e1c d\u1ecbch v\u1ee5 Cloud. B\u00e0i vi\u1ebft n\u00e0y c\u1ee7a InterData<\/p>\n","protected":false},"author":2,"featured_media":43602,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[161],"tags":[],"class_list":["post-43593","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-huong-dan-chung"],"_links":{"self":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts\/43593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/comments?post=43593"}],"version-history":[{"count":6,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts\/43593\/revisions"}],"predecessor-version":[{"id":43605,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/posts\/43593\/revisions\/43605"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/media\/43602"}],"wp:attachment":[{"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/media?parent=43593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/categories?post=43593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/interdata.vn\/blog\/wp-json\/wp\/v2\/tags?post=43593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}