diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..52b5e2ce49d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +# empty +**/build +**/.dockerignore +**/target +**/.gradle +**/.idea +**/.git +**/.gitignore +**/.project +**/.settings +**/bin +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/.docker +LICENSE +README.md diff --git a/.github/workflows/deploy-builder.yml b/.github/workflows/deploy-builder.yml new file mode 100644 index 00000000000..3078fb180cc --- /dev/null +++ b/.github/workflows/deploy-builder.yml @@ -0,0 +1,52 @@ +name: deploy builder container image + +on: + push: + branches: + - 'master' + +env: + REGISTRY: ghcr.io + REPO: ghcr.io/${{ github.repository }}-builder + +jobs: + deploy-builder: + runs-on: ubuntu-latest + strategy: + fail-fast: false + permissions: + contents: read + packages: write + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: recursive + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set environment DOCKERHUB_IMAGE_PLATFORMS + run: | + _DOCKERHUB_IMAGE_PLATFORMS="linux/amd64,linux/arm64" + echo "DOCKERHUB_IMAGE_PLATFORMS=$_DOCKERHUB_IMAGE_PLATFORMS" >> $GITHUB_ENV + + - name: Build and push Docker image Trace + uses: docker/build-push-action@v4 + with: + context: . + file: docker/Dockerfile.builder + push: true + platforms: ${{ env.DOCKERHUB_IMAGE_PLATFORMS }} + tags: ${{ env.REPO }}:latest,${{ env.REPO }}:1.0 diff --git a/.github/workflows/deploy-containers.yml b/.github/workflows/deploy-containers.yml new file mode 100644 index 00000000000..c54a2e85087 --- /dev/null +++ b/.github/workflows/deploy-containers.yml @@ -0,0 +1,86 @@ +--- +name: Build and push docker images + +on: + release: + types: [published] + +env: + REGISTRY: ghcr.io + DOCKERHUB_REPOSITORY: ghcr.io/${{ github.repository }} + +defaults: + run: + shell: bash + +jobs: + docker-build-push: + name: Build and push docker images + runs-on: ubuntu-22.04 + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + os: [alpine, debian, ubuntu] + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: nowsprinting/check-version-format-action@v3 + id: version + with: + prefix: 'v' + + - name: Set environment DOCKERHUB_IMAGE_TAGS and VERSION + run: | + _VERSION="${{ steps.version.outputs.full_without_prefix }}" + _MAJOR_VERSION="${{ steps.version.outputs.major_without_prefix }}" + _DOCKERHUB_IMAGE_TAGS="$DOCKERHUB_REPOSITORY:$_VERSION-${{ matrix.os }}" + _DOCKERHUB_IMAGE_TAGS+=",$DOCKERHUB_REPOSITORY:$_MAJOR_VERSION-${{ matrix.os }}" + _DOCKERHUB_IMAGE_TAGS+=",$DOCKERHUB_REPOSITORY:${{ matrix.os }}" + if [ "${{ matrix.os }}" == "alpine" ]; then + _DOCKERHUB_IMAGE_TAGS+=",$DOCKERHUB_REPOSITORY:$_VERSION" + _DOCKERHUB_IMAGE_TAGS+=",$DOCKERHUB_REPOSITORY:$_MAJOR_VERSION" + _DOCKERHUB_IMAGE_TAGS+=",$DOCKERHUB_REPOSITORY:latest" + fi + echo "DOCKERHUB_IMAGE_TAGS=$_DOCKERHUB_IMAGE_TAGS" >> $GITHUB_ENV + - name: Set environment DOCKERHUB_IMAGE_PLATFORMS + run: | + _DOCKERHUB_IMAGE_PLATFORMS="linux/amd64" + if [ "${{ matrix.os }}" == "debian" ]; then + _DOCKERHUB_IMAGE_PLATFORMS+=",linux/arm64" + elif [ "${{ matrix.os }}" == "ubuntu" ]; then + _DOCKERHUB_IMAGE_PLATFORMS+=",linux/arm64" + fi + echo "DOCKERHUB_IMAGE_PLATFORMS=$_DOCKERHUB_IMAGE_PLATFORMS" >> $GITHUB_ENV + - name: Build and push + if: env.DOCKERHUB_IMAGE_TAGS != '' + uses: docker/build-push-action@v4 + with: + context: . + file: docker/Dockerfile.${{ matrix.os }} + tags: ${{ env.DOCKERHUB_IMAGE_TAGS }} + platforms: ${{ env.DOCKERHUB_IMAGE_PLATFORMS }} + push: true + build-args: | + TRACCAR_VERSION=${{ steps.version.outputs.full_without_prefix }} + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index a8e4c5369c1..00000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Build Installers - -on: - workflow_dispatch: - inputs: - version: - description: 'Version' - required: true - default: 'preview' - -jobs: - build: - - runs-on: ubuntu-22.04 - - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - submodules: true - - run: git checkout ${{ github.ref_name }} - working-directory: ./traccar-web - - uses: actions/setup-java@v3 - with: - distribution: temurin - java-version: 17 - cache: gradle - - run: ./gradlew build - - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: npm - cache-dependency-path: | - traccar-web/package-lock.json - traccar-web/modern/package-lock.json - - run: | - wget -q https://trials.sencha.com/cmd/7.6.0/SenchaCmd-7.6.0.87-linux-amd64.sh.zip - unzip SenchaCmd-*.zip - ./SenchaCmd-*.sh -q - echo "$HOME/bin/Sencha/Cmd/" >> $GITHUB_PATH - - run: ./traccar-web/tools/package.sh - - run: | - sudo dpkg --add-architecture i386 - sudo apt-get update - sudo apt-get install libgcc-s1:i386 libstdc++6:i386 - sudo apt-get install innoextract makeself wine32 s3cmd - - name: Build installers - working-directory: ./setup - run: | - wget -q http://files.jrsoftware.org/is/5/isetup-5.5.6.exe - wget -q https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.6+10/OpenJDK17U-jdk_x64_windows_hotspot_17.0.6_10.zip - wget -q https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.6+10/OpenJDK17U-jdk_x64_linux_hotspot_17.0.6_10.tar.gz - wget -q https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.6+10/OpenJDK17U-jdk_arm_linux_hotspot_17.0.6_10.tar.gz - wget -q https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.6+10/OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.6_10.tar.gz - ./package.sh ${{ github.event.inputs.version }} - - name: Upload installers - working-directory: ./setup - env: - S3_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }} - S3_SECRET_KEY: ${{ secrets.S3_SECRET_KEY }} - run: s3cmd --acl-public put traccar-*.zip s3://traccar/builds/ --host=nyc3.digitaloceanspaces.com --host-bucket=traccar --access_key="$S3_ACCESS_KEY" --secret_key="$S3_SECRET_KEY" diff --git a/.gitmodules b/.gitmodules index 5e245cc5b17..ad4fe0cd44a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,5 +1,10 @@ +[submodule "track-web"] + path = track-web + url = ../track-web.git + branch = master + ignore = all [submodule "traccar-web"] path = traccar-web - url = ../traccar-web.git + url = ../track-web.git branch = master ignore = all diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000000..62a11dd2260 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +version: "3" + +services: + # mysql: + # image: yobasystems/alpine-mariadb + # restart: always + # volumes: + # - mysql:/var/lib/mysql + # environment: + # - MYSQL_ROOT_PASSWORD=traccar + # - MYSQL_DATABASE=traccar + # - MYSQL_USER=traccar + # - MYSQL_PASSWORD=traccar + # - MYSQL_CHARSET=utf8mb4 + # - MYSQL_COLLATION=utf8mb4_unicode_ci + + builder: + image: ghcr.io/drolx/track-builder:latest + build: + context: docker + dockerfile: Dockerfile.builder + + alpine: + image: ghcr.io/drolx/track:alpine + restart: always + build: + context: . + dockerfile: docker/Dockerfile.alpine + args: + TRACCAR_VERSION: 5.10 + + debian: + image: ghcr.io/drolx/track:debian + restart: always + build: + context: . + dockerfile: docker/Dockerfile.debian + args: + TRACCAR_VERSION: 5.10 + + ubuntu: + image: ghcr.io/drolx/track:ubuntu + restart: always + build: + context: . + dockerfile: docker/Dockerfile.ubuntu + args: + TRACCAR_VERSION: 5.10 + diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.alpine new file mode 100644 index 00000000000..5e001437731 --- /dev/null +++ b/docker/Dockerfile.alpine @@ -0,0 +1,24 @@ +FROM alpine:3 as base +LABEL maintainer="Godwin peter .O " +ARG TRACCAR_VERSION=5.10 +ENV TRACCAR_VERSION=${TRACCAR_VERSION} + +FROM ghcr.io/drolx/track-builder:latest as builder +ARG TRACCAR_VERSION=5.10 +ENV TRACCAR_VERSION=${TRACCAR_VERSION} +WORKDIR /src +COPY . . +RUN ./docker/build.sh $TRACCAR_VERSION + +FROM base as final +WORKDIR /opt/traccar +RUN set -ex && \ + apk add --no-cache --no-progress curl openjdk11-jre-headless +COPY --from=builder /src/setup/traccar-other-$TRACCAR_VERSION.zip /tmp/traccar.zip +RUN unzip -qo /tmp/traccar.zip -d /opt/traccar && \ + rm /tmp/traccar.zip + +HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:8082/ || exit 1 +EXPOSE 8082 +ENTRYPOINT ["java", "-Xms1g", "-Xmx1g", "-Djava.net.preferIPv4Stack=true"] +CMD ["-jar", "tracker-server.jar", "conf/traccar.xml"] diff --git a/docker/Dockerfile.builder b/docker/Dockerfile.builder new file mode 100644 index 00000000000..70f2992ef26 --- /dev/null +++ b/docker/Dockerfile.builder @@ -0,0 +1,32 @@ +FROM docker.io/library/debian:bookworm-slim as base + +FROM docker.io/library/node:18-bookworm-slim AS node + +FROM base as builder +LABEL maintainer="Godwin peter .O " +# Import Node.js binaries +COPY --from=node /usr/lib /usr/lib +COPY --from=node /usr/local/share /usr/local/share +COPY --from=node /usr/local/lib /usr/local/lib +COPY --from=node /usr/local/include /usr/local/include +COPY --from=node /usr/local/bin /usr/local/bin + +RUN apt update && \ + apt upgrade -y && \ + apt install -y wget unzip zip openjdk-17-jdk + +WORKDIR /tmp +# Install sencha tool +RUN wget "https://trials.sencha.com/cmd/7.6.0/SenchaCmd-7.6.0.87-linux-amd64.sh.zip" && \ + unzip SenchaCmd-*.zip && \ + ./SenchaCmd-*.sh -q + +## Set environment +ENV HOME=/root +RUN echo '\n' >> $HOME/.bashrc +RUN echo 'export JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"' >> $HOME/.bashrc +RUN echo 'export PATH="${PATH}:$JAVA_HOME/bin/"' >> $HOME/.bashrc +RUN echo 'export PATH="${PATH}:$HOME/bin/Sencha/Cmd/"' >> $HOME/.bashrc +ENV PATH="${PATH}:$HOME/bin/Sencha/Cmd/" + +RUN rm -rf /tmp/* && apt clean diff --git a/docker/Dockerfile.debian b/docker/Dockerfile.debian new file mode 100644 index 00000000000..ce80f95f0f6 --- /dev/null +++ b/docker/Dockerfile.debian @@ -0,0 +1,31 @@ +FROM debian:bookworm-slim as base +LABEL maintainer="Godwin peter .O " +ARG TRACCAR_VERSION=5.10 +ENV TRACCAR_VERSION=${TRACCAR_VERSION} + +FROM ghcr.io/drolx/track-builder:latest as builder +ARG TRACCAR_VERSION=5.10 +ENV TRACCAR_VERSION=${TRACCAR_VERSION} +WORKDIR /src +COPY . . +RUN ./docker/build.sh $TRACCAR_VERSION + +FROM base as final +WORKDIR /opt/traccar + +RUN set -ex && \ + apt update && \ + apt install -y \ + --no-install-recommends unzip wget curl +RUN apt install -y openjdk-17-jre-headless + +COPY --from=builder /src/setup/traccar-other-$TRACCAR_VERSION.zip /tmp/traccar.zip +RUN unzip -qo /tmp/traccar.zip -d /opt/traccar && \ + apt-get autoremove --yes unzip wget && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* + +HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:8082/ || exit 1 +EXPOSE 8082 +ENTRYPOINT ["java", "-Xms1g", "-Xmx1g", "-Djava.net.preferIPv4Stack=true"] +CMD ["-jar", "tracker-server.jar", "conf/traccar.xml"] diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu new file mode 100644 index 00000000000..8505a221775 --- /dev/null +++ b/docker/Dockerfile.ubuntu @@ -0,0 +1,29 @@ +FROM sapmachine:17-jre-headless-ubuntu-jammy as base +LABEL maintainer="Godwin peter .O " +ARG TRACCAR_VERSION=5.10 +ENV TRACCAR_VERSION=${TRACCAR_VERSION} + +FROM ghcr.io/drolx/track-builder:latest as builder +ARG TRACCAR_VERSION=5.10 +ENV TRACCAR_VERSION=${TRACCAR_VERSION} +WORKDIR /src +COPY . . +RUN ./docker/build.sh $TRACCAR_VERSION + +FROM base as final +WORKDIR /opt/traccar +RUN set -ex && \ + apt update && \ + TERM=xterm DEBIAN_FRONTEND=noninteractive apt install -y \ + --no-install-recommends unzip wget curl + +COPY --from=builder /src/setup/traccar-other-$TRACCAR_VERSION.zip /tmp/traccar.zip +RUN unzip -qo /tmp/traccar.zip -d /opt/traccar && \ + apt autoremove --yes unzip wget && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* + +HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:8082/ || exit 1 +EXPOSE 8082 +ENTRYPOINT ["java", "-Xms1g", "-Xmx1g", "-Djava.net.preferIPv4Stack=true"] +CMD ["-jar", "tracker-server.jar", "conf/traccar.xml"] diff --git a/docker/build.sh b/docker/build.sh new file mode 100755 index 00000000000..199159f2055 --- /dev/null +++ b/docker/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash +TRACCAR_VERSION=${1:-5.10} + +echo "starting build for traccar $TRACCAR_VERSION" + +# Build trccar server +{ + echo 'build server binaries' + ./gradlew build +} + +# Build traccar-web +{ + echo 'build client output...' + ./track-web/tools/package.sh +} + + +# package build outputs +{ + echo 'package build outputs...' + cd setup + ./package.sh $TRACCAR_VERSION other +} diff --git a/setup/package.sh b/setup/package.sh index f8ec927eb36..b2bb5f2b224 100755 --- a/setup/package.sh +++ b/setup/package.sh @@ -91,8 +91,8 @@ prepare () { cp ../target/lib/* out/lib cp ../schema/* out/schema cp -r ../templates/* out/templates - cp -r ../traccar-web/web/* out/legacy - cp -r ../traccar-web/modern/build/* out/modern + cp -r ../track-web/web/* out/legacy + cp -r ../track-web/modern/build/* out/modern cp default.xml out/conf cp traccar.xml out/conf diff --git a/track-web b/track-web new file mode 160000 index 00000000000..7292cd8702c --- /dev/null +++ b/track-web @@ -0,0 +1 @@ +Subproject commit 7292cd8702ca3c19702a562b052d277089d8ddf5