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-api

Установка Rest-API на собственные сервера доступна только при покупке полной лицензии ПО BoxExchanger

Prepare dependencies

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

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
docker network create --subnet 10.255.255.0/24 control-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/api_server
mkdir -p /home/runner/api_server/config
mkdir -p /home/runner/api_server/public
mkdir -p /home/runner/api_server/pluginsExternal
cd /home/runner/api_server

8. Create your configurations (.env)

nano /home/runner/api_server/.env

Below example configuration .env Insert your variables PROJECT_NAME, API_URL and VCS_NAMESPACE

PROJECT_NAME=""
API_URL="https:///service/"
REDIS_URI="redis://exchanger-api-redis:6379/0"
UPLOADER_URL="http://exchanger-uploader-service:3013/"
VCS_NAMESPACE=""

8.1 Create your docs configuration (.env.docs.config.js)

nano /home/runner/api_server/.env.docs.config.js
const e = {
    PROJECT_NAME:"",
    BASE_URL:"https://",
    API_PATH:"/service/api/v1",
    API_URL:"https:///service/api/v1/",
};
export {e as config};

8.2 Create your lifecycle manager secret (.env.lm)

For security reason generate new strong secret DOCKER_LIFECYCLE_MANAGER_KEY for generate use openssl rand -hex 32

nano /home/runner/api_server/.env.lm
DOCKER_LIFECYCLE_MANAGER_URL=http://exchanger-lifecycle-manager:8000/
DOCKER_LIFECYCLE_MANAGER_KEY=932a4dd476573c9b7d39d932d1b2bc04f01b0b028d7e2475567eb849ea3002db

9. Create nginx configuration for api

Create /home/runner/api_server/nginx_api.conf file with following contents

nano /home/runner/api_server/nginx_api.conf
map $http_upgrade $connection_upgrade {
    default upgrade;
    ""      close;
}

log_format cf_custom '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for" '
                     '"$http_cf_ray" "$http_cf_connecting_ip"';
server {
    listen 3000;
    server_tokens off;
    server_name default;

    location /service/ {
        proxy_pass http://exchanger-api-http:3010/;
        proxy_http_version 1.1;
        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_redirect off;
    }
    location /service/api-docs/ {
        add_header Cache-Control "public, max-age=900";
        proxy_pass http://exchanger-docs:8080/;
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
    location /service/fs {
        add_header Cache-Control "public, max-age=900";
        alias /public;
    }
    location /ws/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://exchanger-api-websocket: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;
    }

    access_log /dev/stdout cf_custom;
    error_log /dev/stderr error;
    sendfile off;
    client_max_body_size 100m;
}

10. Create your docker-compose.yml

nano /home/runner/api_server/docker-compose.yml
x-logging:
  &default-logging
  driver: "json-file"
  options:
    max-file: "1"
    max-size: "500m"

