How to Deploy Next JS App on C-Panel Shared Hosting

How to Deploy Next JS App on C-Panel Shared Hosting

সি-প্যানেল শেয়ার্ড হোস্টিং এ GitHub এর মাধ্যমে Next JS ডেপ্লয় করার অব্যর্থ কৌশল। বিফলে মূল্য ফেরত 😊

নিজের একটা ওয়েব সাইট থাকুক কে না চায় বলুন সাথে একটু ব্লগিং যেখানে নিজের অভিজ্ঞতা, চিন্তা - ভাবনা নিজের মত করে লিখে রাখা যায়!

ওয়েব সাইট বানানোর অনেক অনেক প্রযুক্তি আছে চার পাশে। আপনার যেটা ভালো লাগে, সামর্থ্যে(টাকা পয়সায়) কুলায় এবং সেই অনুযায়ী এগুনো ভালো। কিন্তু আমি নিজেই এখানে একটু ভিন্ন কাজ করেছি। আমার পাইথনে কাজ করলেও সি প্যানেলে এইটা ব্যবহার করতে তেমন ভালো লাগে না মানে প্রিমিয়াম ভাব আসে না আর কি। তাই Next JS এ অল্প স্বল্প জ্ঞান থাকায় এটা দিয়ে বানিয়েছি। যেহেতু নিজে পরীক্ষা না করে কাউকে না বলার চেষ্টা করি সে জন্য এইটার অভিজ্ঞতার আলোকে বলছি।

Page Router:

আমার কাছে Page RouterSEO করতে সুবিধাজনক মনে হয় এর জন্য পোর্টফোলিও ওয়েব সাইটের জন্য এইটা উপযুক্ত মনে করি।

ধরে নিচ্ছি আপনার প্রজেক্ট npm run build কমান্ড দিয়ে বিল্ড করা শেষ। এখন লাইভ করার জন্য মন আঁকুপাঁকু করছে। Next JS এর ওয়েব সাইটে custom server এর জন্য একটা স্ক্রিপ্ট আছে সেটা আমাদের প্রজেক্টের root directoryserver.js নামে ফাইল তৈরি করে সেটাতে পেস্ট করে দিতে হবে।

const { createServer } = require("http");
const { parse } = require("url");
const next = require("next");

const dev = process.env.NODE_ENV !== "production";
const hostname = "localhost";
const port = 3000;
// when using middleware `hostname` and `port` must be provided below
const app = next({ dev, hostname, port });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  createServer(async (req, res) => {
    try {
      // Be sure to pass `true` as the second argument to `url.parse`.
      // This tells it to parse the query portion of the URL.
      const parsedUrl = parse(req.url, true);
      const { pathname, query } = parsedUrl;

      if (pathname === "/a") {
        await app.render(req, res, "/a", query);
      } else if (pathname === "/b") {
        await app.render(req, res, "/b", query);
      } else {
        await handle(req, res, parsedUrl);
      }
    } catch (err) {
      console.error("Error occurred handling", req.url, err);
      res.statusCode = 500;
      res.end("internal server error");
    }
  })
    .once("error", (err) => {
      console.error(err);
      process.exit(1);
    })
    .listen(port, () => {
      console.log(`> Ready on http://${hostname}:${port}`);
    });
});

এইবার GitHubpush করে দেন। VScode দিয়ে এটা সহজেই করা যায়। রিপোজিটরি প্রাইভেট অথবা পাবলিক এইটা কোন বিষয় না।

এখন আমাদের সি-প্যানেলে যেয়ে একটা FTP account তৈরি করতে হবে।

FTP account এর পাসওয়ার্ড সর্ণাক্ষরে লিখে রাখবেন। কারন এটা আর পরবর্তীতে পাওয়া যাবে না। এরপর নিচের দিকে Configure FTP Client এ ক্লিক করলে

FTP Username FTP server

