[tutorial] Raspberry Pi – Docker, Proxy, Let’s Encrypt, SUPLA, SUPLA-Scripts...

lesny8
Posts: 175
Joined: Mon Dec 11, 2017 9:43 pm

Mon Dec 03, 2018 1:19 am

Czołem suplowicze!

Ten tutorial jest dla użytkowników SUPLI, którzy posiadają Raspberry Pi, i którzy chcieliby mieć własną instancję SUPLA - Cloud w domu z zielonym, poprawnym certyfikatem zweryfikowanym przez Let’s Encrypt. Obok własnej instancji SUPLI można zaparkować SUPLA-Scripts od @fracz, lub cokolwiek innego.

Temat był poruszany już w kilku wątkach. Niektórym się udało jakoś poskładać wszystko do kupy, a niektórym nie. Jako, że zaszła u mnie potrzeba postawienia wszystkiego od nowa (nowa karta tym razem Industrial, bo stara padła), postanowiłem cały proces jak najbardziej dokładnie opisać STEP by STEP, tak aby nawet użytkownicy oderwani łopatą od windowsa sobie z tym poradzili ;)




#1
Router i Domena

Co potrzebujemy mieć i jak skonfigurowane, na wstępie?
  • RaspberryPi i czystą kartę SDHC min 8GB(sugeruję kupić wersję przemysłową)
  • Zewnętrzny adres IP:
    • jeśli mamy stałe IP to potrzebna jest własna domena.
      Może być darmowa np. zarejestrowana w dot.tk. U rejestratora domeny w DNS ustawiamy rekordy A wskazujące na nasz adres IP, dla domeny i subdomen (cloud, scripts i czegokolwiek innego).
    • jeśli mamy zmienne IP (Neustrada, Netia, Internet mobilny itd.) trzeba skonfigurować DDNS w posiadanym routerze.
      Link do filmu wyjaśniającego w czym rzecz.
  • W routerze rezerwujemy jakiś wewnętrzny adres IP dla naszego RPI.
    Jeśli klasa adresowa naszego routera to 192.168.0.0/24 i router jest bramką i ma adres 192.168.0.1, to RPI niech ma adres 192.168.0.2 lub każdy inny wolny z tej klasy. Ważne, żeby przypisać RPI go na stałe, by DHCP zawsze dawał naszej malinie ten sam adres. Jest to konieczne z uwagi na przekierowanie portów.
  • Robimy przekierowane portów TCP 80 i 443 na wewnętrzny adres IP RPI.
    Sprawdźcie to w pierwszej kolejności, czy posiadany router/dostawca internetu daje wam możliwość przekierowania poru 80 TCP, jest to kluczowy warunek dla Let’s Encrypt podczas weryfikacji domeny. Jeśli nie to trzeba szukać alternatywnego firmware dla routera albo zmienić router/dostawcę internetu na taki z możliwością przekierowania portu TCP 80.
  • Robimy przekierowanie portów TCP 2015 i 2016.
    Jest to wymagane do działania APP na smartfonach i tabletach.
  • Ustawiamy NAT Loopback.
    Jeśli tego nie ustawimy, bo nasz router jest ograniczony funkcjonalnie, to będąc w sieci LAN nie połączymy się do usług po nazwie domeny/subdomeny, a tylko po nazwie możemy się do nich podłączyć w omawianym trybie proxy. Od strony WAN-u będzie wszystko działać.



#2
Raspbian Lite

Jeżeli już poustawiamy wszystko co niezbędne, to czas na zabawę z Raspberry Pi.

Robimy formatowanie karty programem SD Memory Card Formatter (do tego potrzebny windows), jeżeli była wcześniej używana w innych urządzeniach, środowiskach. Nowe karty tego nie potrzebują.

Rozpakowujemy na kartę pobrany aktualny pakiet NOOBS Lite.
Umieszczamy kartę w RPI i uruchamiamy sprzęt. Jak już malinka wystartuje to podłączamy ją do naszej sieci WiFi, albo przewodem i instalujemy Raspbian Lite.

