Production TKControl

Установка будет проводиться на 2-х хостах на дистрибутиве Debian 10.

Salt-Master Server

Следующая инструкция выполняется на первом хосте. Инструкция включает в себя установку и настройку salt-master, salt-api и vncrepeater.

Установка

  1. Перед началом установки обновите список пакетов и установите необходимые библиотеки:

    sudo apt update -y
    sudo apt install -y git make gcc python3-pip python-dev
    

SaltStack

  1. Установите Salt Master и Salt Api:

    sudo apt install -y salt-master salt-api
    

TKControl

  1. Установите tkcontrol-configure модуль:

    sudo pip3 install --prefix /usr/local \
        --index-url http://pypi.accentos.ru/ \
        --trusted-host pypi.accentos.ru \
        tkcontrol-configure
    

VNC Repeater

  1. Склонируйте репозиторий uvncrepeater-ac:

    git clone https://github.com/tenchman/uvncrepeater-ac
    
  2. Запустите сборку приложения:

    sudo make -C uvncrepeater-ac install
    
  3. Добавьте пользователя для uvncrepeater:

    sudo useradd -s /sbin/nologin uvncrep
    

Настройка

  1. Запустите конфигурирование для salt-master и vnc-repeater:

    sudo tkcontrol-configure vnc-repeater --with-systemd && \
    sudo tkcontrol-configure salt-master --with-patch
    
  2. Если необходимо подключение к VNC по паролю, замените файл /srv/salt/states/connect-vnc.sls:

    sudo cp /srv/salt/states/connect-vnc.sls /srv/salt/states/connect-vnc-notify.sls
    sudo cp /srv/salt/states/connect-vnc-pass.sls /srv/salt/states/connect-vnc.sls
    
  3. Сгенерируйте пароль для salt пользователя:

    openssl rand -base64 16
    
  4. Полученный пароль вставьте в поле «sharedsecret» в /etc/salt/master.d/api.conf, где generated_password - пароль, сгенерированный прошлой командой:

    sudo sed 's|saltpass|generated_password|' -i /etc/salt/master.d/api.conf
    
  5. Откройте доступ к salt-api для других сетей:

    sudo sed 's|"host": "127.0.0.1"|"host": "0.0.0.0"|' -i /etc/salt/master.d/api.conf
    
  6. Включите SSL:

    sudo sed 's|"disable_ssl": True|"disable_ssl": False|' -i /etc/salt/master.d/api.conf
    
  7. Добавьте сертификат salt-api. Если его нет, сгенерируйте самоподписанный сертификат:

    # Создайте директорию для сертификатов
    sudo mkdir /etc/salt/ssl
    
    # Сгенерируйте сертификат, при генерации укажите "Common Name" saltstack
    sudo openssl req -x509 -nodes -newkey rsa:2048 -days 365 -keyout /etc/salt/ssl/salt-api.key -out /etc/salt/ssl/salt-api.crt
    
    # Измените владельца сертификата и приватного ключа
    sudo chown salt:salt /etc/salt/ssl/salt-api.key /etc/salt/ssl/salt-api.crt
    
  8. Добавьте расположение сертификатов в /etc/salt/master.d/api.conf:

    "rest_cherrypy": {
        ...
        "ssl_crt": "/etc/salt/ssl/salt-api.crt",
        "ssl_key": "/etc/salt/ssl/salt-api.key",
        ...
    }
    

Запуск

  1. Перезапустите службы salt-master и salt-api:

    sudo systemctl restart salt-master
    sudo systemctl restart salt-api
    
  2. Запустите vnc-repeater:

    sudo systemctl enable tkcontrol-vnc-repeater
    sudo systemctl start tkcontrol-vnc-repeater
    

TKControl Server

Следующая инструкция выполняется на втором хосте. Инструкция включает в себя установку и настройку mongodb, rabbitmq, websockify, nginx, tkcontrol-auth, tkcontrol-backend, tkcontrol-services, tkcontrol-dbadapter.

Установка

  1. Перед началом установки обновите список пакетов и установите необходимые библиотеки:

    sudo apt update -y
    sudo apt install -y git gnupg2 make gcc python3-pip libsasl2-dev python-dev libldap2-dev libssl-dev
    

Mongo DB

  1. Импортируйте публичный gpg ключ mongodb:

    wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
    
  2. Добавьте mongodb в список репозиториев:

    echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
    
  3. Обновите список пакетов и установите mongodb:

    sudo apt update -y
    sudo apt install -y mongodb-org
    
  4. Добавьте mongodb в автозапуск и включите службу:

    sudo systemctl enable mongod
    sudo systemctl start mongod
    

