SUPLA-DOCKER z użyciem Docker-Compose + CloudFlare + Proxy

2022-12-27 20 Przez klimas

Dzisiaj 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.

Rysunek 1- Dodajemy Origin 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.

Rysunek 2 – Generator Certyfikatów

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.

Rysunek 3 – Zapis wygenerowanych plików crt i key

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.

Rysunek 4 – Dodawanie Stacka

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.

Rysunek 5 – Tryb Advenced mode

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

Rysunek 6 – Konfiguracja domeny i subdomeny

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

Rysunek 7 – SSL Certificates

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.

Rysunek 8 – Add Custom Certyficates
Rysunek 9 – Dodajemy Proxy Hosts

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.

Rysunek 10 – Add Proxy Host

Jeszcze zostaje wybrać nasz certyfikat. Przechodzimy na zakładkę SSL i wybieramy z listy Certyfikat dla naszej domeny i klikamy Save.

Rysunek 11 – SSL Certyficate

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.

Rysunek 12 – Okno logowania SUPLI

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