Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
123 changes: 120 additions & 3 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,124 @@ For convenience, prebuilt client and server binaries are published in the releas

---

### Section 2.2: 🪟 Preparing and Running the Client on Windows
### Section 2.2: 📦 MasterDnsVPN Docker Image

---

#### Section 2.2.1: ⚠️ Overview

This Docker image runs the MasterDnsVPN server in a containerized environment and supports multi-architecture builds.

It automatically:

* Boots a default configuration if none exists
* Injects your domain on first startup
* Stores persistent data in `/data`

---

#### Section 2.2.2: 🖥 Supported Architectures

* linux/amd64
* linux/arm/v5
* linux/arm/v7
* linux/arm64/v8
* linux/mips64le

---

#### Section 2.2.3: 🚀 Quick Start

Run the container with Docker:

```bash
docker run -d \
--name masterdnsvpn \
--restart unless-stopped \
-e DOMAIN=v.example.com \
-v $(pwd)/data:/data \
-p 53:53/tcp \
-p 53:53/udp \
ghcr.io/masterking32/masterdnsvpn:latest
```

---

#### Section 2.2.4: 🧪 Example with docker-compose

```yaml
services:
masterdnsvpn:
image: ghcr.io/masterking32/masterdnsvpn:latest
restart: unless-stopped
environment:
- DOMAIN=v.example.com
volumes:
- ./data:/data
ports:
- "53:53/tcp"
- "53:53/udp"
```

---

#### Section 2.2.5: ⚙️ Required Environment Variables

| Variable | Description |
| -------- | --------------------------------------- |
| DOMAIN | Your DNS domain (required on first run) |

> ⚠️ If `DOMAIN` is not set on first boot, the container will stop with an error.

---

#### Section 2.2.6: 📁 Persistent Data

Stored in `/data`:

* `server_config.toml`
* `encrypt_key.txt`

You can mount it as volume:

```bash
-v ./data:/data
```

---

#### Section 2.2.7: 🔧 MikroTik / RouterOS Usage

For MikroTik containers:

* Use latest v7 MikroTik RouterOS
* Destination NAT port UDP/TCP 53 to your container
* Full MikroTik container setup: https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container

Example:

```bash
/container mounts
add dst=/data list=MasterDnsVPN src=/containers/mounts/MasterDnsVPN

/container envs
add key=DOMAIN list=MasterDnsVPN value=v.example.com

/container add check-certificate=no dns=1.1.1.1 envlists=MasterDnsVPN hostname=MasterDnsVPN interface=MasterDnsVPN layer-dir="" mountlists=MasterDnsVPN name=MasterDnsVPN remote-image=ghcr.io/masterking32/masterdnsvpn:latest root-dir=/containers/data/MasterDnsVPN start-on-boot=yes
```

---

#### Section 2.2.8: 📌 Notes

* DNS port `53` is required (UDP/TCP)
* Do NOT run another DNS service on the same host
* Designed for production use but still lightweight
* No systemd or host modifications required

---

### Section 2.3: 🪟 Preparing and Running the Client on Windows

- After downloading the Windows package, extract it.
- Open `client_config.toml` with a text editor such as Notepad.
Expand All @@ -251,7 +368,7 @@ For convenience, prebuilt client and server binaries are published in the releas

---

### Section 2.3: 🐧 Preparing and Running on Linux / macOS
### Section 2.4: 🐧 Preparing and Running on Linux / macOS

After downloading the package on Linux:

Expand Down Expand Up @@ -290,7 +407,7 @@ Then run:

---

### Section 2.4: 🧑‍💻 Run Directly from Source (Go)
### Section 2.5: 🧑‍💻 Run Directly from Source (Go)

> ⚠️ This section is intended for developers or users who want to run the current Go source directly.

Expand Down
132 changes: 125 additions & 7 deletions README_FA.MD
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ sudo firewall-cmd --reload

---


## بخش ۲: 🚀 نصب و راه‌اندازی (کلاینت و سرور)

شما می‌توانید این پروژه را به دو روش نصب و اجرا کنید:
Expand Down Expand Up @@ -240,7 +241,124 @@ sudo firewall-cmd --reload

---

### بخش ۲.۲: 🪟 آماده‌سازی و اجرای کلاینت در ویندوز
### بخش ۲.۲: 📦 ایمیج Docker مربوط به MasterDnsVPN

---

#### بخش ۲.۲.۱: ⚠️ نمای کلی

این ایمیج Docker سرور MasterDnsVPN را در یک محیط کانتینری اجرا می‌کند و از ساخت‌های چندمعماری پشتیبانی می‌کند.

این ایمیج به‌صورت خودکار:

* اگر هیچ پیکربندی‌ای وجود نداشته باشد، یک پیکربندی پیش‌فرض راه‌اندازی می‌کند
* در اولین اجرا دامنهٔ شما را تزریق می‌کند
* داده‌های پایدار را در مسیر `/data` ذخیره می‌کند