Idziemy na kawę...

Po zainstalowaniu logujemy się jako użytkownik pi z hasłem raspberry,
Zmieniamy domyślne hasło wpisując

Code: Select all

passwd
Włączamy ssh, żeby nie klepać komend i móc zastosować jakże ważną technikę kopiuj-wklej ;)

Code: Select all

sudo raspi-config
logujemy się do naszego RPI przez putty po ssh i uaktualniamy pakiety.

Code: Select all

sudo apt update
sudo apt -y upgrade
Opcjonalnie instalujemy sobie Midnight Commander-a, czasami się przydaje.

Code: Select all

sudo apt -y install mc
Instaluje wszystko co niezbędne do instalacji docker i docker-compose.

Code: Select all

sudo apt -y install git curl
sudo apt -y install python-pip && pip 
potem instalacja docker

Code: Select all

curl -sSL https://get.docker.com | sh
Dodajemy użytkownika pi do grupy docker.

Code: Select all

sudo usermod -a -G docker pi
Wylogowujemy się i logujemy ponownie do maliny.

Instalujemy docker-compose.

Code: Select all

sudo pip install docker-compose
Sprawdzamy wersje zainstalowanych składników.

Code: Select all

docker -v && docker-compose -v
Na dzisiaj powinniśmy dostać taki wynik

Code: Select all

Docker version 18.09.0, build 4d60db4
docker-compose version 1.23.2, build 1110ad0



#3
PROXY Let’s Encrypt


Możemy przejść teraz do instalacji PROXY i parkowania pierwszych kontenerów.

Pobieramy co trzeba.

Code: Select all

cd ~
git clone https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion.git
Tworzymy nasz plik .env na podstawie sampla

Code: Select all

cd  docker-compose-letsencrypt-nginx-proxy-companion/
cp .env.sample .env
Jako, że uruchamiamy to na RPI musimy zmienić obraz dla dwóch kontenerów, aby działał na naszej architekturze sprzętowej, bo bez tej zmiany nie zadziała. Robimy to jak w tym commicie.

Wystarczy tylko zmiana w pliku docker-compose.yml

Code: Select all

nano docker-compose.yml
Odpalamy skrypt

Code: Select all

./start.sh
Sprawdzamy po wszystkim uruchomione kontenery

Code: Select all

docker ps
Mój wynik

Code: Select all

CONTAINER ID        IMAGE                                                   COMMAND                  CREATED              STATUS              PORTS                                      NAMES
068dbdafdea2        wouterds/rpi-docker-gen                                 "/usr/local/bin/dock…"   About a minute ago   Up 24 seconds                                                  nginx-gen
ec1849d73f73        wouterds/rpi-docker-letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   About a minute ago   Up 24 seconds                                                  nginx-letsencrypt
465367d78385        nginx                                                   "nginx -g 'daemon of…"   About a minute ago   Up 24 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-web



#4
SUPLA-DOCKER


Przyszedł czas na Suplę, klonujemy git-a.

Code: Select all

cd ~
git clone https://github.com/SUPLA/supla-docker.git
Uruchamiamy skrypt i edytujemy wygenerowany plik .env

Code: Select all

./supla-docker/supla.sh
nano supla-docker/.env
Podajemy nazwę naszej domeny, pierwszego użytkownika z hasłem, nasz adres mailowy, haszujemy porty i zmieniamy standalone na proxy

Code: Select all

# Where the SUPLA Cloud will be accessible? Put domain or IP address here with port.
CLOUD_DOMAIN=moja_domena.tk

# Initial user account details; delete these settings after the first launch
FIRST_USER_EMAIL=prawdziwy_adres@mailowy.pl
FIRST_USER_PASSWORD=nasze_haslo
....
# If you want to be notified about some server errors, set this
ADMIN_EMAIL=prawdziwy_adres@mailowy.pl
....
# On which ports the SUPLA Cloud should listen (only if standalone mode)
#PORT_HTTP=80
#PORT_HTTPS=443
....
COMPOSE_FILE=docker-compose.yml:docker-compose.proxy.yml:docker-compose.arm32v7.yml
Uruchamiamy kontenery