services:

  exchanger-api-http:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-http
    entrypoint: bash ./entry.sh API
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-uploader-service
      - exchanger-api-mongodb
      - redis
    env_file:
      - .env.mongo.user
      - .env.lm
      - .env
    volumes:
      - ./config:/app/config
      - ./public:/app/public
      - ./pluginsExternal:/app/pluginsExternal
      - type: tmpfs
        target: /home/node/.pm2/
        tmpfs:
          size: "10000000"
          mode: 0777
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.101
      control-net:
        ipv4_address: 10.255.255.25
  exchanger-lifecycle-manager:
    image: rg.boxexchanger.net/boxexchanger-utils/exchanger-lifecycle-manager:main@sha256:5315489b02d27f319467f3161b64f69d76f4ba8aaf951dd921e92b2613671502
    container_name: exchanger-lifecycle-manager
    restart: unless-stopped
    read_only: true
    env_file:
      - .env.lm
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      control-net:
        ipv4_address: 10.255.255.24

  exchanger-api-websocket:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-websocket
    entrypoint: bash ./entry.sh WEBSOCKET
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.107
  exchanger-api-parser-rate:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-parser-rate
    entrypoint: bash ./entry.sh PARSER_RATE
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config:ro
      - ./public:/app/public
      - ./pluginsExternal:/app/pluginsExternal:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.108
  exchanger-api-cron:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-cron
    entrypoint: bash ./entry.sh CRON
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.109
  exchanger-api-payout:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-payout
    entrypoint: bash ./entry.sh PAYOUT
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config:ro
      - ./public:/app/public
      - ./pluginsExternal:/app/pluginsExternal:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.110
  exchanger-api-aml:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-aml
    entrypoint: bash ./entry.sh AML
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config:ro
      - ./public:/app/public
      - ./pluginsExternal:/app/pluginsExternal:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.111
  exchanger-api-module:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-module
    entrypoint: bash ./entry.sh MODULE
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config:ro
      - ./public:/app/public
      - ./pluginsExternal:/app/pluginsExternal:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.112
  exchanger-api-notification:
    image: rg.boxexchanger.net/${VCS_NAMESPACE}/exchanger-api:${API_BRANCH:-master}
    container_name: exchanger-api-notification
    entrypoint: bash ./entry.sh NOTIFICATION
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    env_file:
      - .env.mongo.user
      - .env
    volumes:
      - ./config:/app/config:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.113

  exchanger-uploader-service:
    image: rg.boxexchanger.net/boxexchanger-utils/exchanger-uploader-service:master
    container_name: exchanger-uploader-service
    restart: unless-stopped
    read_only: true
    volumes:
      - ./public:/public
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.104
  exchanger-email-service:
    image: rg.boxexchanger.net/boxexchanger-utils/exchanger-email-service:master
    container_name: exchanger-email-service
    restart: unless-stopped
    read_only: true
    volumes:
      - ./config:/app/config:ro
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.106

  exchanger-docs:
      image: rg.boxexchanger.net/boxexchanger-utils/restapi-docs-ui:master
      container_name: exchanger-docs
      restart: unless-stopped
      read_only: true
      volumes:
        - ./.env.docs.config.js:/usr/share/nginx/html/dist/_nuxt/_CONFIG.js:ro
        - type: tmpfs
          target: /tmp/
          tmpfs:
            size: "1000000"
      logging: *default-logging
      networks:
        exchanger-net:
          ipv4_address: 10.1.0.105
  exchanger-api-mongodb:
    image: mongo:6
    container_name: exchanger-api-mongodb
    restart: unless-stopped
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.102
    volumes:
      - mongo_db:/data/db
      - /backups:/backups
      - ./init_db.js:/docker-entrypoint-initdb.d/init.js
    logging: *default-logging
    ports:
      - 127.0.0.1:27017:27017
    env_file:
      - .env.mongo.root

  redis:
    image: redis:7
    container_name: exchanger-api-redis
    restart: unless-stopped
    read_only: true
    volumes:
      - redis_data:/data
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.103

  nginx-api:
    image: nginxinc/nginx-unprivileged:1.27-alpine
    container_name: nginx-api
    restart: unless-stopped
    read_only: true
    depends_on:
      - exchanger-api-http
    volumes:
      - ./nginx/:/etc/nginx/conf.d:ro
      - ./public:/public:ro
      - type: tmpfs
        target: /docker-entrypoint.d/
        tmpfs:
          size: "100000"
      - type: tmpfs
        target: /tmp/
        tmpfs:
          size: "10000000"
    ports:
      - "3000:3000"
    logging: *default-logging
    networks:
      exchanger-net:
        ipv4_address: 10.1.0.100
volumes:
  mongo_db:
  redis_data:

networks:
  exchanger-net:
    external: true
  control-net:
    external: true

11. Execute credential mongo generation script

cd /home/runner/api_server
wget "https://git.boxexchanger.net/-/snippets/2/raw/main/init_db.js"
wget "https://git.boxexchanger.net/-/snippets/2/raw/main/generate_credentials.sh"
chmod +x generate_credentials.sh
./generate_credentials.sh

12. Initialize MongoDB

docker compose up -d exchanger-api-mongodb

13. Start API server

docker compose up -d

14. Get and remove initial admin credentials:

docker exec exchanger-api cat access.txt
  • remove access.txt

    docker exec exchanger-api rm access.txt

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

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

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

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

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

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

Установить Redis

apt-get install -y redis-server

Установить пакеты g ++ build-essential imagemagick graphicsmagick

apt-get install -y g++ build-essential imagemagick graphicsmagick

Установить PM2

npm i -g pm2

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-api.git

3. Конфигурирование и запуск Rest-API

cd /var/www/exchanger-api/
npm ci

Настроить конфигурацию вашего проекта

nano .env

Внимание! Вам необходимо указать свое название проекта доменное имя и доступы к базе данных: PROJECT_NAME, API_URL, MONGO_URI

PROJECT_NAME="_PROJECT_NAME"
API_URL="https://www.domain.name/"
REDIS_URI="redis://127.0.0.1:6379/0"
MONGO_URI="mongodb://USERNAME:PASSWORD@127.0.0.1:27017/DB_NAME"
MONGO_DEBUG=false
SEND_LOGS=true
HTTP_PORT=3010
HTTP_DEBUG=false
WEBSOCKET_PORT=3011
LICENSE_PORT=3012
APP_DEBUG=false

Применить конфигурацию:

npm run configure
npm run seed

Найдите строчку !! SAVE !!!, *****@admin.ex ***** Сохраните данные это ваш логин и пароль от админ панели!

npm run migrate

Собрать документацию API:

npm install --no-save api-bxdocs
npm run build-api
npm run start

Проверить api:

curl http://localhost:3010

ответ должен содержать:

this is "service path" for project ...

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.

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

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

NAME_SPACE - вы можете узнать в вашем полностью ссылку на клонирование репозитория.

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