Rabbit MQ

  1. Установите Rabbit MQ Server:

    sudo apt install -y rabbitmq-server
    
  2. Добавьте rabbitmq в автозапуск и включите службу:

    sudo systemctl enable rabbitmq-server
    sudo systemctl start rabbitmq-server
    

Websockify

  1. Установите websockify:

    sudo apt install -y websockify
    

Nginx JWT Module

Установка из исходных файлов
  1. Установите версии модулей в переменные окружения:

    export NGINX_VERSION=1.14.2 && \
    export JANSSON_VERSION=2.10 && \
    export LIBJWT_VERSION=1.9.0
    
  2. Установите необходимые библиотеки для сборки исходных файлов:

    sudo apt install -y build-essential
    sudo apt install -y wget unzip git cmake check autoconf libtool openssl libssl-dev libpcre3 libpcre3-dev zlib1g zlib1g-dev libxml2 libxml2-dev libxslt-dev libgd-dev google-perftools libgoogle-perftools-dev libperl-dev
    
  3. Установите nginx:

    sudo apt install -y nginx=$NGINX_VERSION-2+deb10u4
    
  4. Остановите и отключите nginx:

    sudo systemctl stop nginx
    sudo systemctl disable nginx
    
  5. Установите библиоткеу для работы с JSON:

    wget https://github.com/akheron/jansson/archive/v$JANSSON_VERSION.zip && \
    unzip v$JANSSON_VERSION.zip && \
    rm v$JANSSON_VERSION.zip && \
    cd jansson-$JANSSON_VERSION && \
    cmake . -DJANSSON_BUILD_SHARED_LIBS=1 -DJANSSON_BUILD_DOCS=OFF && \
    make && \
    make check && \
    sudo make install && \
    cd ..
    
  6. Установите библиотеку для работы с JWT токенами:

    wget https://github.com/benmcollins/libjwt/archive/v$LIBJWT_VERSION.zip && \
    unzip v$LIBJWT_VERSION.zip && \
    rm v$LIBJWT_VERSION.zip && \
    cd libjwt-$LIBJWT_VERSION && \
    autoreconf -i && \
    ./configure && \
    make all && \
    sudo make install && \
    cd ..
    
  7. Загрузите nginx модуль для работы с JWT токенами:

    git clone https://github.com/TeslaGov/ngx-http-auth-jwt-module
    
  8. Соберите nginx с необходимыми модулями:

    wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz && \
    tar -xzf nginx-$NGINX_VERSION.tar.gz && \
    rm nginx-$NGINX_VERSION.tar.gz && \
    cd nginx-$NGINX_VERSION
    
    # Конфигурируем nginx модули
    ./configure --add-dynamic-module=../ngx-http-auth-jwt-module \
                --prefix=/usr/share/nginx \
                --sbin-path=/usr/sbin/nginx \
                --modules-path=/usr/lib/nginx/modules \
                --conf-path=/etc/nginx/nginx.conf \
                --error-log-path=/var/log/nginx/error.log \
                --http-log-path=/var/log/nginx/access.log \
                --pid-path=/run/nginx.pid \
                --lock-path=/var/lock/nginx.lock \
                --user=www-data \
                --group=www-data \
                --build=Ubuntu \
                --http-client-body-temp-path=/var/lib/nginx/body \
                --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
                --http-proxy-temp-path=/var/lib/nginx/proxy \
                --http-scgi-temp-path=/var/lib/nginx/scgi \
                --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
                --with-pcre \
                --with-pcre-jit \
                --with-compat \
                --with-file-aio \
                --with-threads \
                --with-http_addition_module \
                --with-http_auth_request_module \
                --with-http_dav_module \
                --with-http_flv_module \
                --with-http_gunzip_module \
                --with-http_gzip_static_module \
                --with-http_image_filter_module=dynamic \
                --with-http_mp4_module \
                --with-http_random_index_module \
                --with-http_realip_module \
                --with-http_slice_module \
                --with-http_ssl_module \
                --with-http_sub_module \
                --with-http_stub_status_module \
                --with-http_xslt_module=dynamic \
                --with-http_v2_module \
                --with-http_secure_link_module \
                --with-mail=dynamic \
                --with-mail_ssl_module \
                --with-stream=dynamic \
                --with-stream_realip_module \
                --with-stream_ssl_module \
                --with-stream_ssl_preread_module \
                --with-debug \
                --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-mcUg8N/nginx-$NGINX_VERSION=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2'\
                --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC'
    
    # Билдим nginx
    make && \
    sudo make install && \
    cd ..
    
    # Выполняем unlink конфигурации старых модулей
    sudo unlink /etc/nginx/modules-enabled/50-mod-http-auth-pam.conf && \
    sudo unlink /etc/nginx/modules-enabled/50-mod-http-dav-ext.conf && \
    sudo unlink /etc/nginx/modules-enabled/50-mod-http-echo.conf && \
    sudo unlink /etc/nginx/modules-enabled/50-mod-http-geoip.conf && \
    sudo unlink /etc/nginx/modules-enabled/50-mod-http-subs-filter.conf && \
    sudo unlink /etc/nginx/modules-enabled/50-mod-http-upstream-fair.conf
    
    # Добавляем конфигурацию для jwt модуля
    echo "load_module modules/ngx_http_auth_jwt_module.so;" | sudo tee /etc/nginx/modules-enabled/http-auth-jwt.conf
    
  9. Обновите динамические библиотеки:

    sudo /sbin/ldconfig
    