---

#### بخش ۲.۲.۲: 🖥 معماری‌های پشتیبانی‌شده

* linux/amd64
* linux/arm/v5
* linux/arm/v7
* linux/arm64/v8
* linux/mips64le

---

#### بخش ۲.۲.۳: 🚀 شروع سریع

کانتینر را با Docker اجرا کنید:

```bash
docker run -d \
--name masterdnsvpn \
--restart unless-stopped \
-e DOMAIN=v.example.com \
-v $(pwd)/data:/data \
-p 53:53/tcp \
-p 53:53/udp \
ghcr.io/masterking32/masterdnsvpn:latest
```

---

#### بخش ۲.۲.۴: 🧪 نمونه با docker-compose

```yaml
services:
masterdnsvpn:
image: ghcr.io/masterking32/masterdnsvpn:latest
restart: unless-stopped
environment:
- DOMAIN=v.example.com
volumes:
- ./data:/data
ports:
- "53:53/tcp"
- "53:53/udp"
```

---

#### بخش ۲.۲.۵: ⚙️ متغیرهای محیطی موردنیاز

| متغیر | توضیح |
| ------ | ----------------------------------------- |
| DOMAIN | دامنهٔ DNS شما (در اولین اجرا الزامی است) |

> ⚠️ اگر `DOMAIN` در اولین بوت تنظیم نشده باشد، کانتینر با خطا متوقف می‌شود.

---

#### بخش ۲.۲.۶: 📁 داده‌های پایدار

در مسیر `/data` ذخیره می‌شوند:

* `server_config.toml`
* `encrypt_key.txt`

می‌توانید آن را به‌صورت volume mount کنید:

```bash
-v ./data:/data
```

---

#### بخش ۲.۲.۷: 🔧 استفاده در MikroTik / RouterOS

برای کانتینرهای MikroTik:

* از آخرین نسخهٔ v7 MikroTik RouterOS استفاده کنید
* با Destination NAT پورت UDP/TCP 53 را به کانتینر خود هدایت کنید
* راهنمای کامل راه‌اندازی کانتینر MikroTik: [https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container)

نمونه:

```bash
/container mounts
add dst=/data list=MasterDnsVPN src=/containers/mounts/MasterDnsVPN

/container envs
add key=DOMAIN list=MasterDnsVPN value=v.example.com

/container add check-certificate=no dns=1.1.1.1 envlists=MasterDnsVPN hostname=MasterDnsVPN interface=MasterDnsVPN layer-dir="" mountlists=MasterDnsVPN name=MasterDnsVPN remote-image=ghcr.io/masterking32/masterdnsvpn:latest root-dir=/containers/data/MasterDnsVPN start-on-boot=yes
```

---

#### بخش ۲.۲.۸: 📌 نکات

* پورت DNS یعنی `53` لازم است (UDP/TCP)
* هیچ سرویس DNS دیگری را روی همان میزبان اجرا نکنید
* برای استفادهٔ production طراحی شده، اما همچنان سبک است
* نیازی به systemd یا تغییرات در سیستم میزبان ندارد

---

### بخش ۲.۳: 🪟 آماده‌سازی و اجرای کلاینت در ویندوز

- پس از دانلود نسخه مربوط به ویندوز آن را از حالت فشرده خارج کنید.
- فایل client_config.toml را با ویرایشگر متن نظیر Notepad باز کنید.
Expand All @@ -257,7 +375,7 @@ sudo firewall-cmd --reload
> ⚠️ **نکته مهم:** روش پیدا کردن لیست Resolver ها در انتهای این مقاله بهش اشاره شده است.
---

### بخش ۲.۳: 🐧 آماده‌سازی و اجرا در لینوکس
### بخش ۲.۴: 🐧 آماده‌سازی و اجرا در لینوکس

- پس از دانلود نسخه مربوط به لینوکس، فایل ZIP را استخراج کنید، برای اینکار ابتدا برنامه های مورد نیاز را نصب کنید:

Expand Down Expand Up @@ -290,9 +408,9 @@ nano client_config.toml

> ⚠️ **نکته:** شما باید لیست ریزالورهایی که قابلیت انتقال اطلاعات به سرور شما را دارند پیدا کنید و در این فایل قرار دهید.

#### بخش ۲.۳.۱: اجرای کلاینت در پس‌زمینه
#### بخش ۲.۴.۱: اجرای کلاینت در پس‌زمینه

##### بخش ۲.۳.۱.۱: استفاده از `screen` برای اجرای در پس‌زمینه
##### بخش ۲.۴.۱.۱: استفاده از `screen` برای اجرای در پس‌زمینه
- حالا می‌توانید فایل اجرایی را اجرا کنید، توصیه می‌شود برای اجرای سرور و کلاینت در پس‌زمینه از `screen` استفاده کنید تا در صورت قطع اتصال SSH، برنامه‌ها همچنان اجرا بمانند:
```bash
screen -S MasterDnsVPN
Expand All @@ -303,7 +421,7 @@ screen -S MasterDnsVPN
screen -r MasterDnsVPN
```

