Запустите 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 ГБ, а запущенному приложению — около 150 МБ. Если сборка останавливается с сообщением «Killed», не хватило памяти тарифа — соберите проект на своём компьютере и загрузите его вместе с папкой .next или выберите тариф больше. Страницам, которые во время сборки обращаются к вашему API, нужен работающий API.