> Markdown-версія сторінки https://yucca.app/uk/docs/guides/Nginx/. Зміст документації — [llms.txt](https://yucca.app/uk/llms.txt), весь текст одним файлом — [llms-full.txt](https://yucca.app/uk/llms-full.txt). Markdown-версія є у будь-якої сторінки: додайте `.md` до адреси без слешу наприкінці.

# Налаштування Nginx + Let's Encrypt зворотного проксі перед Yucca

## Вступ

У цій інструкції я опишу, як налаштувати Nginx і випустити Let's Encrypt SSL сертифікат, який автоматично продовжуватиметься. Nginx виступатиме як простий Web сервер перед Yucca для термінації SSL сесії та редиректу з 80 на 443 порт. Навіщо взагалі встановлювати Nginx, адже Yucca й сама може термінувати SSL і навіть [флаги](https://yucca.app/uk/docs/configuration.md#cert_file) для цього є? Це правда, але коли ви зайнятий 443 порт, він буде недоступний для іншого ПЗ, доведеться використовувати якийсь інший, а також не буде редиректу з HTTP на HTTPS – якщо вас це влаштовує, можете сміливо пропустити секцію зі встановленням і налаштуванням Nginx Крок 1 і одразу перейти до Кроку 2. Усі дії я виконуватиму на Ubuntu Server 22.04, але все те саме буде працювати і на SUSE, CentOS, Fedora, Debian тощо. Хіба що пакетний менеджер у всіх буде свій, але я сподіваюся ви відрізните apt від zypper 🙂

## Крок 0. Підготовка

Отже нам знадобиться:

1. Хост з білою IP адресою
2. Домен або піддомен, який дивиться на цю адресу
3. [Встановлена Yucca](https://yucca.app/uk/docs/install.md)

В інструкції я буду використовувати домен `foobar.yuccastream.com`, ваш домен буде відрізнятися.

```sh
nslookup foobar.yuccastream.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	foobar.yuccastream.com
Address: 128.140.2.103

```

[![nginx1](/uk/assets/images/nginx1-f71285a8a03081e772a4456d3f3b9241.png)](https://yucca.app/uk/assets/files/nginx1-f71285a8a03081e772a4456d3f3b9241.png)

Отже у мене є Yucca, доступна за адресою `http://foobar.yuccastream.com:9910`

## Крок 1. Встановлення і налаштування Nginx

Встановлюємо nginx:

```sh
sudo apt install nginx

```

Перевіряємо `http://foobar.yuccastream.com`

[![nginx2](/uk/assets/images/nginx2-e7de29f0a6cc5a16824219d0540ab0f1.png)](https://yucca.app/uk/assets/files/nginx2-e7de29f0a6cc5a16824219d0540ab0f1.png)

Далі створюємо конфігураційний файл для Yucca:

```sh
sudo nano /etc/nginx/conf.d/yucca.conf

```

> **Попередження.** Домен `foobar.yuccastream.com` вам потрібно замінити на свій

```sh
upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  listen 80;
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }
}

```

Збережіть файл і перевірте коректність конфігурації:

```sh
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

```

Якщо все коректно, ви побачите *syntax is ok* Оновлюємо конфігурацію nginx:

```sh
nginx -s reload

```

Оновлюємо сторінку і бачимо вже веб інтерфейс Yucca `http://foobar.yuccastream.com`

[![nginx3](/uk/assets/images/nginx3-4ca009416e84aca46f3096bd20af3521.png)](https://yucca.app/uk/assets/files/nginx3-4ca009416e84aca46f3096bd20af3521.png)

## Крок 2. Встановлення Certbot і випуск letsencrypt сертифіката

Встановлюємо пакети:

```sh
sudo apt install certbot python3-certbot-nginx

```

Випускаємо сертифікат для нашого домену:

> **Попередження.** Домен `foobar.yuccastream.com` вам потрібно замінити на свій

```sh
sudo certbot --nginx -d foobar.yuccastream.com

```

[![nginx4](/uk/assets/images/nginx4-257ee55cf8f90940b2c91fc87749bcb0.png)](https://yucca.app/uk/assets/files/nginx4-257ee55cf8f90940b2c91fc87749bcb0.png)

Сertbot попросить ввести E-mail (1), рекомендую ввести вашу реальну поштову скриньку, у разі якщо сертифікат спливатиме і не продовжиться автоматично, Let's Encrypt надішле вам про це повідомлення. Також потрібно буде погодитися з умовами і правилами (2), (3). Далі certbot сам знайде потрібний конфігураційний файл з потрібним доменом, налаштує секцію з SSL і редирект, на виході покаже вам посилання. Можете подивитися, що в підсумку вийшло у файлі `/etc/nginx/conf.d/yucca.conf`

```sh

upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/foobar.yuccastream.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/foobar.yuccastream.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = foobar.yuccastream.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name foobar.yuccastream.com;
    return 404; # managed by Certbot
}

```

Рекомендую перевірити, що certbot створив таймер для продовження сертифіката, він повинен бути активний:

```sh
sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Fri 2023-09-22 11:54:02 UTC; 7min ago
    Trigger: Fri 2023-09-22 14:13:25 UTC; 2h 11min left
   Triggers: ● certbot.service

Sep 22 11:54:02 foobar systemd[1]: Started Run certbot twice daily.

```

Оновлюємо сторінку `http://foobar.yuccastream.com` і бачимо, що все вже працює через HTTPS, редирект теж працює.

[![nginx5](/uk/assets/images/nginx5-8a3f66842bdeabfcf25bef14aa513371.png)](https://yucca.app/uk/assets/files/nginx5-8a3f66842bdeabfcf25bef14aa513371.png)

## Крок 3. Налаштування безпеки

Ми налаштували доступ по HTTPS через nginx, але Yucca досі доступна по HTTP за адресою <http://foobar.yuccastream.com:9910>. Це пов'язано ось з цим налаштуванням за замовчуванням:

```sh
listen_address = ":9910"

```

Йдемо в конфігураційний файл Yucca і правимо цей параметр:

```sh
sudo nano /opt/yucca/yucca.toml

```

Робимо так, щоб Yucca слухала лише localhost:

```sh
listen_address = "127.0.0.1:9910"

```

І перезавантажуємо сервер Yucca:

```sh
sudo systemctl restart yucca

```

Перевіряємо, тепер за адресою `http://foobar.yuccastream.com:9910` нічого немає, а тут `https://foobar.yuccastream.com` все працює.