Code: Select all

./supla-docker/supla.sh start
Druga kawa ;)

Sprawdzamy czy wszystko wystartowało prawidłowo

Code: Select all

docker ps
Mój wynik

Code: Select all

CONTAINER ID        IMAGE                                                   COMMAND                  CREATED              STATUS              PORTS                                      NAMES
753cf45457bd        supla/supla-server:arm32v7                              "/usr/bin/server-ent…"   About a minute ago   Up About a minute   0.0.0.0:2015-2016->2015-2016/tcp           supla-server
e2bbc4fa7a49        supla/supla-cloud:arm32v7                               "docker-php-entrypoi…"   2 minutes ago        Up About a minute   80/tcp                                     supla-cloud
db2e3dc01015        hypriot/rpi-mysql:5.5                                   "/entrypoint.sh mysq…"   3 minutes ago        Up 2 minutes        3306/tcp                                   supla-db
068dbdafdea2        wouterds/rpi-docker-gen                                 "/usr/local/bin/dock…"   19 minutes ago       Up 18 minutes                                                  nginx-gen
ec1849d73f73        wouterds/rpi-docker-letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   19 minutes ago       Up 18 minutes                                                  nginx-letsencrypt
465367d78385        nginx                                                   "nginx -g 'daemon of…"   19 minutes ago       Up 18 minutes       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-web



#5
SUPLA-SCRIPTS


A teraz supla-scripts od @fracz, klonujemy.

Code: Select all

git clone https://github.com/fracz/supla-scripts.git
Uruchamiamy skrypt i edytujemy wygenerowany plik .env

Code: Select all

./supla-scripts/docker/suplascripts.sh
nano supla-scripts/docker/.env
Hashujemy porty bo to dotyczy konfiguracji standalone. Odhaszowujemy i wypełniamy naszą subdomeną i nasz adres mailowy. Zmieniamy standalone na proxy.

Code: Select all

##### STANDALONE MODE CONFIGURATION #####
#PORT_HTTP=80
#PORT_HTTPS=443
....
##### PROXIED MODE CONFIGURATION #####
DOMAIN_NAME=scripts.moja_domena.tk
ADMIN_EMAIL=prawdziwy_adres@mailowy.pl
....
COMPOSE_FILE=docker-compose.base.yml:docker-compose.proxy.yml:docker-compose.arm32v7.yml
Jeśli .env skonfigurowany to instalujemy

Code: Select all

supla-scripts/docker/suplascripts.sh start
Kolejna kawa :)

Po zainstalowaniu sprawdzamy czy wszystkie kontenery działają

Code: Select all

docker ps
Mój wynik

Code: Select all

CONTAINER ID        IMAGE                                                   COMMAND                  CREATED              STATUS              PORTS                                      NAMES
397c7b769734        suplascripts_suplascripts                               "docker-php-entrypoi…"   About a minute ago   Up 36 seconds       80/tcp                                     suplascripts
9e83f5655b86        hypriot/rpi-mysql:5.5                                   "/entrypoint.sh mysq…"   About a minute ago   Up About a minute   3306/tcp                                   suplascripts-db
753cf45457bd        supla/supla-server:arm32v7                              "/usr/bin/server-ent…"   34 minutes ago       Up 34 minutes       0.0.0.0:2015-2016->2015-2016/tcp           supla-server
e2bbc4fa7a49        supla/supla-cloud:arm32v7                               "docker-php-entrypoi…"   35 minutes ago       Up 34 minutes       80/tcp                                     supla-cloud
db2e3dc01015        hypriot/rpi-mysql:5.5                                   "/entrypoint.sh mysq…"   36 minutes ago       Up 35 minutes       3306/tcp                                   supla-db
068dbdafdea2        wouterds/rpi-docker-gen                                 "/usr/local/bin/dock…"   About an hour ago    Up About an hour                                               nginx-gen
ec1849d73f73        wouterds/rpi-docker-letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   About an hour ago    Up About an hour                                               nginx-letsencrypt
465367d78385        nginx                                                   "nginx -g 'daemon of…"   About an hour ago    Up About an hour    0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx-web
I sprawdzamy w przeglądarce instancję SUPLI i SUPLA-Scripts, musi działać i to na zielono :mrgreen:
lesny8
Posts: 175
Joined: Mon Dec 11, 2017 9:43 pm

