SUPLA-DOCKER z użyciem Docker-Compose + CloudFlare + Proxy
2022-12-27Dzisiaj zajmiemy się szybką i wygodną instalacją serwera SUPLI na własnym serwerze. Nie ważne czy jest to Raspberry Pi a może jakiś terminal typu Dell wyse. Całość podzielimy na kilka kroków. Z racji że już pewne kroki opisałem we wcześniejszych wpisach to będę się do nich odwoływał.
1. Darmowa domena i migracja do CloudFlare
Pierwszy krok wykonujemy tak jak to opisałem w tym wpisie. Dzięki temu będziemy mieli darmową domenę z końcówką eu.org Dodatkowo wygenerujemy sobie pliki crt i key. Przydadzą się do naszego serwera Proxy Nginx. Aby to zrobić logujemy się do CloudFlare wybieramy naszą domenę i przechodzimy kolejno SSL/TLS i wybieramy z podmenu Origin Server. Tam klikamy w Create Certificates.
Gdy już klikniemy pokaże nam się kreator certyfikatów. Upewniamy się że mamy ustawiony typ oraz czas ważności taki jak chcemy. Ja wybieram RSA (2048) oraz 15lat ważności certyfikatu.
Po naciśnięciu Create wygeneruje nam się zawartość certyfikatu oraz klucza. Zapisujemy dopowiednio do pliku domena.eu.org.crt oraz domena.eu.org.key Zapisz te pliki w bezpiecznym miejscu przydadzą się w późniejszej konfiguracji.
2. Instalacja Docker + Portainer + Stack
Ten krok też opisałem w poprzednim wpisie. Przechodzimy do momentu „Instalacja oprogramowania„
Gdy już mamy Dockera i Portainera dodajemy nowy Stack. Jeden dodamy z proxy-nginx-manager a drugi z supla-docker.
Logujemy się do Portainera i dodajemy nowy Stack:
version: '3'
services:
app:
container_name: nginx-proxy-manager
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- 80:80
- 81:81
- 443:443
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Klikamy Deploy the Stack i czekamy na utworzenie kontenerów. Następnie dodajemy Stack z SUPLĄ.
version: '3'
services:
supla-cloud:
environment:
ADMIN_EMAIL: ${ADMIN_LOGIN}
CLOUD_DOMAIN: ${SUPLA_DOMAIN}
SUPLA_PROTOCOL: https
# Firtst User & Registration
FIRST_USER_EMAIL: ${ADMIN_LOGIN}
FIRST_USER_PASSWORD: ${ADMIN_PASSWORD}
ACCOUNTS_REGISTRATION_ENABLED: ${ACCOUNTS_REGISTRATION_ENABLED}
REQUIRE_REGULATIONS_ACCEPTANCE: ${REQUIRE_REGULATIONS_ACCEPTANCE}
REQUIRE_COOKIE_POLICY_ACCEPTANCE: ${REQUIRE_COOKIE_POLICY_ACCEPTANCE}
BRUTE_FORCE_AUTH_PREVENTION_ENABLED: ${BRUTE_FORCE_AUTH_PREVENTION_ENABLED}
# ReCaptcha
RECAPTCHA_ENABLED: ${RECAPTCHA_ENABLED}
RECAPTCHA_PRIVATE_KEY: ${RECAPTCHA_PRIVATE_KEY}
RECAPTCHA_PUBLIC_KEY: ${RECAPTCHA_PUBLIC_KEY}
# Mailer settings (SMTP)
MAILER_HOST: ${MAILER_HOST}
MAILER_PORT: ${MAILER_PORT}
MAILER_USER: ${MAILER_USER}
MAILER_PASSWORD: ${MAILER_PASSWORD}
MAILER_ENCRYPTION: ${MAILER_ENCRYPTION}
MAILER_FROM: ${MAILER_FROM}
# These options protect your application
DB_PASSWORD: ${DB_PASSWORD}
SECRET: ${SECRET}
# MQTT Broker
MQTT_BROKER_ENABLED: ${MQTT_BROKER_ENABLED}
MQTT_BROKER_HOST: ${MQTT_BROKER_HOST}
MQTT_BROKER_PORT: ${MQTT_BROKER_PORT}
MQTT_BROKER_TLS: ${MQTT_BROKER_TLS}
MQTT_BROKER_USERNAME: ${MQTT_BROKER_USERNAME}
MQTT_BROKER_PASSWORD: ${MQTT_BROKER_PASSWORD}
MQTT_BROKER_CLIENT_ID: ${MQTT_BROKER_CLIENT_ID}
container_name: ${COMPOSE_PROJECT_NAME}-cloud
image: supla/supla-cloud:${IMAGE_VERSION}
links:
- supla-db:supla-db
- supla-server:supla-server
ports:
- ${HTTPS_PORT}:443
restart: always
volumes:
- ${SUPLA_FOLDER}/ssl/cloud:/etc/apache2/ssl:z
- ${SUPLA_FOLDER}/server:/supla-server:z
- ${SUPLA_FOLDER}/cloud-local:/var/www/cloud/var/local
- ${SUPLA_FOLDER}/cloud-logs:/var/www/cloud/var/logs
supla-db:
environment:
MYSQL_DATABASE: supla
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: supla
container_name: ${COMPOSE_PROJECT_NAME}-db
image: mariadb
ports:
- ${DB_PORT}:3306
restart: always
volumes:
- ${SUPLA_FOLDER}/mysql:/var/lib/mysql:z
supla-server:
environment:
DB_PASSWORD: ${DB_PASSWORD}
CLOUD_DOMAIN: ${SUPLA_DOMAIN}
# MQTT Broker
MQTT_BROKER_ENABLED: ${MQTT_BROKER_ENABLED}
MQTT_BROKER_HOST: ${MQTT_BROKER_HOST}
MQTT_BROKER_PORT: ${MQTT_BROKER_PORT}
MQTT_BROKER_TLS: ${MQTT_BROKER_TLS}
MQTT_BROKER_USERNAME: ${MQTT_BROKER_USERNAME}
MQTT_BROKER_PASSWORD: ${MQTT_BROKER_PASSWORD}
MQTT_BROKER_CLIENT_ID: ${MQTT_BROKER_CLIENT_ID}
container_name: ${COMPOSE_PROJECT_NAME}-server
image: supla/supla-server:${IMAGE_VERSION}
links:
- supla-db:supla-db
ports:
- 2016:2016
- 2015:2015
restart: always
volumes:
- ${SUPLA_FOLDER}/ssl/server:/etc/supla-server/ssl:z
- ${SUPLA_FOLDER}/server:/var/run/supla:z
Po wklejeniu konfiguracji poniżej klikamy w Advenced mode jak na poniższym rysunku.
W trybie Advenced mode dodajemy konfigurację dla naszej SUPLI. Przy tej konfiguracji należy się na chwilę zatrzymać i poświęcić trochę czasu.
IMAGE_VERSION=latest
COMPOSE_PROJECT_NAME=supla
DB_PASSWORD=password
SECRET=secret
SUPLA_DOMAIN=supla.domena.eu.org
HTTPS_PORT=6443
DB_PORT=3307
SUPLA_FOLDER=/home/user/supla-docker
[email protected]
ADMIN_PASSWORD=password
MQTT_BROKER_ENABLED=false
MQTT_BROKER_HOST=
MQTT_BROKER_PORT=1883
MQTT_BROKER_TLS=false
MQTT_BROKER_USERNAME=
MQTT_BROKER_PASSWORD=
MQTT_BROKER_CLIENT_ID=supla
MAILER_HOST=smtp.zoho.eu
MAILER_PORT=587
MAILER_USER=
MAILER_PASSWORD=
MAILER_ENCRYPTION=tls
MAILER_FROM=
ACCOUNTS_REGISTRATION_ENABLED=false
REQUIRE_REGULATIONS_ACCEPTANCE=false
REQUIRE_COOKIE_POLICY_ACCEPTANCE=false
BRUTE_FORCE_AUTH_PREVENTION_ENABLED=true
RECAPTCHA_ENABLED=false
RECAPTCHA_PUBLIC_KEY=
RECAPTCHA_PRIVATE_KEY=
Teraz kilka najważniejszych ustawień naszego serwera supli:
IMAGE_VERSION=latest – Domyślny obraz dla komputerów z procesorem x86 lub x64 wpisujemy latest, jeżeli używamy Raspberry Pi wpisujemy „arm32v7„
COMPOSE_PROJECT_NAME=supla – Przedrostek nazwy dla naszego Stacka i naszych kontenerów Dockera.
DB_PASSWORD=password – Hasło wpisujemy własne lub dla bezpieczeństwa generujemy je wpisując komendę w konsoli cat /dev/urandom | tr -dc 'a-zA-Z0-9′ | busybox fold -w 32 | head -n 1
SECRET=secret – Secret wpisujemy własne lub dla bezpieczeństwa generujemy je wpisując komendę w konsoli cat /dev/urandom | tr -dc 'a-zA-Z0-9′ | busybox fold -w 32 | head -n 1
SUPLA_DOMAIN=supla.domena.eu.org – Dodajemy subdomenę w naszej domenie. Może być to np. subdomena o nazwie supla.
HTTPS_PORT=6443 – Port HTTPS dla naszego serwera SUPLI. Skoro będziemy używać certyfikatów CloudFlare to pominiemy użycie HTTP. Wybieramy inny port niż 433 bo na tym porcie mamy już nasz nginx-proxy manager.
DB_PORT=3307 – Warto też ustawić port dla naszej bazy danych, dzięki temu będziemy mieli dostęp przez dowolną aplikację kliencką i podejrzeć dane lub wykonać kopię bazy.
SUPLA_FOLDER=/home/user/supla-docker – Folder domowy gdzie będziemy mieli dostęp do plików z naszym serwerem oraz bazą danych.
[email protected] – Mail głównego Administratora
ADMIN_PASSWORD=password – Hasło głównego Administratora
Pozostałe zmienne są dla bardziej wymagających i zaawansowanych użytkowników. Myślę że kiedyś przyjdzie czas na opisanie jak użyć maila w własnej domenie .eu.org.przy użyciu serwisu ZOHO.
3. CloudFlare Update DNS
Najgorsze chyba za nami. Teraz należy przekierować porty na naszym routerze. Zakładam że każdy sobie poszuka jak to zrobić na swoim routerze. Przekierowujemy port TCP 433 i 80 na adres IP naszego serwera gdzie jest Portainer, SUPLA i NGINX Proxy. Najważniejsze musimy mieć stały adres IP lub zmienny ale należy go aktualizować do CloudFlare. Dodajemy w tym celu kolejny Stack, tym razem z CloudFlare DNS Updater. Podaje gotową konfigurację Stacka. Należy jedynie wpisać swoją domenę, mail i klucz API.
version: '2'
services:
cloudflare-ddns:
image: oznu/cloudflare-ddns:latest
restart: always
environment:
- API_KEY=nasz API token
- ZONE=domena.eu.org
- SUBDOMAIN=vpn
- PROXIED=false
- [email protected]
API_KEY= – klucz API skopiujemy z naszej głównej tablicy
ZONE=domena.eu.org – Wpisujemy naszą główną domenę
SUBDOMAIN=vpn – tutaj dajemy naszą subdomenę, ja do tego używam subdomeny vpn.domena.eu.org która nie jest za proxy a główna domena odwołuje się do tej subdomeny vpn i ma ustawienie Proxied
Jak widać na Rysunku 6 w CF dodajemy dwa wpisy. Jeden typu A i wpisujemy vpn i wyłączamy proxied oraz drugi typu CNAME odwołujący się do subdomeny vpn.
4. Konfiguracja NGINX PROXY MANAGER
Logujemy się do Nginx Proxy Managera wpisując IP naszego serwera z portem 81. Po zalogowaniu przechodzimy do zakładki SSL Certificates i dodajemy wcześniej wygenerowane certyfikaty w CloudFlare
Klikamy add Certyficates wybierając opcję Custom. Podajemy nazwę dla naszego certyfikatu. Ja używam takiej samej nazwy jak nasza domena. Dodajemy z dysku nasze pliki crt i key, następnie zapisujemy certyfikaty.
Domain name podajemy naszą subdomenę czyli w naszym przypadku supla.domena.eu.org. Schemat https i adres IP serwera z SUPLą i port który ustawiliśmy w Stacku SUPLi czyli 6443.
Jeszcze zostaje wybrać nasz certyfikat. Przechodzimy na zakładkę SSL i wybieramy z listy Certyfikat dla naszej domeny i klikamy Save.
Gdy już wszystko zrobiliśmy powinniśmy móc się zalogować z zewnątrz do naszego serwera SUPLi poprzez domenę supla.domena.eu.org. Pamoetaj jezeli chcesz uzywac subdomen musisz dlakazdej subdomeny dodac wpis CNAME mowiacy ze subdomena.domena.eu.org przekierowuje na domena.eu.org w trybie proxied. Inaczej nie zadziala. Wewnątrz sieci zapewne będziemy musieli używać adresu IP i portu 6443. Wszystko zależy od konfiguracji naszego routera nie wszystkie na to pozwolą aby będą wewnątrz sieci połączyć się z domeny.
Podsumowując jeżeli wszystko dobrze zrobisz będziesz posiadać własny serwer SUPLI. Jeżeli masz jakieś pytania zapraszam do komentowania.
Jeszcze raz dla przypomnienia kolejność kroków:
- Własna domena np w eu.org
- Migracja domeny do CloudFlare i generowanie Certyfikatów
- Konfiguracja CloudFlare DDNS i przekierowanie portów
- Instalacja Dockera, Portainera, Stacków: CloudFlare DNS Update, Nginx Proxy Manager, Supla-Docker
Mam router na openwrt i na nim kilka usług, np. dynamiczny dns, przekierowania portów na Raspberry Pi 3B+ (Supla cloud i Supla scripts) itd.
Kiedyś Suple instalowałem wg tego tutorial https://forum.supla.org/viewtopic.php?t=4081 wszystko działało. Z upływem czasu chciałem postawić Suple od nowa na nowym aktualnym software lecz pojawiły się problemy z wygenerowaniem certyfikatów ssl na nowszych software dla Raspberry.
Problem z ssl przewija się na forum np. tu https://forum.supla.org/viewtopic.php?p=121825#p121825
Czy mógłbyś udzielić informacji w temacie instalacji / konfiguracji lecz z pominięciem zagadnień domena na nic.eu.org oraz SSL na CloudFlare. Interesuje mnie głównie NGINX PROXY MANAGER i jego konfiguracja, żeby wystawił i aktualizował certyfikaty ssl. Wiem że jest taka możliwość.
Przeczytaj dokładnie artykuł 😉 opisałem jak użyć nginx-proxy-mamagera i jak tam załadować SSLe i skonfigurowany subdomeny
Poproszę również nieśmiało o to samo co pytał @Krisu.
Wprawdzie Ty opisujesz użycie nginx-proxy-mamager ale dla certyfikatów SSL wcześniej wygenerowanych na CloudFlare i domeny na nic.eu.org. Ale nie o to chodzi ;-). Chciałbym pominąć CloudFlare i domene na nic.eu.org, użyć swoich posiadanych DDNS (Dynamic Domain Name System), np. moja.nazwa.noip.pl i certyfikaty SSL dla moja.nazwa.noip.pl wygenerować bezpośrednio w nginx-proxy-mamager.
Spokojnie poczekam. Byłby wtedy świetny kompletny tutorial.
Dodam że w/w wymaga też pominięcia? bądź zmiany czynności do wykonania w Twoim punkcie 3. CloudFlare Update DNS. Tak myślę, że nie mając stałego IP, korzystam z DDNS moja.nazwa.noip.pl to punktu 3 nie można pominąć. Tylko ten Stack odpowiednio zmodyfikować.
Ja też nie mam stałego IP ale on się aktualizuje do CloudFlare za pomocą DDNS Cloudflare Updater. Możesz w Nginx-Proxy-Manager wybrać opcję autogenerowania certyfikatów podając maila chyba tylko. Przeklikaj się w okienku custom certyficates i odszukaj opcję Letsencrypt i przetestuj.
Ok z certyfikatem SSL w Nginx-Proxy-Manager sobie poradzę. Jednak dalej nie wiem co z mam zrobić w odniesieniu do Twojego punktu 3. CloudFlare Update DNS. Nie mam domeny, mam tylko DDNS założony na http://www.changeip.com
przykładowo mam mojanazwa.otzo.com
To jak ten ostatni Stack powinien wyglądać w moim przypadku. I czy w ogóle jest konieczny?.
Skoro świt pomyślałem że ja raczej nie potrzebuję tworzyć tego ostatniego Stack związanego z Twoim opisem punkt 3. CloudFlare Update DNS. Zgadzasz się?.
Ponieważ u mnie mój ddns (mojanazwa.otzo.com) aktualizuję z poziomu routera z openwrt, a dokładnie za pomocą ddns-scripts. Wszystko mi działa i mam dostęp z zewnątrz do swoich urządzeń (router, raspberry pi itp.) po mojanazwa.otzo.com
A Ty używasz w tym celu właśnie DDNS Cloudflare Updater.
Ten stack z CloudFlare DDNS jest tylko po to aby twój publiczny adres IP był automatycznie uzupełniany w DNSie na CloudFlare. To działa tak samo jak Twój DDNS na OpenWRT. Nie potrzebujesz tego robić.
Zrobione :). Super tutorial, dziękuję.
Powiedz jeszcze jak aktualizować supla cloud. Rozumiem że tradycyjna metoda aktualizacji nie ma zastosowania.
Pozostaje czekać na tutorial suplascripts.
Pozdrawiam
Jeżeli jesteś w Portainerze i widzisz czerwoną ikonkę przy jakimś kontenerze z SUPLI to klikasz w niego i wybierasz opcję RECREATE i zaznaczasz pull new image. Lub można wejść w STACK i stop stack i start stack i też wybierać pull new image.
cloudflare.com nie jest darmowy…
Na takie proste potrzeby jak opisałem w artykule jest darmowy. Owszem istnieją lepsze, płatne plany. Takie rzeczy jak trzymanie domen, konfiguracja DNS i podstawowa ochrona jest darmowa 😉
Do podstawowych zadań jest darmowy 😉
Proszę dodaj opis instalacji i uruchomienia suplascripts.
Wezmę pod uwagę i jak się uda to na dniach dodam artykuł. Polecam zapisać się do newslettera 😉
Usiłuję postawić Suplę na raspberry 3b+ ustawiam arm zgodnie wytycznymi oraz pozostałe parametry po kolei ale po kliknięciu deploy the stag otrzymuję następujący błąd dla Supli:
Deployment error
failed to deploy a stack: supla-db Pulling no matching manifest for linux/arm/v7 in the manifest list entries
Co mogę robić nie tak?
Powinieneś ustawić:
IMAGE_VERSION=latest – Domyślny obraz dla komputerów z procesorem x86 lub x64 wpisujemy latest, jeżeli używamy Raspberry Pi wpisujemy “arm32v7“
Tylko nie mam pewności czy RPI3 zadziała. Spróbuj „arm32v6”
Niestety nie działa spróbuje inną Twoją metodą.
pozdrawiam
Wersja 23.11 jest dostępna już w docker? Robiłem pull pobrało mi jakieś nowe pliki, ale pozostała 23.05.01.
A takie informacje musisz śledzić na githubie oraz forum supli 😉
Dzięki za tutorial! Mam problem z „502 Bad Gateway”
Serwer stawiałem na aarch64, wszystko w Portainerze odpala się na zielono, wygenerowałem cert ssl dla mojej domeny z noip – i nie wiem co dalej 🙁 Możesz pomóc?
Musisz te certyfikaty wgrać do odpowiednich folderów