##### بخش ۲.۳.۱.۲: تبدیل به سرویس systemd
##### بخش ۲.۴.۱.۲: تبدیل به سرویس systemd

همچنین میتوانید نسخه کلاینت را به سرویس systemd تبدیل کنید تا همیشه در پس‌زمینه اجرا باشد، برای اینکار فایل سرویس زیر را ایجاد کنید:

Expand Down Expand Up @@ -338,7 +456,7 @@ sudo systemctl start masterdnsvpn-client
sudo journalctl -u masterdnsvpn-client -f
```

### بخش ۲.۴: 🍎 آماده‌سازی و اجرا در مک
### بخش ۲.۵: 🍎 آماده‌سازی و اجرا در مک

- پس از دانلود نسخه مربوط به مک، فایل ZIP را استخراج کنید.
- فایل `client_config.toml` را با ویرایشگر متن باز کنید (مثلاً با TextEdit یا nano در ترمینال) و مقادیر زیر را تنظیم کنید:
Expand All @@ -354,7 +472,7 @@ sudo journalctl -u masterdnsvpn-client -f

---

#### بخش ۲.۵: 🐈‍⬛ پارامترهای خط فرمان (Command-line) برای کلاینت و سرور
#### بخش ۲.۶: 🐈‍⬛ پارامترهای خط فرمان (Command-line) برای کلاینت و سرور

هر دو باینری از این پارامترها پشتیبانی می‌کنند:

Expand Down
72 changes: 72 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
FROM debian:bookworm-slim AS downloader

ARG TARGETARCH
ARG TARGETVARIANT
ARG RELEASE_TAG=latest

RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
unzip \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /out

RUN set -eux; \
case "${TARGETARCH}" in \
amd64) \
ARTIFACT="MasterDnsVPN_Server_Linux_AMD64.zip"; PREFIX="MasterDnsVPN_Server_Linux_AMD64" ;; \
arm64) \
ARTIFACT="MasterDnsVPN_Server_Linux_ARM64.zip"; PREFIX="MasterDnsVPN_Server_Linux_ARM64" ;; \
arm) \
case "${TARGETVARIANT}" in \
v5) ARTIFACT="MasterDnsVPN_Server_Linux_ARMV5.zip"; PREFIX="MasterDnsVPN_Server_Linux_ARMV5" ;; \
v7|"") ARTIFACT="MasterDnsVPN_Server_Linux_ARMV7.zip"; PREFIX="MasterDnsVPN_Server_Linux_ARMV7" ;; \
*) echo "Unsupported ARM variant: ${TARGETVARIANT}" >&2; exit 1 ;; \
esac ;; \
mips64le) \
ARTIFACT="MasterDnsVPN_Server_Linux_MIPS64LE.zip"; PREFIX="MasterDnsVPN_Server_Linux_MIPS64LE" ;; \
*) \
echo "Unsupported TARGETARCH=${TARGETARCH}" >&2; exit 1 ;; \
esac; \
curl -fsSL --retry 3 --retry-delay 2 \
-o /tmp/masterdnsvpn.zip \
"https://github.com/masterking32/MasterDnsVPN/releases/${RELEASE_TAG}/download/${ARTIFACT}"; \
unzip -q /tmp/masterdnsvpn.zip -d /out; \
rm -f /tmp/masterdnsvpn.zip; \
BIN="$(find /out -maxdepth 1 -type f -name "${PREFIX}_v*" | sort -V | tail -n1)"; \
if [ -z "${BIN}" ]; then echo "Could not find extracted binary for ${PREFIX}" >&2; exit 1; fi; \
mv "${BIN}" /out/masterdnsvpn; \
chmod 0755 /out/masterdnsvpn; \
find /out -maxdepth 1 -type f ! -name masterdnsvpn -delete

FROM debian:bookworm-slim

LABEL org.opencontainers.image.source=https://github.com/masterking32/MasterDnsVPN

ENV DEBIAN_FRONTEND=noninteractive \
APP_DIR=/opt/masterdnsvpn \
DATA_DIR=/data \
CONFIG_FILE=server_config.toml \
KEY_FILE=encrypt_key.txt

RUN apt-get update && apt-get install -y --no-install-recommends \
bash \
ca-certificates \
curl \
tini \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /opt/masterdnsvpn /data

COPY --from=downloader /out/masterdnsvpn /opt/masterdnsvpn/masterdnsvpn
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh

RUN chmod 0755 /opt/masterdnsvpn/masterdnsvpn /usr/local/bin/docker-entrypoint.sh

WORKDIR /opt/masterdnsvpn

EXPOSE 53/tcp 53/udp
VOLUME ["/data"]

ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/docker-entrypoint.sh"]
CMD ["-nowait"]
Loading