Mon Dec 03, 2018 1:20 am

Reserv
User avatar
Woden
Posts: 15
Joined: Sat Mar 10, 2018 9:17 am

Mon Dec 03, 2018 8:59 am

lesny8 jesteś Wielki. Męczyłem się z tym wszystkim przez ostatnie dwa tygodnie, a z Twoją instrukcją poszło jak "za dotknięciem czarodziejskiej różdżki". Kawał dobrej roboty.
User avatar
Piotr61
Posts: 44
Joined: Fri Sep 15, 2017 12:59 pm

Mon Dec 03, 2018 9:01 am

lesny8 wrote:
Mon Dec 03, 2018 1:19 am
... Rozpakowujemy na kartę pobrany aktualny pakiet NOOBS Lite...
A nie można od razu Raspbian Stretch Lite :?:
lesny8
Posts: 175
Joined: Mon Dec 11, 2017 9:43 pm

Mon Dec 03, 2018 9:19 am

Woden wrote:
Mon Dec 03, 2018 8:59 am
Męczyłem się z tym wszystkim przez ostatnie dwa tygodnie, a z Twoją instrukcją poszło jak "za dotknięciem czarodziejskiej różdżki".
;)
Sam się męczyłem z tym kiedyś i odpuściłem. Ostatecznie aplikacje działały mi w trybie standalone, na różnych portach. Dziś działają w trybie proxy na standardowych portach i mogę się cieszyć zielonym certyfikatem bez potwierdzania wyjątków bezpieczeństwa w przeglądarkach.
Piotr61 wrote:
Mon Dec 03, 2018 9:01 am
A nie można od razu Raspbian Stretch Lite :?:
Oczywiście, że można ;)
Sibikk
Posts: 250
Joined: Mon Nov 07, 2016 12:42 pm
Location: Katowice

Mon Dec 03, 2018 9:35 am

Tego Tu brakowało od dawna. :-) Jak by tak udało Ci się jeszcze dodać do instrukcji obsługę I/O SUPLA-DEV to było by fantastycznie.
cino111
Posts: 179
Joined: Mon May 07, 2018 8:00 pm

Thu Dec 06, 2018 9:15 pm

Niezła robota. Nie wiedzialem jal do tego podejść. Pytanie tylko czy domenę muszę wykupić, czy mogę wpisać ddns?
lesny8
Posts: 175
Joined: Mon Dec 11, 2017 9:43 pm

Thu Dec 06, 2018 9:32 pm

Zależy czy masz stały czy zmienny adres IP.
Jeśli stały to zakładasz darmową domenę i tworzysz w DNSach dwa rekordy A wskazujące na ten sam adres IP. Jeden dla domeny drugi dla subdomeny.
W przypadku adresu zmiennego opisałem tu.
Do usług stojących za PROXY odwołujesz się po nazwach domen/subdomen, a nie po adresie IP:PORT. Dlatego ważne jest by mieć ich tyle ile usług, aby PROXY wiedziało gdzie kierować ruch przy wywołaniu, a Let's Encrypt dla każdej z nich mógł zweryfikować i wystawić certyfikat.
User avatar
siba
Posts: 73
Joined: Mon Feb 06, 2017 4:01 pm
Location: Kraków

Sat Dec 08, 2018 10:30 am

Witam wszystkich
Testuję to na czystym raspian lite od zera i coś nie idzie. Może autor poradnika lub ktokolwiek podpowie co tu może być nie tak.
Po wpisaniu:

