Поиск
Показаны результаты для тегов 'mysql'.
Найдено 2 результата
-
Всем привет! Бывают разные технические ситуации, и вот иногда нужно сделать так, чтобы две копии Marzban были установлены на одном сервере. Сделать это возможно, и можно даже сделать управление ими через команды marzban cli. Сегодня расскажу как это сделать. За Reverse proxy будет отвечать Nginx Proxy Manager. Все подключения у клиентов будут только к нодам Страницы подписки и страницы панелей будут различаться. На мэйн сервере будут открыты только порты 443 Поднимать мэйны будем сразу с БД MySQL (MariaDB) Никакой HaProxy нам не нужен, мы не будем использовать никакой переброс портов и reality (везде будет 443 порт) Установка будет без скрипта, в ручном режиме. Начнем. 1. Берем сервер. Проще всего мне сейчас взять сервер у Vultr: https://www.vultr.com/?ref=9598405 Но как я уже говорил в теме ФэнШуя , за мэйн сервер хорошо подойдет и любой надежный провайдера в РФ, ведь к нему доступ будет скрыт полностью за CDN CloudFlare (проксироваться) и никто особо даже не узнает, что И я кажется я нашел для себя не дорогого но надежного провайдера: https://vscale.io/?invite=dhOwOGF0szepMIczf5bR (Обзор на него будет как нибудь в другой раз.) 1.1. Заказываем сервер. В моем случае я выбираю сервер с публичным адресом (конечно же), характеристики беру достаточные. Установка проходит очень быстро 2. Установка Nginx proxy manager Зашли на сервер. 2.1. Первым делом что? Правильно, обновили систему и установили обновления: apt update && apt upgrade -yqq 2.2. Теперь дело дошло до NPM Ставим сперва Docker curl -fsSL https://get.docker.com | sh Теперь ставим сам NPM mkdir npm && cd npm && nano docker-compose.yml Вставляем в него код (по инструкции: https://nginxproxymanager.com/setup/ ) services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: # These ports are in format <host-port>:<container-port> - '80:80' # Public HTTP Port - '443:443' # Public HTTPS Port - '81:81' # Admin Web Port # Add any other Stream port you want to expose # - '21:21' # FTP # Uncomment the next line if you uncomment anything in the section # environment: # Uncomment this if you want to change the location of # the SQLite DB file within the container # DB_SQLITE_FILE: "/data/database.sqlite" # Uncomment this if IPv6 is not enabled on your host # DISABLE_IPV6: 'true' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt Теперь запускаем контейнер: docker compose up -d И переходим по адресу нашего сервера на порт 81: http://31.129.56.165:81/ И вводим данные по умолчанию: Сменим сразу логин и пароль Зайдем в Proxy Host и зададим сразу домен для нашего NPM Под это дело я создам новый в CF новую запись, и сразу ее проксирую Возвращаюсь в NPM и задаю параметр домена и настройки как на скриншоте. Сеть докера по умолчанию 172.17.0.1 а порт 81 Иду на вкладку SSL и запрашиваю новый серт Отлично. Теперь идем в docker-compose.yml и уберем из публикации 81 порт nano ~/npm/docker-compose.yml Перезапускаем контейнер. docker compose restart И переходим на наш адрес: https://test-npm.openode.xyz/ 3. Установка первого Marzban Main Теперь возвращаемся к основной теме установки. Запускать каждый Marzban мы будем в отдельных контейнерах и в отдельных сетях (чтобы не было пересечения по IP адресам и портам). 3.1. Создаем новую сеть Docker docker network create --driver bridge --subnet 10.10.0.0/24 --gateway 10.10.0.1 network_one Сразу создадим вторую для второго Marzban docker network create --driver bridge --subnet 10.20.0.0/24 --gateway 10.20.0.1 network_two Давайте сразу подключим наш NPM к этим двум сетями: nano ~/npm/docker-compose.yml Добавляем в конец: networks: - network_one - network_two networks: network_one: external: true network_two: external: true Общий вид будет такой: Поднимаем заново контейнер командой: cd ~/npm && docker compose up -d 3.2. Создаем папку для первого Marzban mkdir -p /opt/marzban_1 && mkdir -p /var/lib/marzban_1 3.3. Создадим сразу файлы заготовки: touch /opt/marzban_1/docker-compose.yml && touch /opt/marzban_1/.env и скачаем наш xray-config curl -o /var/lib/marzban_1/xray_config.json https://raw.githubusercontent.com/Gozargah/Marzban/dev/xray_config.json 3.4. Заполним их содержимым docker-compose.yml: nano /opt/marzban_1/docker-compose.yml Будет иметь такой вид: services: marzban_1: image: gozargah/marzban:dev restart: always env_file: .env volumes: - /var/lib/marzban_1:/var/lib/marzban networks: network_one: ipv4_address: 10.10.0.10 depends_on: - mysql_1 mysql_1: image: mariadb:lts environment: MYSQL_ROOT_PASSWORD: my-root-password MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: marzban MYSQL_USER: marzban MYSQL_PASSWORD: password command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --innodb-log-file-size=67108864 - --bind-address=0.0.0.0 volumes: - /var/lib/marzban_1/mysql:/var/lib/mysql networks: network_one: ipv4_address: 10.10.0.3 networks: network_one: external: true 3.5. Заполним их содержимым .env: Содержимое мы ПОЛНОСТЬЮ возьмем из оригинального репозитория DEV ветки: https://raw.githubusercontent.com/Gozargah/Marzban/dev/.env.example Теперь раскомментируем нужные нам строки: Добавим новую строку для подключения к нашей БД: SQLALCHEMY_DATABASE_URL="mysql+pymysql://marzban:[email protected]:3306/marzban" Добавим строчку с ядром (для дальнейшего обновления его) - АДРЕС УКАЗЫВАЕТСЯ В ПАПКЕ ВНУТРИ КОНТЕЙНЕРА, ПОЭТОМУ АДРЕС не /marzban_1/ XRAY_JSON = "/var/lib/marzban/xray_config.json" Добавим строки с данными для подписок: XRAY_SUBSCRIPTION_URL_PREFIX = "https://link.openode.xyz" XRAY_SUBSCRIPTION_PATH = for-you Это будут наши основные, остальные параметры указывайте на свое усмотрение. 3.6. Установим сразу два оригинальных сервиса marzban cli: curl -sSL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh | sudo install -m 755 /dev/stdin /usr/local/bin/marzban_1 и второй curl -sSL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh | sudo install -m 755 /dev/stdin /usr/local/bin/marzban_2 Это позволит нам использовать разные команды для управления двумя контейнерами: marzban_1 update (например) Но мы теперь зайдем и отредактируем один параметр внутри, который будет указывать наши папки. nano /usr/local/bin/marzban_1 Находим внутри строку: И меняем на название нашего сервиса и наших папок (для удобства - они должны совпадать): marzban_1 Получаем так: Аналогично делаем для второго: nano /usr/local/bin/marzban_2 Пробуем поднять наш первый контейнер. marzban_1 up Выйдет ошибка. Не переживаем!!! Смотри список наших контейнеров: docker ps видим такой вид: Теперь нам нужно зайти в наш контейнер с mysql: docker exec -it marzban_1-mysql_1-1 bash теперь команду работы с БД mariadb -u root -p запросит пароль, вводите password Создайте пользователя marzban и установите ему пароль: CREATE USER 'marzban'@'%' IDENTIFIED BY 'password'; Предоставьте пользователю marzban все привилегии на базе данных marzban: GRANT ALL PRIVILEGES ON marzban.* TO 'marzban'@'%'; FLUSH PRIVILEGES; Убедитесь, что пользователь создан и имеет необходимые права: SHOW GRANTS FOR 'marzban'@'%'; Вывод будет примерно таким, если у вас все корректно: Теперь перезапускаем наш marzban: marzban_1 restart И видим успех! 4. Возвращаемся в нашу nginx proxy manager и пробрасываем домен для подписки и для панели (покажу только на примере подписки): Готово! Все остальные настройки используйте аналогично как я писал в предыдущих статьях. 5. Аналогичные процедуры проводим для второго сервера marzban. Но везде где мы использовали marzban_1 делаем marzban_2. А где mysql_1 делаем mysql_2. Не забываем, что мы будем использовать другую сеть. Вот конфиг docker-compose.yml для marzban_2 из нашего примера: services: marzban_2: image: gozargah/marzban:dev restart: always env_file: .env volumes: - /var/lib/marzban_2:/var/lib/marzban networks: network_two: ipv4_address: 10.20.0.10 depends_on: - mysql_1 mysql_2: image: mariadb:lts environment: MYSQL_ROOT_PASSWORD: my-root-password MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: marzban MYSQL_USER: marzban MYSQL_PASSWORD: password command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --innodb-log-file-size=67108864 - --bind-address=0.0.0.0 volumes: - /var/lib/marzban_2/mysql:/var/lib/mysql networks: network_one: ipv4_address: 10.20.0.3 networks: network_two: external: true Отдельной темой распишу потом как ограничить доступ к другим путям, если мы используем разные домены для подписки и для панели.
-
mysql Установка Marzban [Часть 6] - Переход на MySQL
TrustMe опубликовал тема в Marzban Продвинутые инструкции
В продолжении развивающих тем, перейдем к варианту, когда у вас количество текущих или потенциальных пользователей перевалило за 200 человек.. Пожалуй только в этом варианте есть смысл переходить на MySQL. Этот вариант мы и разберем. Требование: Для стабильной работы базы данных, требуются дополнительные ресурсы. Минимально рекомендуемые параметры в этом случае (с учетом количества пользователей): 2+ ядра, 4+ гига, 30Гб+ места (на всякий случай) + SWAP. Офф инструкция: Настройка MySQL | Марзбан (gozargah.github.io) В связи с последними изменениями в mysql, процедура обновления на БД изменилось. 0. Создаем контейнер, который потом будем использовать. 0.1. Создаем том данных docker volume create mysql 0.2. Создаем контейнер Данные по контейнеру вы можете задать свои. но это не обязательно. docker run -d --rm --name mysql -v /var/lib/marzban/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-root-password -e MYSQL_ROOT_HOST=127.0.0.1 -e MYSQL_DATABASE=marzban -e MYSQL_PASSWORD=password -e MYSQL_USER=marzban mariadb:lts --character_set_server=utf8mb4 --collation_server=utf8mb4_unicode_ci --innodb-log-file-size=67108864 В данном случае мы базу данных также складываем в папку /var/lib/marzban/mysql для возможности дальнейшего бэкапа. 0.3. Останавливаем контейнер docker exec -it mysql mysqladmin shutdown -u root -p При остановке будет запрошен пароль, вводите: my-root-password 1. Редактируем docker-compose.yml Открываем для редактирования файл nano /opt/marzban/docker-compose.yml И заменяем содержимое, либо вносим поправки. 1.1. Полная замена содержимого Стираем все что есть, и вставляем код: services: marzban: image: gozargah/marzban:latest restart: always env_file: .env network_mode: host volumes: - /var/lib/marzban:/var/lib/marzban depends_on: - mysql mysql: image: mariadb:lts network_mode: host command: - --bind-address=127.0.0.1 - --character_set_server=utf8mb4 - --collation_server=utf8mb4_unicode_ci - --host-cache-size=0 - --innodb-open-files=1024 - --innodb-buffer-pool-size=268435456 volumes: - /var/lib/marzban/mysql:/var/lib/mysql phpmyadmin: image: phpmyadmin/phpmyadmin:latest restart: always env_file: .env network_mode: host environment: PMA_HOST: 127.0.0.1 APACHE_PORT: 8010 UPLOAD_LIMIT: 1024M depends_on: - mysql 1.2. Если мы будем дополнять ваш текущий файл, то будем начинать с добавления строки для нашего marzban depends_on: depends_on: - mysql mysql: image: mariadb:lts network_mode: host command: - --bind-address=127.0.0.1 - --character_set_server=utf8mb4 - --collation_server=utf8mb4_unicode_ci - --host-cache-size=0 - --innodb-open-files=1024 - --innodb-buffer-pool-size=268435456 volumes: - /var/lib/marzban/mysql:/var/lib/mysql 1.3. Если вы не хотите устанавливать phpMyAdmin, то не вставляйте вторую часть кода. Учтите, что очень важно соблюдать отступы, это формирует вложенность параметров при формировании контейнера!!! 2. Редактирование файлa .env 2.1. Давайте сначала добавим новые переменные, каждая на отдельную строку: SQLALCHEMY_DATABASE_URL="mysql+pymysql://marzban:[email protected]:3306/marzban" MYSQL_ROOT_PASSWORD=DB_PASS #для phpmyadmin Здесь значение password нужно заменить на свой пароль. Окончание строки переменной SQLALCHEMY_DATABASE_URL должно соответствовать вашему имени базы данных, которую вы задаете в MYSQL_DATABASE. Помимо всего прочего, MySQL мы не выносим в открытый доступ, а значит он будет использоваться только в локальной сети. А вот если вам постоянно не нужен доступ к phpMyAdmin,то закрывайте его через UFW: ufw deny 8010 (но если он вам нужен, то нужно обязательно прописать правило: ufw allow 8010) 2.1. Комментируем лишние строки - Добавляем в начале # : #SQLALCHEMY_DATABASE_URL="sqlite:////var/lib/marzban/db.sqlite3" 3. Применение изменений. Сначала обновляем: marzban update Затем перезапускаем: marzban restart -n Нужно будет подождать около минуты-1.5. 4. Работа с базой 4.1. Создаем дамп базы данных: sqlite3 /var/lib/marzban/db.sqlite3 '.dump --data-only' | sed "s/INSERT INTO \([^ ]*\)/REPLACE INTO \`\\1\`/g" > /tmp/dump.sql 4.2. Копируем дамп в директорию MySQL: cd /opt/marzban && docker compose cp /tmp/dump.sql mysql:/dump.sql 4.3. Переносим данные из SQLite в MySQL: docker compose exec mysql mysql -u marzban -ppassword -h 127.0.0.1 marzban -e "SET FOREIGN_KEY_CHECKS = 0; SET NAMES utf8mb4; SOURCE /dump.sql;" Для запуска процесса, будет запрошен пароль для MySQL. 4.4. Перезапускаем Marzban: marzban restart -n 4.5. Удаляем временный файл: rm /tmp/dump.sql phpMyAdmin будет доступен по адресу: http://domain.com:8010 Порт должен быть открыть в UFW: ufw allow 8010 Логин для входа: root Пароль: заданный вместо DB_PASS 5. Установим SWAP в систему Данная опция не обязательна, но позволяет повысить объем свободной памяти в системе. Но может затормозить систему в целом. Так как вам для этого нужны диски с высокой скоростью чтения/записи. Я уже давно написал скрипт, создающего это в автоматическом режиме. Поэтому воспользуйтесь просто командой: bash <(wget -qO- https://raw.githubusercontent.com/DigneZzZ/dwg/main/tools/swap.sh) 6. Автоматический скрипт смены БД Нашел на ГитХабе скрипт для автоматической смены БД. При тестировании у меня не установился phpmyadmin. И 1 из 4 попыток, база перенеслась без данных. bash <(curl -s https://raw.githubusercontent.com/mobinalipour/marzban-to-mysql/main/marzban-to-mysql.sh)