TKControl

  1. Установите пакеты TKControl:

    sudo pip3 install --prefix /usr/local \
        --index-url http://pypi-dev.tnxos.loc/ \
        --trusted-host pypi-dev.tnxos.loc \
        tkcontrol-auth \
        tkcontrol-backend \
        tkcontrol-dbadapter \
        tkcontrol-modules \
        tkcontrol-configure \
        tkcontrol-services
    
  2. Добавьте ссылку на gunicorn:

    sudo ln -s /usr/local/bin/gunicorn /usr/bin/gunicorn
    

Настройка

  1. Добавьте hostnames в /etc/hosts:

    127.0.0.1 localhost db dbadapter backend auth mq novnc-proxy
    address_of_saltmaster saltstack vnc-repeater
    
  2. Запустите команды для конфигурации сервисов:

    sudo tkcontrol-auth configure --with-systemd && \
    sudo tkcontrol-backend configure --with-systemd && \
    sudo tkcontrol-dbadapter configure --with-systemd && \
    sudo tkcontrol-services configure --with-systemd && \
    sudo tkcontrol-configure websockify --with-systemd && \
    sudo tkcontrol-configure proxy
    
  3. Настройте конфигурацию tkcontrol-services /etc/tkcontrol/tkcontrol-services/config.py:

    # Измените протокол http на https
    sudo sed "s|'http://' + SALT_API_ADDRESS|'https://' + SALT_API_ADDRESS|" -i /etc/tkcontrol/tkcontrol-services/config.py
    
    # Установите пароль для salt пользователя, где generated_password - пароль, сгенерированный для salt-api
    sudo sed "s|saltpass|generated_password|" -i /etc/tkcontrol/tkcontrol-services/config.py
    
    # Скопируйте сертификат salt-api
    sudo scp user@saltstack:/etc/salt/ssl/salt-api.crt /etc/tkcontrol/tkcontrol-services/ca.pem
    
  4. Добавьте сертификат для nginx. Если его нет, то сгенерируйте самоподписанный сертификат:

    # Сгенерируйте сертификат, если его нет
    sudo openssl req -x509 -nodes -newkey rsa:2048 -days 365 -keyout /etc/ssl/tkcontrol.key -out /etc/ssl/tkcontrol.crt
    
  5. Добавьте сертификат для nginx и измените прослушиваемый порт sudo vim /etc/nginx/sites-available/tkcontrol.conf:

    # Закомментируйте следующие строчки в первом блоке server
    #server_name 0.0.0.0;
    #listen 80 default_server;
    #listen [::]:80 default_server;
    
    # Добавьте прослушивание 443 порта и расположение сертификата
    listen 443 ssl;
    ssl_certificate /etc/ssl/tkcontrol.crt;
    ssl_certificate_key /etc/ssl/tkcontrol.key;
    

Запуск

  1. Запустите novnc-proxy:

    sudo systemctl enable tkcontrol-websockify
    sudo systemctl start tkcontrol-websockify
    
  2. Запустите tkcontrol-auth:

    sudo systemctl enable tkcontrol-auth
    sudo systemctl start tkcontrol-auth
    
  3. Запустите tkcontrol-dbadapter:

    sudo systemctl enable tkcontrol-dbadapter
    sudo systemctl start tkcontrol-dbadapter
    
  4. Запустите tkcontrol-backend:

    sudo systemctl enable tkcontrol-backend
    sudo systemctl start tkcontrol-backend
    
  5. Запустите tkcontrol-services:

    sudo systemctl enable tkcontrol-services
    sudo systemctl start tkcontrol-services
    
  6. Запустите nginx-proxy:

    sudo systemctl enable nginx
    sudo systemctl start nginx