docker logs --tail=50 nginx-letsencrypt

dostaję coś takiego

Code: Select all

Info: Creating Diffie-Hellman group in the background.
A pre-generated Diffie-Hellman group will be used for now while the new one
is being created.
Generating DH parameters, 2048 bit long safe prime, generator 2
2018/12/08 10:06:16 Generated '/app/letsencrypt_service_data' from 3 containers
2018/12/08 10:06:16 Running '/app/signal_le_service'
2018/12/08 10:06:16 Watching docker events
2018/12/08 10:06:16 Contents of /app/letsencrypt_service_data did not change. Skipping notification '/app/signal_le_service'
Sleep for 3600s
2018/12/08 10:07:05 Received event start for container a59090e3aa59
2018/12/08 10:07:09 Received event start for container 4226c71ea874
2018/12/08 10:07:14 Received event start for container abd65a4a64a1
2018/12/08 10:07:29 Debounce minTimer fired
2018/12/08 10:07:29 Generated '/app/letsencrypt_service_data' from 6 containers
2018/12/08 10:07:29 Running '/app/signal_le_service'
/etc/nginx/certs/suplacloud.mojadomena.pl /app
Reloading nginx docker-gen (using separate container nginx-gen)...
Reloading nginx (using separate container a64b4dce11451bbdb67726e7ebd3b2dfca3574aa39117c76b034209263361d26)...
Creating/renewal suplacloud.mojadomena.pl certificates... (suplacloud.mojadomena.pl)
2018-12-08 10:07:34,889:INFO:simp_le:1382: Generating new account key
2018-12-08 10:07:43,626:INFO:simp_le:1407: By using simp_le, you implicitly agree to the CA's terms of service: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
2018-12-08 10:07:44,947:INFO:simp_le:1479: Generating new certificate private key
2018-12-08 10:08:22,970:ERROR:simp_le:1446: CA marked some of the authorizations as invalid, which likely means it could not access http://example.com/.well-known/acme-challenge/X. Did you set correct path in -d example.com:path or --default_root? Are all your domains accessible from the internet? Please check your domains' DNS entries, your host's network/firewall setup and your webserver config. If a domain's DNS entry has both A and AAAA fields set up, some CAs such as Let's Encrypt will perform the challenge validation over IPv6. If your DNS provider does not answer correctly to CAA records request, Let's Encrypt won't issue a certificate for your domain (see https://letsencrypt.org/docs/caa/). Failing authorizations: https://acme-v01.api.letsencrypt.org/acme/authz/Ht-KntSLE639oc70TiHHIFXt0nYSZqXC3zRVxt-R0zI
2018-12-08 10:08:22,994:INFO:simp_le:360: Saving account_key.json
Challenge validation has failed, see error log.
i jeszcze
docker logs --tail=50 supla-cloud

Code: Select all

Database connection has been established.

                    Application Migrations


No migrations to execute.

 // Warming up the cache for the prod environment with debug
 // false

 [OK] Cache for the "prod" environment (debug=false) was successfully warmed.

