BoxExchanger
  • Вернутся на сайт
  • Начало работы
    • Настройка безопасности
      • Создание админа
      • Настройка прав администратора (роли)
      • Установка двухфакторной аутентификация
      • Ограничения доступа админ панели по IP
        • Установка ограничения на CloudFlare
        • Установка ограничений в админ панели
      • Установка ограничение по header host
    • Настройка дизайна
    • Технические работы
    • Уведомление на сайте
      • Создание
      • Редактирование
    • Избраные курсы
      • Создание
      • Редактирование
    • Подключение онлайн чата
      • Подключение чата LiveChat
      • Подключение чата JivoSite
      • Подключение чата HelpCrunch
    • Добавление контактов
    • Настройка почты
      • Отправка копии отправленных писем
      • Подключение GMail почты
      • Подключение Zoho почты
      • Подключение dynadot почты
    • Вопросы и ответы
      • Создать
    • Настройка AntiBot системы
      • Установка reCAPTCHA
    • Правила
      • Создание
      • AML/KYC Политика
    • Партнеры
      • Создание партнера
      • Редактирование
    • Новости
      • Создание
    • Отзывы
      • Создать
      • Список отзывов
    • Статичные страницы
      • Создание
    • Настройки авторизации пользователя
    • Настройка идентификаторов
    • Настройка истории действий
  • Обмен
    • Валюты
      • Список валют
      • Логотип валюты
      • Название валюты
      • Тип валюты
      • Точность суммы
      • XML валюты
      • Курс к USD
      • Резервы
      • Настройка поля валюты
      • Прием платежей
      • Настройка выплаты
      • AML проверка
      • Верификация
    • Сортировка направлений
    • Направление
      • Приоритетные модули
      • Плавающий курс
      • Страховка курса
      • SEO-friendly URL (ЧПУ)
      • Документы
      • Дополнительные услуги
    • Настройка группы направлений
    • Мерчант и АПИ
      • 001k bot
        • Мерчант 001k bot
        • Выплаты 001k bot
      • Биржа whitebit
        • Взаимодействие модулей
        • Мерчант whitebit
        • Выплаты whitebit
      • BetPay
        • Мерчант BetPay
        • Выплаты BetPay.money
      • Heleket
        • Мерчант Heleket
        • Выплаты Heleket
      • Paylink.finance
        • Мерчант Paylink.finance
        • Выплаты Paylink.finance
      • VelPay
        • Выплаты VelPay
      • Мерчант BSC BEP20
      • Мерчант Billline
      • Мерчант Bitconce
      • Мерчант By password
      • Мерчант Dynamic requisites
      • Мерчант EVM Token
      • Мерчант ETH ERC20
      • Мерчант TRON TRC20
      • Мерчант Monerod
      • Мерчант Payeer
      • Мерчант Perfect Money
      • Мерчант WestWallet.io
      • Настройка Inqud
      • Выплаты Agents Telegram
      • Выплаты Auto Success
      • Выплаты Binance
      • Выплаты Kuna.io
      • Выплаты PSPline
      • Выплаты WestWallet.io
    • Парсер курсов
      • BestChange v2
      • BetPay.Money
      • CurrencyLayer
      • Heleket
      • Kurs.Expert
      • PancakeSwap
      • Paylink.finance
      • VelPay
      • whitebit v2
      • XML file
    • Верификации
    • Расчет суммы обмена
  • Заявки
    • Список обменов
    • Заявки
      • Статусы заявки
    • Автоматическое добавление резерва
  • Партнерская программа
    • Партнерские направления
    • Партнёрские обмены
    • Реферальные настройки
  • AML плагины
    • CUBE3
    • CrystalBlockchain
    • AMLBot.com
    • GetBlock.net
  • Дополнительные системы
    • Внутренний кошелек
    • Расписания
    • Approve underpaid orders
    • Heleket модули
      • Heleket auto update fee
      • Heleket control available
      • Heleket auto min amount for TO currency
    • Install plugin
    • KYC модули
      • KYC Модуль Kycaid
      • KYC Модуль AMLBot
      • KYC Модуль SumSub
    • Whitebit модули
      • WhiteBit Exchanger auto update fee
      • WhiteBIT control available
      • WhiteBIT auto min amount for TO currency
    • BestChange ScamAPI
  • Системы авторизации
    • Авторизация Apple
    • Авторизация Google
  • Для разработчиков
    • Установка проекта
      • Сервер для обменника
        • Vultr
        • DigitalOcean
          • Удаление VDS на DigitalOcean
        • Hetzner Cloud
          • Изменения размера VDS на Hetzner
          • Удаление VDS на Hetzner
      • Настройки CloudFlare
      • Установка Nginx
      • Установка ПО
        • Установка NodeJs
        • Установка MongoDB
        • Установка exchanger-api
        • Установка exchanger-web
        • Настройка сборки на CloudFlare Workers
    • Настройка Telegram Bot
    • Доступ к исходному коду
    • Миграция Git BoxExchanger
    • Разработка client-web
      • Локальный запуск
      • Применения изменений
    • Шаблоны писем
      • Локализация шаблонов
    • Загрузка статического файла
    • Структура проекта
    • Настройки API документации
    • Установка Node
      • Bitcoin Node
      • Monero Node
      • Ethereum Node
      • Tron Node
    • Разработка модулей
      • Мерчант системы
      • Модуль выплат
      • Парсер курсов
    • Отправка логов разработчикам
    • Процессинг платежей API
    • Настройка VPN (openvpn)
    • Установка SOCKS5-прокси
    • Настройка бекап на B2
    • Настройка Firewall
      • Настройка доступа порта 22 (ssh)
      • Настройка доступа портов 80,443 (http/s)
      • IP в белый список CloudFlare
    • Webhook уведомления URL
      • Новый обмен
      • Новая верификация (ручная)
      • Обновление статуса заявки
      • Регистрация пользователя
  • Журнал изменений
