Skip to content

راه‌اندازی MySQL

به کمک این آموزش، شما می‌توانید دیتابیس پیشفرض مرزبان (SQLite) را به MySQL تغییر دهید.

توجه

MySQL در نسخه v0.3.2 و بالاتر پشتیبانی می‌شود.

نکته

در تمام آموزش های پایین، فایل‌ های docker-compose.yml و .env در مسیر /opt/marzban‍‍‍ و xray_config.json در مسیر /var/lib/marzban ‌می‌توانید پیدا کنید.

در صورتی که مرزبان را به صورت دستی نصب کرده‌اید، باید تغییرات مورد نیاز را شخصاً انجام دهید.

تغییر دیتابیس به MySQL (نصب تازه)

  • باید یک سرویس برای MySQL ایجاد کنید. برای این کار، فایل docker-compose.yml به شکل زیر تغییر دهید.
yml
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: mysql:latest
    restart: always
    env_file: .env
    network_mode: host
    environment:
      MYSQL_DATABASE: marzban
    volumes:
      - /var/lib/marzban/mysql:/var/lib/mysql
فعال‌سازی phpMyAdmin

برای فعال کردن phpMyAdmin، سرویس آن را مانند زیر به فایل docker-compose.yml اضافه کنید.

yml
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: mysql:latest
    restart: always
    env_file: .env
    network_mode: host
    command: --bind-address=127.0.0.1 --mysqlx-bind-address=127.0.0.1 --disable-log-bin
    environment:
      MYSQL_DATABASE: marzban
    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

با این سرویس، phpMyAdmin روی پورت 8010 سرور شما در دسترس خواهد بود.

نام کاربری ورود، root خواهد بود. password را در ادامه آموزش شما تعیین خواهید کرد.

  • متغیر های زیر را در فایل .env مقداردهی کنید.

DB_PASSWORD را به پسورد دلخواه خود برای دیتابیس تغییر دهید.

توجه

  • ‍‍DB_PASSWORD در هر دو متغییر باید به یک مقدار یکسان تغییر کند.
  • متغیر ‍MYSQL_ROOT_PASSWORD‍ در سرویس MySQL استفاده می‌شود و در متغیر های پیش‌فرض مرزبان وجود ندارد، در نتیجه خودتان باید آن را به فایل .env‍ اضافه کنید.
env
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:DB_PASSWORD@127.0.0.1/marzban"
MYSQL_ROOT_PASSWORD = DB_PASSWORD
  • بعد کد زیر رو که مربوط به دیتابیس sqlite هست رو با اضافه کردن # به اول آن کامنت کنین.
#SQLALCHEMY_DATABASE_URL = "sqlite:////var/lib/marzban/db.sqlite3"
  • مرزبان را ری‌استارت کنید.
bash
marzban restart

از این پس، اطلاعات مرزبان در MySQL (در مسیر /var/lib/marzban/mysql) ذخیره خواهد شد.

مهاجرت به MySQL (انتقال اطلاعات)

توجه

این عملیات ممکن است کمی طول بکشد، در نتیجه از قبل هاهنگی های لازم را انجام دهید.

برای انتقال اطلاعات و تغییر دیتابیس مرزبان از SQLite به MySQL باید مراحل زیر را انجام دهید.

‍- مراحل ذکر شده تغییر دیتابیس به MySQL را انجام دهید.

  • پس از ری‌استارت شدن مرزبان، دستور زیر را اجرا کنید تا از دیتابیس قبلی خروجی بسازید.
bash
sqlite3 /var/lib/marzban/db.sqlite3 '.dump --data-only' | sed "s/INSERT INTO \([^ ]*\)/REPLACE INTO \`\\1\`/g" > /tmp/dump.sql
  • وارد دایرکتوری /opt/marzban شوید.
bash
cd /opt/marzban
  • دستور زیر را اجرا کنید تا یک کپی از فایل dump.sql در کانتینر MySQL ایجاد کنید.
bash
docker compose cp /tmp/dump.sql mysql:/dump.sql
  • دستور زیر را اجرا کنید تا اطلاعات را به MySQL انتقال دهید.

راهنما

در این مرحله شما نیاز دارید تا password دیتابیس که قبل‌تر به جای DB_PASSWORD قرار داده‌اید را وارد کنید.

bash
docker compose exec mysql mysql -u root -p -h 127.0.0.1 marzban -e "SET FOREIGN_KEY_CHECKS = 0; SET NAMES utf8mb4; SOURCE dump.sql;"
  • فایل /tmp/dump.sql را پاک کنید.
bash
rm /tmp/dump.sql
  • مرزبان را ری‌استارت کنید.
bash
marzban restart

حالا اطلاعات دیتابیس قبلی شما به MySQL انتقال داده شده است.

نکته

ممکن است پس از ری‌استارت کردن مرزبان فرآیند مایگریشن کامل انجام نشده باشد، می‌توانید به جای ری‌استارت کردن، مرزبان را با دستور زیر خاموش و روشن کنید.

bash
marzban down && marzban up

نکته

اگر از اسکریپت بک‌آپ استفاده می‌کنید، لازم هست پس مهاجرت به MySQL اسکریپت بک‌آپ را مجدد اجرا کنید، در غیر این صورت بک‌آپ دیتابیس MySQL را در فایل بک‌آپ نخواهید داشت.

