<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@500&family=IBM+Plex+Sans:wght@400;500;600&family=Instrument+Sans:wght@600;700&family=Noto+Sans+Georgian:wght@400..700&display=swap"> გადასვლა შიგთავსზე
Binwi logo

Node.js აპლიკაციის გაშვება

მაგალითებში svm123 თქვენი მომხმარებლის სახელია, SERVER_IP კი სერვერის მისამართი — ორივე მოცემულია კონსოლში, თქვენი SVM-ის „წვდომის“ ჩანართზე.

გაუშვით აპლიკაცია სერვისად, რომელიც თავად ირთვება და გამოსვლის შემდეგაც მუშაობს, შემდეგ nginx მიუთითეთ მასზე:

# 1. the app: listen on the socket (or port) it is given
cd ~/apps && git clone https://github.com/you/app.git myapp && cd myapp
npm install
#    app.listen(process.env.SOCK || process.env.PORT)

# 2. keep it running, also after you log out and after reboots
cp ~/.config/systemd/user/app.service.example ~/.config/systemd/user/myapp.service
nano ~/.config/systemd/user/myapp.service      # WorkingDirectory=%h/apps/myapp
systemctl --user daemon-reload
systemctl --user enable --now myapp

# 3. send your domain to it
cp ~/nginx/conf.d/node-app.conf.example ~/nginx/conf.d/myapp.conf
nano ~/nginx/conf.d/myapp.conf                 # server_name example.com www.example.com;
systemctl --user reload svm-nginx

სანიმუშო სერვისი აპლიკაციას პირად სოკეტს აძლევს SOCK ცვლადში. თუ აპლიკაციას მხოლოდ TCP პორტი შეუძლია, გამოიყენეთ თქვენი ერთ-ერთი პორტი 127.0.0.1-ზე — ისინი „რესურსების გამოყენების“ ჩანართზე ჩანს — და მიუთითეთ PORT. სხვა პორტები დაბლოკილია.

Next.js

next start სოკეტზე ვერ მუშაობს, ამიტომ მიეცით თქვენი ერთ-ერთი პორტი („რესურსების გამოყენების“ ჩანართზე ჩანს) და nginx მიუთითეთ 127.0.0.1-ზე ამ პორტით:

# ~/.config/systemd/user/mynext.service
[Service]
WorkingDirectory=%h/apps/mynext
Environment=NODE_ENV=production
ExecStart=%h/apps/mynext/node_modules/.bin/next start -p 10000 -H 127.0.0.1
Restart=on-failure

[Install]
WantedBy=default.target
# ~/nginx/conf.d/mynext.conf
server {
    listen unix:/run/svm/svm123/nginx.sock;
    server_name example.com www.example.com;
    location / {
        proxy_pass http://127.0.0.1:10000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}
npx next build --webpack            # not Turbopack — see below
systemctl --user daemon-reload
systemctl --user enable --now mynext
systemctl --user reload svm-nginx

ააწყვეთ webpack-ით და არა Turbopack-ით. Next.js 16 ნაგულისხმევად Turbopack-ს იყენებს, რომელიც დამხმარე პროცესებს შემთხვევითი ლოკალური პორტებით უკავშირდება — SVM-ზე თითოეულ ანგარიშს მხოლოდ საკუთარი პორტები აქვს, ამიტომ Turbopack-ით აწყობა შეცდომით „binding to a port: Operation not permitted“ ჩერდება. webpack-ით აწყობის შედეგი იგივეა. ყველაზე მარტივია პარამეტრის package.json-ში ჩაწერა:

// package.json — so npm run build / npm run dev work as usual
"scripts": {
  "dev": "next dev --webpack",
  "build": "next build --webpack",
  "start": "next start"
}

აწყობას გაშვებაზე მეტი მეხსიერება სჭირდება: next build-ს დაახლოებით 1 GB სჭირდება, გაშვებულ აპლიკაციას კი დაახლოებით 150 MB. თუ აწყობა „Killed“ შეტყობინებით ჩერდება, პაკეტის მეხსიერება არ ეყო — ააწყვეთ თქვენს კომპიუტერზე და ატვირთეთ .next საქაღალდესთან ერთად, ან გამოიყენეთ უფრო დიდი პაკეტი. გვერდებს, რომლებიც აწყობისას თქვენს API-ს მიმართავს, მუშა API სჭირდება.