Powered by GitBook
On this page

Was this helpful?

  1. Для разработчиков
  2. Установка проекта
  3. Установка ПО

Установка exchanger-web

Prepare dependencies

apt install -y nano sudo curl wget
apt update
apt upgrade -y

1. Install Docker and Docker Compose

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

2. Create runner user and add it to sudoers

sudo adduser --disabled-password --gecos "" runner
sudo usermod -aG sudo runner

3. Create docker group and add user to it

sudo usermod -aG docker runner

4. Switch to a 'runner' user

sudo su runner
newgrp docker

5. Create docker network

docker network create --subnet 10.1.0.0/24 exchanger-net

6. Docker login

  • Create a Personal Access Token in GitLab

  • Make sure to tick the read_registry permission scope

  • Login to docker read_registry

    docker login rg.boxexchanger.net
    
    # Username: your_gitlab_username
    # Password: your_gitlab_pat

7. Create required folders

mkdir -p /home/runner/web_server
mkdir -p /home/runner/web_server/config
mkdir -p /home/runner/web_server/public
mkdir -p /home/runner/web_server/nginx
cd /home/runner/web_server

8. Place basic nginx config server_names_hash_bucket_size.conf

nano /home/runner/web_server/nginx/server_names_hash_bucket_size.conf

with content:

server_names_hash_bucket_size 64;

9. Place basic nginx config nginx_default.conf

nano /home/runner/web_server/nginx/nginx_default.conf 

with content:

server {
    listen 80 default_server;
    server_name _;
    return 500;
}

10. Place Nginx nginx_admin.conf config

If you are using separate server for web and api change proxy_pass http://nginx-api:3000/service/ to http://ip.your.api.serveri:3000/service/ and expose port 3000 from your api server

nano /home/runner/web_server/nginx/nginx_admin.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    ""      close;
}

server {
    listen 80;
    server_name admin.domain.name;

    location / {
        proxy_pass http://exchanger-admin-web:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    
    location /service/ {
        proxy_pass http://nginx-api:3000/service/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    location /ws/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://nginx-api:3000/ws/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_redirect    off;
    }
    
    access_log off;
    error_log  /var/log/nginx-admin-error.log error;
    sendfile off;
    client_max_body_size 100m;
}

11. Place Nginx nginx_web.conf config

nano /home/runner/web_server/nginx/nginx_web.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    ""      close;
}
server {
    listen 80;
    server_name domain.name;
    return 301 https://www.domain.name$request_uri;
}