2018-12-08 10:07:35,529 CRIT Supervisor running as root (no user in config file)
2018-12-08 10:07:35,545 INFO supervisord started with pid 1
2018-12-08 10:07:36,550 INFO spawned: 'apache' with pid 51
2018-12-08 10:07:36,554 INFO spawned: 'cron' with pid 52
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.19.0.5. Set the 'ServerName' directive globally to suppress this message
[Sat Dec 08 10:07:37.290963 2018] [ssl:warn] [pid 51] AH01906: 172.19.0.5:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Sat Dec 08 10:07:37.291139 2018] [ssl:warn] [pid 51] AH01909: 172.19.0.5:443:0 server certificate does NOT include an ID which matches the server name
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.19.0.5. Set the 'ServerName' directive globally to suppress this message
[Sat Dec 08 10:07:37.463896 2018] [ssl:warn] [pid 51] AH01906: 172.19.0.5:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Sat Dec 08 10:07:37.463971 2018] [ssl:warn] [pid 51] AH01909: 172.19.0.5:443:0 server certificate does NOT include an ID which matches the server name
[Sat Dec 08 10:07:37.474422 2018] [mpm_prefork:notice] [pid 51] AH00163: Apache/2.4.10 (Debian) PHP/7.0.26 OpenSSL/1.0.1t configured -- resuming normal operations
[Sat Dec 08 10:07:37.474514 2018] [core:notice] [pid 51] AH00094: Command line: 'apache2 -D FOREGROUND'
2018-12-08 10:07:38,476 INFO success: apache entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2018-12-08 10:07:38,477 INFO success: cron entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
Dodam jeszcze że przed uruchomieniem kontenerów z proxy supla-cloud otwierał się z zewnątrz po adresie domeny.
I jeszcze poniżej zawartość mojego pliku ze ścieżki supla-docker/.env

Code: Select all

# Where the SUPLA Cloud will be accessible? Put domain or IP address here with port.
CLOUD_DOMAIN=suplacloud.mojadomena.pl

# Initial user account details; delete these settings after the first launch
FIRST_USER_EMAIL=
FIRST_USER_PASSWORD=

# Google ReCaptcha settings
RECAPTCHA_ENABLED=false
RECAPTCHA_PUBLIC_KEY=
RECAPTCHA_PRIVATE_KEY=

# Mailer settings (SMTP)
MAILER_HOST=10.0.75.1
MAILER_PORT=465
MAILER_USER=
MAILER_PASSWORD=
MAILER_ENCRYPTION=ssl
MAILER_FROM=

# If you want to be notified about some server errors, set this
ADMIN_EMAIL=mojemail@gmail.com

# Where to store SUPLA Cloud's data
VOLUME_DATA=./var

# On which ports the SUPLA Cloud should listen (only if standalone mode)
PORT_HTTP=80
PORT_HTTPS=443

REQUIRE_REGULATIONS_ACCEPTANCE=false
REQUIRE_COOKIE_POLICY_ACCEPTANCE=false
BRUTE_FORCE_AUTH_PREVENTION_ENABLED=true

# These options protect your application
DB_PASSWORD=#########################
SECRET=#########################

COMPOSE_PROJECT_NAME=supla
COMPOSE_PATH_SEPARATOR=:
COMPOSE_FILE=docker-compose.yml:docker-compose.proxy.yml:docker-compose.arm32v7.yml
proszę o jakieś rady, bo już pomysły mi się skończyły
lesny8
Posts: 175
Joined: Mon Dec 11, 2017 9:43 pm

Sat Dec 08, 2018 12:29 pm

Czy to jest Twoja domena?

Code: Select all

# Where the SUPLA Cloud will be accessible? Put domain or IP address here with port.
CLOUD_DOMAIN=suplacloud.mojadomena.pl
a to prawdziwy adres email?

Code: Select all

# If you want to be notified about some server errors, set this
ADMIN_EMAIL=mojemail@gmail.com
bo certyfikat został wystawiony dla tej domeny

Code: Select all

2018/12/08 10:07:29 Running '/app/signal_le_service'
/etc/nginx/certs/suplacloud.mojadomena.pl /app
Reloading nginx docker-gen (using separate container nginx-gen)...
Reloading nginx (using separate container a64b4dce11451bbdb67726e7ebd3b2dfca3574aa39117c76b034209263361d26)...
Creating/renewal suplacloud.mojadomena.pl certificates... (suplacloud.mojadomena.pl)
Ta domena wskazuje na serwer w home.pl, co by oznaczało, że jeżeli to jest Twoja domena to nie masz zdefiniowanego record A w DNS u rejestratora domeny.
Jeśli jednak to nie jest Twoja domena, to masz błąd w pliku .env, wpisz poprawną domenę w CLOUD_DOMAIN i zrestartuj kontenery Supli

Code: Select all

./supla-docker/supla.sh restart
Post Reply