├── index.js ├── package.json ├── .gitignore └── README.md /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const app = express() 3 | 4 | app.get('/', (req, res) => { 5 | res.send('

Node application

') 6 | }) 7 | 8 | app.listen(5000, () => { 9 | console.log('App listening on port 5000') 10 | }) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deploy-node-nginx-ssl", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/yestellar/deploy-node-nginx-ssl.git" 12 | }, 13 | "keywords": [], 14 | "author": "", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/yestellar/deploy-node-nginx-ssl/issues" 18 | }, 19 | "homepage": "https://github.com/yestellar/deploy-node-nginx-ssl#readme", 20 | "dependencies": { 21 | "express": "^4.17.1" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Деплой Node.js, с уcтановкой Nginx и SSL Let's Encrypt 2 | 3 | [![DigitalOcean Referral Badge](https://web-platforms.sfo2.cdn.digitaloceanspaces.com/WWW/Badge%201.svg)](https://www.digitalocean.com/?refcode=96eb2d860a30&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge) 4 | 5 | ## Установка сервера 6 | Сервер будет установлен на Digital Ocean. Получите 100$ при регистрации, перейдя по [этой реферальной ссылке](https://www.digitalocean.com/?refcode=96eb2d860a30&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge). 7 | 8 | - На старнице Droplets, создайте новый Ubuntu сервер, и подключите ssh ключ. 9 | 10 | ## Установка необходимых библиотек 11 | 12 | - Подключитесь к серверу по SSH. 13 | - Обновите состояние пакетов: 14 | ``` 15 | sudo apt update 16 | ``` 17 | - Установите Curl: 18 | ``` 19 | sudo apt install curl 20 | ``` 21 | - Установите NVM (Node Version Manager): 22 | ``` 23 | curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash 24 | source ~/.profile 25 | ``` 26 | - Установите Node: 27 | ``` 28 | # Установить последную версию 29 | nvm install node 30 | # Установить конкретную версию 31 | nvm install 14.17.3 32 | nvm use 14.17.3 33 | # Установить версию по умолчанию 34 | nvm alias default 14.17.3 35 | # Проверить активную версию 36 | node -v 37 | ``` 38 | - Склонируйте Git репозиторий: 39 | ``` 40 | git clone (https ссылка на репозиторий) 41 | ``` 42 | - Зайдите в папку приложения и установите node_modules: 43 | ``` 44 | ls -l # Посмотреть список файлов 45 | cd (имя репозитория) 46 | npm install 47 | ``` 48 | - Установите PM2 и запустите node приложение: 49 | ``` 50 | npm install -g pm2 51 | NODE_ENV=production pm2 start npm --name strapi -- run start # Запустить в режиме продакшн npm run start скрипт и назвать "strapi" 52 | pm2 status # Статус процессов 53 | pm2 logs # Показать логи приложения (Ctrl + C чтобы выйти) 54 | pm2 startup ubuntu # Запускать pm2 при рестарте системы 55 | pm2 save # Сохранить процесс чтобы при перезапуске сам запускался 56 | ``` 57 | ## Установка firewall 58 | 59 | ``` 60 | ufw status 61 | ufw enable # Oтвечаем 'y' 62 | ufw allow ssh 63 | ufw allow http 64 | ufw allow https 65 | ``` 66 | ## Установка Nginx 67 | ``` 68 | sudo apt install nginx # Отвечаем 'y' 69 | sudo nano /etc/nginx/sites-available/default 70 | ``` 71 | - Поля server_name и location / {} измените на: 72 | ``` 73 | server_name your-domain.com www.your-domain.com; 74 | 75 | location / { 76 | proxy_pass http://localhost:5000; # Порт на котором запускается node.js приложение 77 | proxy_http_version 1.1; 78 | proxy_set_header Upgrade $http_upgrade; 79 | proxy_set_header Connection 'upgrade'; 80 | proxy_set_header Host $host; 81 | proxy_cache_bypass $http_upgrade; 82 | } 83 | ``` 84 | - Ctrl + X чтобы выйти, 'y' чтобы сохранить 85 | - Если запущен Apache сервер, его необходимо остановить 86 | ``` 87 | service apache2 status 88 | sudo systemctl disable apache2 && sudo systemctl stop apache2 89 | ``` 90 | - Проверьте синтаксис Nginx и перезапустите сервер 91 | ``` 92 | sudo nginx -t 93 | sudo service nginx restart 94 | ``` 95 | 96 | ## Привязка домена 97 | - Добавьте домен в DigitalOcean (страница Networking, вкладка Domains). 98 | - Добавьте две записи типа 'A'. В первой Hostname равен '@', во второй 'www'. Нажмите на поле с IP и выберете droplet (сервер). 99 | - На странице регистратора вашего домена добавьте DNS записи: 100 | ``` 101 | ns1.digitalocean.com 102 | ns2.digitalocean.com 103 | ns3.digitalocean.com 104 | ``` 105 | - Подождите до 48 часов (может быть и 5 минут) пока обновятся DNS записи 106 | 107 | ## Установка SSL сертфиката Let's Encrypt 108 | ``` 109 | sudo apt install certbot python3-certbot-nginx # Отвечаем 'y' 110 | sudo certbot --nginx -d your-domain.com -d www.your-domain.com 111 | certbot renew --dry-run 112 | ``` 113 | 114 | **Да будет свет** 115 | --------------------------------------------------------------------------------