├── 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 | [](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 |
--------------------------------------------------------------------------------