diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 811883a..4a1afef 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]
+custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer]
\ No newline at end of file
diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml
new file mode 100644
index 0000000..3e51da4
--- /dev/null
+++ b/.github/workflows/build-and-push.yml
@@ -0,0 +1,69 @@
+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
deleted file mode 100644
index b2ef7d0..0000000
--- a/.github/workflows/cd.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-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
deleted file mode 100644
index 8ad2c72..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-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
deleted file mode 100644
index dbb13a9..0000000
--- a/.github/workflows/lint.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 07256ab..0000000
--- a/.github/workflows/pr.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-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
deleted file mode 100644
index 6cfad76..0000000
--- a/.github/workflows/tag.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-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 42efebe..178ed4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/.idea/
/*.vdi
/docker-compose.yml
+build.txt
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index ce1330e..fe8f4e5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:3.21.2
+FROM alpine:3.22.1
# For access via VNC
EXPOSE 5900
@@ -9,6 +9,8 @@ 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 \
@@ -17,16 +19,17 @@ RUN set -xe \
bridge-utils iptables jq bash python3
# Environments which may be change
-ENV ROUTEROS_VERSION="7.17"
+ARG ROUTEROS_VERSION
+ENV ROUTEROS_VERSION=${ROUTEROS_VERSION}
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/${ROUTEROS_IMAGE}.zip" && \
- unzip "/routeros/${ROUTEROS_IMAGE}.zip" -d "/routeros" && \
- rm -f "/routeros/${ROUTEROS_IMAGE}.zip"
+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"
# Copy script to routeros folder
-ADD ["./scripts", "/routeros"]
+ADD ["./scripts", "/routeros_source"]
-ENTRYPOINT ["/routeros/entrypoint.sh"]
+ENTRYPOINT ["/routeros_source/entrypoint.sh"]
diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh
index 7240d84..8701ef8 100755
--- a/scripts/entrypoint.sh
+++ b/scripts/entrypoint.sh
@@ -1,5 +1,13 @@
#!/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'
@@ -41,13 +49,14 @@ KVM_OPTS=""
if [ -e /dev/kvm ]; then
if grep -q -e vmx -e svm /proc/cpuinfo; then
echo "Enabling KVM"
- CPU_FEATURES=",kvm=on"
+ CPU_FEATURES="host,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:
@@ -62,7 +71,7 @@ exec qemu-system-x86_64 \
-nographic \
-m 512 \
-smp 4,sockets=1,cores=4,threads=1 \
- -cpu host$CPU_FEATURES \
+ -cpu $CPU_FEATURES \
$KVM_OPTS \
-nic tap,id=qemu1,mac=54:05:AB:CD:12:31,script=$QEMU_IFUP,downscript=$QEMU_IFDOWN \
"$@" \