Niedawno zmieniłem serwer wirtualny i musiałem wszystko skonfigurować od nowa. Preferuję, aby strona była dostępna przez https i certyfikaty letsencrypt były uzyskiwane i odnawiane automatycznie. Można to osiągnąć, używając dwóch obrazów docker: nginx-proxy i nginx-proxy-companion.
To jest przewodnik, jak skonfigurować stronę na dockerze, z proxy, które automatycznie uzyskuje Certyfikaty SSL. Używany jest serwer wirtualny CentOS 7.
Zakładam, że serwer został już zakupiony, skonfigurowany, dostęp jest realizowany przez klucz, zainstalowano fail2ban itd.
Na początek należy zainstalować docker.
- Najpierw należy zainstalować zależności
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 - Podłączyć repozytorium
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - Następnie zainstalować edycję społecznościową dockera
$ sudo yum install docker-ce docker-ce-cli containerd.io - Dodać dockera do autostartu i uruchomić
$ sudo systemctl enable docker $ sudo systemctl start docker - Dodać użytkownika do grupy docker, aby mieć możliwość uruchamiania dockera bez sudo
$ usermod -aG docker user
Następny krok to zainstalowanie docker-compose. Narzędzie można zainstalować na kilka sposobów, ale preferuję instalację przez menedżera pip i virtualenv, aby nie zaśmiecać systemu zbędnymi pakietami.
- Zainstalować pip
$ sudo yum install python-pip - Zainstalować virtualenv
$ pip install virtualenv - Teraz należy utworzyć katalog projektu i go zainicjować. Katalog z wszystkimi potrzebnymi do zarządzania pakietami będzie nazywał się ve.
$ mkdir docker $ cd docker $ virtualenv ve - Aby rozpocząć korzystanie z wirtualnego środowiska, należy wykonać następującą komendę w katalogu projektu.
$ source ve/bin/activate - Można teraz zainstalować docker-compose.
pip install docker-composeAby kontenery mogły się wzajemnie widzieć, utworzymy sieć. Domyślnie używany jest sterownik bridge.
$ docker network create networkNastępnie należy skonfigurować docker-compose, proxy będzie znajdować się w katalogu proxy, a testowa strona w katalogu test. Dla przykładu używam nazwy domeny example.com
$ mkdir proxy $ mkdir test $ touch proxy/docker-compose.yml $ touch test/docker-compose.ymlZawartość proxy/docker-compose.yml
wersja: '3' sieci: domyślna: zewnętrzna: nazwa: sieć usługi: nginx-proxy: nazwa_kontenera: nginx-proxy obraz: jwilder/nginx-proxy porty: - 80:80 - 443:443 woluminy: - certyfikaty:/etc/nginx/certyfikaty - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro nginx-proxy-letsencrypt: nazwa_kontenera: nginx-proxy-letsencrypt obraz: jrcs/letsencrypt-nginx-proxy-companion woluminy: - certyfikaty:/etc/nginx/certyfikaty - vhost.d:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro środowisko: - NGINX_PROXY_CONTAINER=nginx-proxy woluminy: certyfikaty: vhost.d: html:Zmienna środowiskowa NGINX_PROXY_CONTAINER jest potrzebna, aby kontener letsencrypt mógł zobaczyć kontener proxy. Foldery /etc/nginx/certyfikaty, /etc/nginx/vhost.d oraz /usr/share/nginx/html muszą być współdzielone przez oba kontenery. Aby kontener letsencrypt działał poprawnie, aplikacja musi być dostępna zarówno na porcie 80, jak i 443.
Zawartość test/docker-compose.yml
wersja: '3' sieci: domyślna: zewnętrzna: nazwa: sieć usługi: nginx: nazwa_kontenera: nginx obraz: nginx:najświeższy środowisko: - VIRTUAL_HOST=example.com - LETSENCRYPT_HOST=example.com - LETSENCRYPT_EMAIL=admin@example.comTutaj zmienne środowiskowe są potrzebne, aby proxy poprawnie obsługiwało żądania do serwera i żądało certyfikatu na poprawną nazwę domeny.
Pozostało tylko uruchomić docker-compose
$ cd proxy $ docker-compose up -d $ cd ../test $ docker-compose up -d
Źródło: habr.com