server {
    listen 80;
    server_name www.domain.name;
    location / {
        proxy_pass http://exchanger-client-web:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    location /service/ {
        proxy_pass http://nginx-api:3000/service/;
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    location /ref/ {
        proxy_pass http://nginx-api:3000/service/ref/;
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    location /ws/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://nginx-api:3000/ws/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_redirect    off;
    }
        
    access_log off;
    error_log  /var/log/nginx-error.log error;
    sendfile off;
    client_max_body_size 100m;
}

12. Create config file (.env)

nano /home/runner/web_server/.env
VCS_NAMESPACE=bx4/project-name

If you would like to setup your branch please add variable to your .env file

CLIENT_BRANCH for client-web and

ADMIN_BRANCH for admin-web

12. Create your docker-compose.yml

nano /home/runner/web_server/docker-compose.yml
version: '3'
services:
  nginx-web:
    image: nginxinc/nginx-unprivileged:1.27-alpine
    read_only: true
    container_name: nginx-web
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.250
    volumes:
      - ./nginx/:/etc/nginx/conf.d:ro
      - type: tmpfs
        target: /docker-entrypoint.d/
        tmpfs:
          size: "100000"
      - type: tmpfs
        target: /tmp/
        tmpfs:
          size: "10000000"
  exchanger-admin-web:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-admin-web:${ADMIN_BRANCH:-master}
    container_name: exchanger-admin-web
    restart: unless-stopped
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.5
  exchanger-client-web:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-client-web:${CLIENT_BRANCH:-box}
    container_name: exchanger-client-web
    restart: unless-stopped
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.4
networks:
    exchanger-net:
        external: true

13. Start WEB server

docker compose up -d

Server Side Render:

  • Attention! This mod is not recommended for use; it creates a load on the server to build the project for each client, which greatly increases the delay in loading the site

1. Подготовка окружения

После установки сервера к нему необходимо подключиться по SSH и настроить окружение

Установить пакеты сервера (nano git curl)

apt update
apt upgrade -y
apt-get install -y curl git nano wget sudo

Установить Nginx:

apt-get install -y nginx

Установить NodeJS:

2. Скачать ПО на сервер

Создаем SSH-ключ

Учебник по Linux

ssh-keygen -t rsa -b 4096

> Enter x3

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

Получить свой ключ:

cat ~/.ssh/id_rsa.pub

Клонируем репозитории

cd /var/www/
git clone git@ssh.boxexchanger.net:bx4/NAME_SPACE/exchanger-client-web.git
git clone git@ssh.boxexchanger.net:bx4/NAME_SPACE/exchanger-admin-web.git

3. Сборка админ панели

cd /var/www/exchanger-admin-web/
npm i
npm run configure

Сконфигурируйте конфигурацию:

nano .env
ADMIN_BASE_URL="https://admin.domain.name"
EXCHANGE_URL="https://www.domain.name"
PROXY_REST_API="http://localhost:3010/"

Сборка проекта:

npm run generate

4. Сборка веб-панели

cd /var/www/exchanger-client-web/
npm i
npm run configure

Сконфигурируйте конфигурацию: (при возникновении затруднений обратитесь в техподдержку support@boxexchanger.net)

nano config/app.json

Сборка проекта:

npm run generate

5. Применяем Nginx конфигурацию

Вам необходимо заменить

  • домен domain.com

  • админ домен: admin.domain.com

nano /etc/nginx/sites-enabled/domain.com.conf
/etc/nginx/sites-enabled/domain.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    ""      close;
}
server {
    listen 80;
    server_name domain.com;    return 301 https://www.domain.com$request_uri;
}
server {
    listen 80;
    server_name www.domain.com;
    root "/var/www/exchanger-client-web";
    gzip on;
    gzip_comp_level 9;
    gzip_disable "msie6";
    gzip_types application/javascript text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    index index.html;
    charset utf-8;

    add_header "X-Frame-Options" "SAMEORIGIN";
    add_header "X-XSS-Protection" "1; mode=block";
    add_header "X-Content-Type-Options" "nosniff";

    location / {
        root /var/www/exchanger-client-web/dist/client;
        rewrite ^([^.]*[^/])$ $1/ permanent;
        try_files $uri $uri/ /200.html;
        # expires 7d;
    }
    access_log off;
    error_log  /var/www/exchanger-client-web/nginx-error.log error;
    sendfile off;
    client_max_body_size 100m;


    location /service/ {
        proxy_pass http://127.0.0.1:3010/;
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    location /ref/ {
        proxy_pass http://nginx-api:3010/ref/;
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }

    location /service/fs {
        alias /var/www/exchanger-api/public;
    }

    location /tg/ {
        proxy_pass http://127.0.0.1:3003/;
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }
    #location /service/fs {
    #    alias /var/www/exchanger-api/public;
    #}
    location /ws/ {
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://127.0.0.1:3011/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_redirect    off;
    }
}


server {
    listen 80;
    server_name admin.domain.com;
    root "/var/www/exchanger-admin-web";
    gzip on;
    gzip_comp_level 9;
    gzip_disable "msie6";
    gzip_types application/javascript text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    index index.html index.htm index.php;
    charset utf-8;

    add_header "X-Frame-Options" "DENY";
    add_header "X-XSS-Protection" "1; mode=block";
    add_header "X-Content-Type-Options" "nosniff";

    location / {
        root /var/www/exchanger-admin-web/dist/admin;
        try_files $uri $uri/ /index.html;
    }

    access_log off;
    error_log  /var/www/exchanger-admin-web/nginx-error.log error;
    sendfile off;
    client_max_body_size 100m;

    location /service/ {
        proxy_pass http://127.0.0.1:3010/;
        proxy_http_version 1.1;
        add_header CF-IPCountry $http_cf_ipcountry always;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_redirect off;
    }

    location /service/fs {
        alias /var/www/exchanger-api/public;
    }
}

Тестируем nginx конфигурацию:

nginx -t 

Применяем изменения:

service nginx restart

Last updated 1 month ago

Was this helpful?

Create a reminder to update the PAT after expiration date, as once it expires you lose access for updates.

All web configuration and request for build project you find in your personal account on our website

To enable SSR mode add variable SSR = 1 in your account then run pipeline for build project and fetch build on your server.

Документация с github.com

Скопируйте результат и установите данный ключ в своей учётной записи

IP адрес API сервера при аренде он доступен в пользователя если у вас API находится на вашем сервере оставьте его 127.0.0.1

https://git.boxexchanger.net/-/profile/personal_access_tokens
https://licence.boxexchanger.net/licenses/
https://licence.boxexchanger.net/licenses/
Установка NodeJs
Создание нового ключа SSH
git.boxexchanger.net
Доступ к исходному коду
личном кабинете