diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 4a1afef..811883a 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,3 +1,3 @@
# These are supported funding model platforms
-custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer]
\ No newline at end of file
+custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer]
diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml
deleted file mode 100644
index 3e51da4..0000000
--- a/.github/workflows/build-and-push.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-name: Check for new RouterOS versions, build and push containers
-
-on:
- workflow_dispatch:
- schedule:
- - cron: '0 0 * * *' # Every day at midnight
-
-jobs:
- check-and-build:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout code
- uses: actions/checkout@v5
-
- - name: Install dependencies
- run: sudo apt-get install -y curl jq
-
- - name: Get latest RouterOS version
- id: get_routeros_version
- run: |
- VERSION=$(
- curl https://mikrotik.com/download/archive -o - 2>/dev/null | \
- grep -o '> $GITHUB_OUTPUT
-
- - name: Get Docker Hub tags
- id: docker_hub_tags
- run: |
- OWNER="evilfreelancer"
- REPO="docker-routeros"
- URL="https://registry.hub.docker.com/v2/repositories/${OWNER}/${REPO}/tags/"
- TAGS=$(curl -s "$URL" | jq -r '.results[].name' | grep -v "latest")
- echo "tags=$(echo $TAGS | tr '\n' ' ')" >> $GITHUB_OUTPUT
-
- - name: Login to Docker Hub
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- - name: Build and test if new version
- if: ${{ !contains(steps.docker_hub_tags.outputs.tags, steps.get_routeros_version.outputs.version) }}
- run: |
- VERSION="${{ steps.get_routeros_version.outputs.version }}"
- OWNER="evilfreelancer"
- REPO="docker-routeros"
-
- # Set up Docker Buildx
- docker buildx create --use --name routeros_builder
-
- # Build and push images
- docker buildx build --push \
- --platform linux/amd64,linux/arm64 \
- --tag $OWNER/$REPO:$VERSION \
- --tag $OWNER/$REPO:latest \
- --build-arg ROUTEROS_VERSION=$VERSION .
-
- - name: Skip build
- if: ${{ contains(steps.docker_hub_tags.outputs.tags, steps.get_routeros_version.outputs.version) }}
- run: echo "Version ${{ steps.get_routeros_version.outputs.version }} already exists. Skipping build."
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
new file mode 100644
index 0000000..b2ef7d0
--- /dev/null
+++ b/.github/workflows/cd.yml
@@ -0,0 +1,34 @@
+name: "Build docker image and push to DockerHub when a tag is pushed"
+
+on:
+ workflow_dispatch:
+ push:
+ tags:
+ - '*'
+
+jobs:
+ build:
+ name: "Build images"
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ - name: Docker metadata from Git
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: evilfreelancer/docker-routeros
+ - name: Login to DockerHub
+ if: ${{ !env.ACT }}
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Build with Docker
+ uses: docker/build-push-action@v6
+ with:
+ context: .
+ push: ${{ !env.ACT }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..8ad2c72
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,46 @@
+name: "Continuous Integration Tests"
+
+on:
+ push:
+ pull_request:
+ workflow_dispatch:
+ workflow_call:
+
+jobs:
+ test:
+ name: "Build & Test images"
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Download docker-compose when using act
+ run: |
+ sudo curl -L "https://github.com/docker/compose/releases/download/v2.29.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+ sudo chmod +x /usr/local/bin/docker-compose
+
+ - name: Test with Docker
+ run: |
+ # start the container
+ docker-compose -f docker-compose.dist.yml up --build -d routeros-local
+ # wait for the container to start
+ sleep 5
+ DOCKERID=$(docker ps --format '{{.ID}}.{{.Names}}.{{.Image}}'|grep evilfreelancer/docker-routeros|cut -f 1 -d '.')
+ echo "Watching $DOCKERID for Mikrotik login..."
+ while true
+ do
+ if docker logs "$DOCKERID" 2>&1|grep 'MikroTik'
+ then
+ break
+ fi
+ echo "Not found yet, sleeping..."
+ sleep 5
+ done
+ # display logs
+ echo "Container logs:"
+ docker logs "$DOCKERID"
+ # download resource and check platform is Mikrotik
+ curl --retry 12 --retry-all-errors -k -u admin: http://127.0.0.1:7777/rest/system/resource | jq .platform |grep -i mikrotik
+
+ - name: Stop container
+ run: docker-compose -f docker-compose.dist.yml down
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000..dbb13a9
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,14 @@
+name: Lint github-action
+
+on: [ 'pull_request' ]
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Lint
+ uses: docker://rhysd/actionlint:1.6.26
+ with:
+ args: -color
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
new file mode 100644
index 0000000..07256ab
--- /dev/null
+++ b/.github/workflows/pr.yml
@@ -0,0 +1,47 @@
+name: "Check for update on Mikrotik website and generate a PR if necessary"
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: "0 4 * * *"
+
+jobs:
+ routeros:
+ name: "Build & Test images"
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: '1'
+
+ - name: Check new release
+ id: check_release
+ run: |
+ LAST_MIKROTIK_RELEASE=$( curl https://mikrotik.com/download/archive -o - 2>/dev/null | grep -o ' "$GITHUB_OUTPUT"
+ echo "new=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "No new version found"
+ echo "new=false" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Edit Dockerfile
+ if: ${{ steps.check_release.outputs.new == 'true' }}
+ run: |
+ sed -r "s/(ROUTEROS_VERSION=\")(.*)(\")/\1${{ steps.check_release.outputs.release }}\3/g" -i Dockerfile
+ git diff
+
+ - name: Create Pull Request
+ if: ${{ steps.check_release.outputs.new == 'true' && !env.ACT }}
+ uses: peter-evans/create-pull-request@v7
+ with:
+ commit-message: "Update RouterOS version to ${{ steps.check_release.outputs.release }}"
+ committer: "GitHub Actions"
+ body: 'Created by Github action'
+ title: 'Update RouterOS version to ${{ steps.check_release.outputs.release }}'
+ branch: update-routeros
diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml
new file mode 100644
index 0000000..6cfad76
--- /dev/null
+++ b/.github/workflows/tag.yml
@@ -0,0 +1,38 @@
+name: "Tag master with new version of RouterOS when CI pass"
+
+on:
+ push:
+ branches:
+ - "master"
+
+permissions:
+ contents: write
+ pull-requests: read
+
+jobs:
+ call_test:
+ uses: EvilFreelancer/docker-routeros/.github/workflows/ci.yml@master
+
+ tag:
+ name: "Add a tag to git"
+ runs-on: "ubuntu-latest"
+ needs: call_test
+ if: always() && needs.call_test.result == 'success'
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: '0'
+
+ - name: Add new tag on git
+ id: tag
+ run: |
+ NEW_TAG=$(grep 'ROUTEROS_VERSION="' Dockerfile |cut -d '"' -f 2)
+ git config user.name 'GitHub Actions'
+ git config user.email 'github-actions@users.noreply.github.com'
+ git tag "$NEW_TAG"
+ echo "new_tag=$NEW_TAG" >> "$GITHUB_OUTPUT"
+
+ - name: Push new tag to git
+ if: ${{ !env.ACT }}
+ run: git push origin ${{ steps.tag.outputs.new_tag }}
diff --git a/.gitignore b/.gitignore
index 178ed4b..42efebe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
/.idea/
/*.vdi
/docker-compose.yml
-build.txt
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index fe8f4e5..7912d56 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.22.1
+FROM alpine:3.20.3
# For access via VNC
EXPOSE 5900
@@ -9,8 +9,6 @@ EXPOSE 1194 1701 1723 1812/udp 1813/udp 21 22 23 443 4500/udp 50 500/udp 51 2021
# Change work dir (it will also create this folder if is not exist)
WORKDIR /routeros
-RUN mkdir -p /routeros_source
-
# Install dependencies
RUN set -xe \
&& apk add --no-cache --update \
@@ -19,17 +17,16 @@ RUN set -xe \
bridge-utils iptables jq bash python3
# Environments which may be change
-ARG ROUTEROS_VERSION
-ENV ROUTEROS_VERSION=${ROUTEROS_VERSION}
+ENV ROUTEROS_VERSION="7.16"
ENV ROUTEROS_IMAGE="chr-${ROUTEROS_VERSION}.vdi"
ENV ROUTEROS_PATH="https://cdn.mikrotik.com/routeros/${ROUTEROS_VERSION}/${ROUTEROS_IMAGE}.zip"
# Download VDI image from remote site
-RUN wget "$ROUTEROS_PATH" -O "/routeros_source/${ROUTEROS_IMAGE}.zip" && \
- unzip "/routeros_source/${ROUTEROS_IMAGE}.zip" -d "/routeros_source" && \
- rm -f "/routeros_source/${ROUTEROS_IMAGE}.zip"
+RUN wget "$ROUTEROS_PATH" -O "/routeros/${ROUTEROS_IMAGE}.zip" && \
+ unzip "/routeros/${ROUTEROS_IMAGE}.zip" -d "/routeros" && \
+ rm -f "/routeros/${ROUTEROS_IMAGE}.zip"
# Copy script to routeros folder
-ADD ["./scripts", "/routeros_source"]
+ADD ["./scripts", "/routeros"]
-ENTRYPOINT ["/routeros_source/entrypoint.sh"]
+ENTRYPOINT ["/routeros/entrypoint.sh"]
diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh
index 8701ef8..7240d84 100755
--- a/scripts/entrypoint.sh
+++ b/scripts/entrypoint.sh
@@ -1,13 +1,5 @@
#!/usr/bin/env bash
-if [[ ! -e "/routeros/generate-dhcpd-conf.py" ]]; then
-
- cp -r /routeros_source/. /routeros
-fi
-
-
-cd /routeros
-
QEMU_BRIDGE_ETH1='qemubr1'
default_dev1='eth0'
@@ -49,14 +41,13 @@ KVM_OPTS=""
if [ -e /dev/kvm ]; then
if grep -q -e vmx -e svm /proc/cpuinfo; then
echo "Enabling KVM"
- CPU_FEATURES="host,kvm=on"
+ CPU_FEATURES=",kvm=on"
KVM_OPTS="-machine accel=kvm -enable-kvm"
fi
fi
if [ "$CPU_FEATURES" = "" ]; then
echo "KVM not available, running in emulation mode. This will be slow."
- CPU_FEATURES="qemu64"
fi
# And run the VM! A brief explanation of the options here:
@@ -71,7 +62,7 @@ exec qemu-system-x86_64 \
-nographic \
-m 512 \
-smp 4,sockets=1,cores=4,threads=1 \
- -cpu $CPU_FEATURES \
+ -cpu host$CPU_FEATURES \
$KVM_OPTS \
-nic tap,id=qemu1,mac=54:05:AB:CD:12:31,script=$QEMU_IFUP,downscript=$QEMU_IFDOWN \
"$@" \