تغییر رمز پنل PhpMyAdmin

1 ابتدا به پنل مدیریت دیتابیس خودتون که بصورت پیش فرض روی پورت 8010 ران شده لاگین کنید.

2 قسمت User accounts را بزنید.

3 سپس در دو قسمتی که مربوط به root هستند روی Edit Privileges بزنید، دقت کنید که این فرایند که در مراحل بعد نیز توضیح داده می‌شود را باید برای هر دو قسمت انجام دهید.

4 سپس روی قسمت Change password بزنید.

5 در نهایت رمز جدید خودتون رو در دو باکس Enter و Re-type بزنید بعد دکمه Go را بزنید.

6 پس از انجام مراحل بالا رمز جدید را در فایل env در دو متغیر مربوط به دیتابیس MySQL جایگزین کنین و بعد حتما مرزبان را ری‌استارت کنید.

نکته

اگر از اسکریپت بک‌آپ استفاده می‌کنید بعد از تغییر رمز دیتابیس MySQL لازم هست که اسکریپت رو مجدد اجرا کنید در غیر این صورت فرایند بکاپ گرفتن به علت تغییر رمز انجام نخواهد شد.

نکته

پیشنهاد می‌شود پورت پیش‌فرض پنل مدیریت دیتابیس PhpMyAdmin را به پورت دیگری تغییر دهید تا یک قدم در جهت حفظ امنیت دیتابیس خود بردارید.

راه‌اندازی سرویس PhpMyAdmin برای سرورهای ARM

  • اگر معماری CPU سرور شما ARM باشد که شامل arm64 یا aarch64 است، و سرویس PhpMyAdmin را با نمونه بالا فعال سازی کردین، در لاگ های مرزبان که با دستور marzban logs قابل مشاهده است ارورهایی را خواهید دید که مربوط به ساپورت نشدن PhpMyAdmin برای CPU سرور شماست. همچنین اگر دستور marzban status را بزنید، سرویس PhpMyAdmin در حالت restarting قرار دارد.

  • برای اطمینان کامل از نوع معماری CPU سرور می توانید با اسکریپت زیر یک نمای کلی از مشخصات سرور خودتان را مشاهده کنید که جلوی بخش Arch نوع CPU قابل مشاهده است.

bash
wget -qO- bench.sh | bash
  • از این رو، باید سرویس PhpMyAdmin را در فایل docker-compose.yml مانند زیر قرار دهید که در آن از ایمیج متفاوت استفاده شده است.
yml
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: mysql:latest
    restart: always
    env_file: .env
    network_mode: host
    command: --bind-address=127.0.0.1 --mysqlx-bind-address=127.0.0.1 --disable-log-bin
    environment:
      MYSQL_DATABASE: marzban
    volumes:
      - /var/lib/marzban/mysql:/var/lib/mysql

  phpmyadmin:
    image: arm64v8/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
  • در نهایت مرزبان را با دستور زیر ریستارت کنید تا ایمیج ذکر شده Pull شود.
bash
marzban restart

حالا اگر دستور زیر را وارد کنید سرویس PhpMyAdmin باید در حالت running قرار داشته باشد.

bash
marzban status

رفع ارور موقع خروجی گرفتن از دیتابیس SQLite

اگر موقع مهاجرت به MySQL برای خروجی گرفتن از دیتابیس قبلی با ارور زیر مواجه شدید:

Unknown option "--data-only" on ".dump"

به این معناست که نسخه قدیمی از sqlite روی سرور شما نصب است. برای حل این مشکل باید از راه دیگری ورژن بالاتری از sqlite را نصب کنیم.

  • دستور اول
bash
sudo apt update && sudo apt upgrade -y
  • دستور دوم
bash
sudo apt-get install build-essential
  • دستور سوم
bash
wget https://www.sqlite.org/2023/sqlite-autoconf-3430200.tar.gz
  • دستور چهارم
bash
tar -xvf sqlite-autoconf-3430200.tar.gz && cd sqlite-autoconf-3430200
  • پیکربندی و کامپایل سورس کد (این مرحله ممکن است 3 الی 4 دقیقه طول بکشد)
bash
./configure
bash
make
  • حذف نسخه قدیمی SQLite
bash
sudo apt-get purge sqlite3
  • نصب نسخه جدید
bash
sudo make install
  • به‌روزرسانی متغیر PATH
bash
export PATH="/usr/local/bin:$PATH"
  • بررسی نسخه نصب شده
bash
sqlite3 --version

اگر همه چیز را درست انجام داده باشید، نسخه جدید باید 3.43.2 باشد.

  • اضافه کردن متغیر PATH به فایل bashrc برای ماندگاری

فایل ~/.bashrc را با nano باز کنید.

bash
nano ~/.bashrc
  • سپس خط زیر را به انتهای فایل اضافه کنید.
bash
export PATH="/usr/local/bin:$PATH"
  • اعمال تغییرات فایل bashrc
bash
source ~/.bashrc
  • حالا مجدد خروجی بگیرید و ادامه مراحل آموزش مهاجرت به MySQL را انجام دهید.

منتشر شده تحت لایسنس AGPL-3.0