এর তথ্য পাবেন আর পাসওয়ার্ড তো আগেই স্বর্নাক্ষরে লিখে রাখতে বলেছিলাম। এখন Github Repository এর Settings এ যেয়ে নির্দেশিত লিংকে ক্লিক করবেন।

এরপর সি-প্যানেল থেকে পাওয়া গোপনীয় তথ্যগুলা এখানে দিয়ে দিতে হবে।

সি-প্যানেলের সাথে গিটহাব রিপোজিটোরির সম্পর্ক স্থাপিত হয়ে গেল।

পরবর্তী কাজঃ

এখন Repository উপরে এমন কিছু অপশন আছে যার মধ্যে Actions ট্যাবে যাবো

তারপর বাম পাশের সাইড বার উপরের দিকে (ছবিতে) New Workflow তে ক্লিক করব।

Choose a Workflow পেজ এর Set up a workflow yourself ➡️ তে ক্লিক করব main.yml ফাইল দেখা যাবে যেখানে CI/CD pipeline প্রধান কাজ। এখন আমাদেরকে এই গিটহাবে যেতে হবে এবং সর্বশেষ আপডেট কোড যেটা কপি করে main.yml ফাইলে পেস্ট করে দিতে হবে।

on:
  push:
    branches:
      - master
name: 🚀 Deploy website on push
jobs:
  web-deploy:
    name: 🎉 Deploy
    runs-on: ubuntu-latest
    steps:
      - name: 🚚 Get latest code
        uses: actions/checkout@v2

      - name: Use Node.js 18
        uses: actions/setup-node@v2
        with:
          node-version: "18"

      - name: 🔨 Build Project
        run: |
          npm install
          npm run build

      - name: 📂 Sync files
        uses: SamKirkland/FTP-Deploy-Action@4.3.4
        with:
          server: ${{secrets.FTP_SERVER}}
          username: ${{secrets.FTP_USERNAME}}
          password: ${{ secrets.FTP_PASSWORD }}

আমার ব্রাঞ্চ মাস্টার ছিল সেজন্য মাস্টার দেওয়া, আপনার মেইন থাকলে সেটা দিবেন। আপনার প্রজোক্টের জন্য node js ভার্সন দরকার সেটা বলে দিবেন। আর কোন কাজ নাই। এখন ফাইল সেভ করার পর গিটহাবের ফাইল গুলা সি-প্যানেলে কপি হবে।

C-Panel এ Dependency installation:

আপনার সি-প্যানেলের software section এ যেয়ে Node js নির্বাচন করুন।
create application এ যেয়ে node js এর ভার্সন নির্বাচন করুন যেটা আপনি main.yml ফাইল এ দিয়েছিলেন। Application root হচ্ছে আপনি FTP account তৈরি করলে যে ফোল্ডার তৈরি হয়েছিলো অর্থাৎ যেখানে প্রজেক্ট ফাইল গুলা কপি হয়েছে সেটার নাম

Application URL যদি সাবডোমেইন না হয় তাহলে এটা অপরিবর্তিত থাকবে। Application startup file এ server.js লিখে CREATE বাটনে ক্লিক করবেন। এরপর npm install করলে কাজ শেষ।

বিঃ দ্রঃ আমাদের দেশের শেয়ার্ড অধিকাংশ হোস্টিং প্রভাইডার হয় কিপটা নতুবা বোঝে বেশি। আমি ইতিপূর্বে Dhaka apps, hostacent, hostmight ব্যবহার করেছি তাদের সফটওয়্যার সেকশন ই থাকত না। এখন পরিবর্তন হয়েছে কিনা জানিনা। এখন cheaphosta ব্যবহার করি। আল্লাহর রহমতে অনেক ভালো সার্ভিস পাচ্ছি(এটা কিন্তু মার্কেটিং না।)। অথবা আপনি চাইলে Hostinger থেকে ডোমেইন কিনে ভার্সেলের সাথে কানেক্ট করে নিতে পারেন।

পড়ার মত ধৈর্য না থাকলে আমার এই ভিডিও টা দেখতে পারেনঃ