diff --git a/.github/workflows/dispatch-choice.yml b/.github/workflows/dispatch-choice.yml index fe52e6f..eddd893 100644 --- a/.github/workflows/dispatch-choice.yml +++ b/.github/workflows/dispatch-choice.yml @@ -11,9 +11,9 @@ on: - nginx - openjdk - nezha-dashboard + - git-sync - cron - vcards - - vcards-pro - certimate - mysql-dump - dify2openai @@ -76,19 +76,7 @@ jobs: build_args: ${{ github.event.inputs.build_args }} build_platforms: ${{ github.event.inputs.build_platforms || 'linux/amd64,linux/arm64' }} secrets: inherit - - vcards_pro_release: - if: ${{ github.event.inputs.choice_service == 'vcards-pro' }} - uses: ./.github/workflows/release.yml - with: - build_context: './Docker/vcards' - docker_image_name: vcards-pro - docker_file_name: 'Dockerfile.pro' - docker_tags: ${{ github.event.inputs.docker_tags }} - build_args: ${{ github.event.inputs.build_args }} - build_platforms: ${{ github.event.inputs.build_platforms || 'linux/amd64,linux/arm64' }} - secrets: inherit - + env_mock_data_release: if: ${{ github.event.inputs.choice_service == 'env-mock-data' }} uses: ./.github/workflows/release.yml @@ -111,6 +99,17 @@ jobs: build_platforms: ${{ github.event.inputs.build_platforms || 'linux/amd64,linux/arm64,linux/arm64/v8' }} secrets: inherit + git_sync_release: + if: ${{ github.event.inputs.choice_service == 'git-sync' }} + uses: ./.github/workflows/release.yml + with: + build_context: './Docker/git-sync' + docker_image_name: git-sync + docker_tags: ${{ github.event.inputs.docker_tags }} + build_args: ${{ github.event.inputs.build_args }} + build_platforms: ${{ github.event.inputs.build_platforms || 'linux/amd64,linux/arm64,linux/arm/v7' }} + secrets: inherit + openjdk_release: if: ${{ github.event.inputs.choice_service == 'openjdk' }} uses: ./.github/workflows/release.yml diff --git a/.github/workflows/schedule-watch-offical.yml b/.github/workflows/schedule-watch-offical.yml index 2c5407d..2d2e5e6 100644 --- a/.github/workflows/schedule-watch-offical.yml +++ b/.github/workflows/schedule-watch-offical.yml @@ -32,11 +32,22 @@ jobs: uses: ./.github/workflows/check-offical-release.yml with: image_name: one-api + build_context: './Docker/one-api' get_official_version_command: 'curl -s https://api.github.com/repos/songquanpeng/one-api/releases/latest | jq -r ".tag_name // \"no-tags\""' is_latest_tag: true build_platforms: 'linux/amd64' secrets: inherit + watch_git_sync_release: + uses: ./.github/workflows/check-offical-release.yml + with: + image_name: git-sync + build_context: './Docker/git-sync' + get_official_version_command: 'curl -s https://api.github.com/repos/AkashRajpurohit/git-sync/releases/latest | jq -r ".tag_name // \"no-tags\""' + is_latest_tag: true + build_platforms: 'linux/amd64,linux/arm64,linux/arm/v7' + secrets: inherit + watch_nezha_dashboard_release: uses: ./.github/workflows/check-offical-release.yml with: @@ -51,17 +62,7 @@ jobs: uses: ./.github/workflows/check-offical-release.yml with: image_name: vcards - get_official_version_command: 'curl -s https://api.github.com/repos/metowolf/vCards/releases/latest | jq -r ".tag_name // \"no-tags\""' - is_latest_tag: true - build_platforms: 'linux/amd64,linux/arm64' - secrets: inherit - - watch_vcards_pro_release: - uses: ./.github/workflows/check-offical-release.yml - with: - build_context: './Docker/vcards' - image_name: vcards-pro - get_official_version_command: 'curl -s https://api.github.com/repos/funnyzak/vCards/tags | jq -r ".[0].name // \"no-tags\""' + get_official_version_command: 'curl -s https://api.github.com/repos/funnyzak/vCards/releases/latest | jq -r ".tag_name // \"no-tags\""' is_latest_tag: true build_platforms: 'linux/amd64,linux/arm64' secrets: inherit diff --git a/Docker/abracadabra-web/README.md b/Docker/abracadabra-web/README.md index f44ccb0..5ed2b83 100644 --- a/Docker/abracadabra-web/README.md +++ b/Docker/abracadabra-web/README.md @@ -53,4 +53,4 @@ services: **After Startup**: -![Abracadabra_demo](https://cdn.jsdelivr.net/gh/funnyzak/docker-release@main/Docker/abracadabra-web/abracadabra-demo.png) +![Abracadabra_demo](https://github.com/user-attachments/assets/5f9e5806-6372-49ce-9088-cc60bb47ed65) diff --git a/Docker/abracadabra-web/abracadabra-demo.png b/Docker/abracadabra-web/abracadabra-demo.png deleted file mode 100644 index bb3a86f..0000000 Binary files a/Docker/abracadabra-web/abracadabra-demo.png and /dev/null differ diff --git a/Docker/git-sync/Dockerfile b/Docker/git-sync/Dockerfile new file mode 100644 index 0000000..ba0882a --- /dev/null +++ b/Docker/git-sync/Dockerfile @@ -0,0 +1,50 @@ +FROM golang:1.23.4-alpine AS builder + +WORKDIR /go/src/app + +RUN apk update && \ + apk add upx ca-certificates tzdata git + +ARG VERSION +ARG BUILD_DATE +ARG VCS_REF + +ENV GO111MODULE=on \ + CGO_ENABLED=0 \ + GOOS=linux + +RUN git clone https://github.com/AkashRajpurohit/git-sync.git . \ + && git checkout ${VERSION} || git checkout $(git remote show origin | awk '/HEAD branch/ {print $NF}') \ + && echo ${VERSION:-$(git rev-parse --short=12 HEAD)}-$(git log -1 --format=%cd --date=format:'%y%m%d') > VERSION + +RUN go mod download \ + && go mod tidy + +RUN go build -a -installsuffix cgo -ldflags="-w -s -X github.com/AkashRajpurohit/git-sync/pkg/version.Version=${VERSION} -X github.com/AkashRajpurohit/git-sync/pkg/version.Build=${BUILD_DATE}" -o git-sync . \ + && upx -q git-sync + +FROM alpine:latest +WORKDIR /opt/go + +LABEL org.label-schema.name="git-sync" \ + org.label-schema.description="A simple tool to backup and sync your git repositories." \ + org.label-schema.version="${VERSION}" \ + org.label-schema.build-date="${BUILD_DATE}" \ + org.label-schema.vcs-ref="${VCS_REF}" \ + org.label-schema.vendor="Leon" \ + org.label-schema.url="https://github.com/funnyzak/docker-release" + +RUN apk update && \ + apk add git su-exec + +RUN mkdir -p /git-sync /backups + +COPY --from=builder /go/src/app/git-sync /opt/go/git-sync +COPY --from=builder /go/src/app/VERSION /opt/go/VERSION +COPY --from=builder /go/src/app/entrypoint.sh /entrypoint.sh + +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh", "/opt/go/git-sync"] +CMD ["--config", "/git-sync/config.yaml", "--backup-dir", "/backups"] + diff --git a/Docker/git-sync/README.md b/Docker/git-sync/README.md new file mode 100644 index 0000000..24eedbc --- /dev/null +++ b/Docker/git-sync/README.md @@ -0,0 +1,88 @@ +# git-sync + +[![Docker Tags](https://img.shields.io/docker/v/funnyzak/git-sync?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/git-sync/) +[![Image Size](https://img.shields.io/docker/image-size/funnyzak/git-sync)](https://hub.docker.com/r/funnyzak/git-sync/) +[![Docker Stars](https://img.shields.io/docker/stars/funnyzak/git-sync.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/git-sync/) +[![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/git-sync.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/git-sync/) + +`git-sync` is a CLI tool designed to help you back up your Git repositories. This tool ensures you have a local copy of your repositories, safeguarding against potential issues such as account bans or data loss. +. This image supports `linux/amd64`,`linux/arm/v7`, `linux/arm64`. + +You can pull the images using the following commands: + +```bash +docker pull funnyzak/git-sync:latest +# GHCR +docker pull ghcr.io/funnyzak/git-sync:latest +# Aliyun +docker pull registry.cn-beijing.aliyuncs.com/funnyzak/git-sync:latest +``` + +--- + +## Usage Example + +### Docker run + +```bash +docker run \ + --name=git-sync \ + -e PUID=1000 \ + -e PGID=1000 \ + -v ./git-sync/config.yaml:/git-sync/config.yaml \ + -v ./git-backups:/backups \ + funnyzak/git-sync:latest +``` + +### Docker Compose + +```yaml +version: '3' +services: + git-sync: + image: funnyzak/git-sync:latest + container_name: git-sync + environment: + - PUID=1000 + - PGID=1000 + volumes: + - ./git-sync/config.yaml:/git-sync/config.yaml + - ./git-backups:/backups +``` + +### Configuration + +Here is an example of a `config.yaml` file: + +```yaml +# Git Sync Configuration + +# Repository settings +include_forks: false # Include forked repositories +include_wiki: true # Include wiki's +include_repos: [] # Include specific repositories +exclude_repos: [] # Exclude specific repositories +include_orgs: [] # Include repositories from specific organizations +exclude_orgs: [] # Exclude repositories from specific organizations +raw_git_urls: [] # Raw valid git URLs + +# Authentication +username: +tokens: [] + +# Server settings +backup_dir: /path/to/backup +clone_type: bare # Clone type: bare, shallow, mirror or full. Default: bare +cron: 0 0 * * * # run every 24 hours at 00:00 +concurrency: 5 +retry: + count: 3 + delay: 10 # in seconds +platform: github +server: + domain: github.com + protocol: https +``` +More information about the configuration can be found [here](https://github.com/AkashRajpurohit/git-sync/wiki/Configuration). + +More Examples can be found [here](https://github.com/AkashRajpurohit/git-sync/wiki/Examples). \ No newline at end of file diff --git a/Docker/request-hub/README.md b/Docker/request-hub/README.md index 63654cd..11b384b 100644 --- a/Docker/request-hub/README.md +++ b/Docker/request-hub/README.md @@ -90,4 +90,4 @@ services: ## Preview -![preview](./request-hub-demo.jpg) +![preview](https://github.com/user-attachments/assets/a4dacbb9-1131-4db9-a5f3-3d477487a070) diff --git a/Docker/request-hub/request-hub-demo.jpg b/Docker/request-hub/request-hub-demo.jpg deleted file mode 100644 index 05b9e53..0000000 Binary files a/Docker/request-hub/request-hub-demo.jpg and /dev/null differ diff --git a/Docker/vcards/Dockerfile b/Docker/vcards/Dockerfile index f9cefc0..49f0900 100644 --- a/Docker/vcards/Dockerfile +++ b/Docker/vcards/Dockerfile @@ -1,14 +1,14 @@ FROM node:20-alpine3.19 AS builder +ARG VERSION + WORKDIR /app RUN apk add --no-cache git -ARG VERSION - WORKDIR /app -RUN git clone https://github.com/metowolf/vCards . \ +RUN git clone https://github.com/funnyzak/vCards . \ && git checkout ${VERSION} || git checkout $(git remote show origin | awk '/HEAD branch/ {print $NF}') \ && echo ${VERSION:-$(git rev-parse HEAD)} > VERSION @@ -68,7 +68,8 @@ RUN apk add --no-cache \ ENV TZ=Asia/Shanghai ENV DOWNLOAD_DIR="/app/downloads" -ENV REPO_NAME="metowolf/vCards" +ENV REPO_NAME="funnyzak/vCards" +ENV SYNC_ON_STARTUP="true" COPY --from=builder /app/radicale/ /app/vcards/collection-root/cn/ COPY --from=builder /app/VERSION /app/VERSION diff --git a/Docker/vcards/Dockerfile.pro b/Docker/vcards/Dockerfile.pro deleted file mode 100644 index 49f0900..0000000 --- a/Docker/vcards/Dockerfile.pro +++ /dev/null @@ -1,82 +0,0 @@ -FROM node:20-alpine3.19 AS builder - -ARG VERSION - -WORKDIR /app - -RUN apk add --no-cache git - -WORKDIR /app - -RUN git clone https://github.com/funnyzak/vCards . \ - && git checkout ${VERSION} || git checkout $(git remote show origin | awk '/HEAD branch/ {print $NF}') \ - && echo ${VERSION:-$(git rev-parse HEAD)} > VERSION - -RUN yarn && yarn radicale - -FROM alpine:edge - -ARG VERSION -ARG BUILD_DATE -ARG VCS_REF - -LABEL org.label-schema.name="MetoWolf-vCards" \ - org.label-schema.description="MetoWolf-vCards" \ - org.label-schema.version="${VERSION}" \ - org.label-schema.vcs-ref="${VCS_REF}" \ - org.label-schema.build-date="${BUILD_DATE}" \ - org.label-schema.vendor="Leon" \ - org.label-schema.url="https://github.com/funnyzak/docker-release" - -RUN apk add --no-cache \ - radicale unzip curl dcron tzdata jq bash rsync && \ - rm -rf /var/cache/apk/* \ - \ - && { \ - echo '[root]'; \ - echo 'user: .+'; \ - echo 'collection:'; \ - echo 'permissions: R'; \ - echo; \ - echo '[principal]'; \ - echo 'user: .+'; \ - echo 'collection: {user}'; \ - echo 'permissions: R'; \ - echo; \ - echo '[collections]'; \ - echo 'user: .+'; \ - echo 'collection: {user}/[^/]+'; \ - echo 'permissions: rR'; \ - } > /etc/radicale/rights \ - \ - && { \ - echo '[server]'; \ - echo 'hosts = 0.0.0.0:5232, [::]:5232'; \ - echo; \ - echo '[web]'; \ - echo 'type = none'; \ - echo; \ - echo '[storage]'; \ - echo 'type = multifilesystem'; \ - echo 'filesystem_folder = /app/vcards'; \ - echo; \ - echo '[rights]'; \ - echo 'type = from_file'; \ - echo 'file = /etc/radicale/rights'; \ - } > /etc/radicale/config - - -ENV TZ=Asia/Shanghai -ENV DOWNLOAD_DIR="/app/downloads" -ENV REPO_NAME="funnyzak/vCards" -ENV SYNC_ON_STARTUP="true" - -COPY --from=builder /app/radicale/ /app/vcards/collection-root/cn/ -COPY --from=builder /app/VERSION /app/VERSION -COPY /scripts/* /run-scripts/ - -RUN chmod +x /run-scripts/* - -EXPOSE 5232 - -ENTRYPOINT ["/run-scripts/entrypoint.sh"] \ No newline at end of file diff --git a/Docker/vcards/scripts/cron-vcard.sh b/Docker/vcards/scripts/cron-vcards.sh similarity index 64% rename from Docker/vcards/scripts/cron-vcard.sh rename to Docker/vcards/scripts/cron-vcards.sh index ca62c62..01ad6c8 100755 --- a/Docker/vcards/scripts/cron-vcard.sh +++ b/Docker/vcards/scripts/cron-vcards.sh @@ -17,17 +17,18 @@ download_and_sync() { mkdir -p ${DOWNLOAD_DIR}/vcards/${VERSION} - curl -sSL https://github.com/${REPO_NAME}/releases/download/${VERSION}/archive.zip -o ${DOWNLOAD_DIR}/vcards/archive-${VERSION}.zip - unzip -o ${DOWNLOAD_DIR}/vcards/archive-${VERSION}.zip -d ${DOWNLOAD_DIR}/vcards/${VERSION} - if [ -n "$(find ${DOWNLOAD_DIR}/vcards/${VERSION} -name '*.vcf')" ]; then - rsync -a --update ${DOWNLOAD_DIR}/vcards/${VERSION}/* ${VCARD_DIR_PATH} - echo -e "Sync vCards done, $(find ${VCARD_DIR_PATH} -name '*.vcf' | wc -l) files synced." + curl -sSL https://github.com/${REPO_NAME}/releases/download/${VERSION}/radicale.zip -o ${DOWNLOAD_DIR}/vcards/radicale-${VERSION}.zip + unzip -o ${DOWNLOAD_DIR}/vcards/radicale-${VERSION}.zip -d ${DOWNLOAD_DIR}/vcards/${VERSION} + if [ -n "$(find ${DOWNLOAD_DIR}/vcards/${VERSION}/radicale -name '*.vcf')" ]; then + rsync -a --update --exclude='汇总/' ${DOWNLOAD_DIR}/vcards/${VERSION}/radicale/* ${VCARD_DIR_PATH} + echo -e "Sync vCards done, $(find ${VCARD_DIR_PATH} -type d -name '*cache*' -prune -o -type f -name '*.vcf' -print | wc -l) files synced." + echo $VERSION > /app/VERSION else echo -e "${RED}Sync vCards failed, no vcf files found.${NC}" fi } -echo -e "${GREEN}Current vCards: $(find ${VCARD_DIR_PATH} -name '*.vcf' | wc -l) files.${NC}" +echo -e "${GREEN}Current vCards: $(find ${VCARD_DIR_PATH} -type d -name '*cache*' -prune -o -type f -name '*.vcf' -print | wc -l) files.${NC}" echo -e "${GREEN}${REPO_NAME} ${CURRENT_VERSION}, syncing vCards.${NC}" @@ -41,7 +42,6 @@ else else echo -e "${BLUE}Current version: ${CURRENT_VERSION}, latest version: ${LATEST_VERSION}, downloading and syncing.${NC}" download_and_sync $LATEST_VERSION - echo $LATEST_VERSION > /app/VERSION fi fi diff --git a/Docker/vcards/scripts/entrypoint.sh b/Docker/vcards/scripts/entrypoint.sh index 21747b6..1e825db 100755 --- a/Docker/vcards/scripts/entrypoint.sh +++ b/Docker/vcards/scripts/entrypoint.sh @@ -15,7 +15,7 @@ echo -e "${GREEN}Docker Hub: https://hub.docker.com/r/funnyzak/vcards${NC}" echo -e "${GREEN}Repository: https://github.com/${REPO_NAME}${NC}" echo -e "${GREEN}Build via: https://github.com/funnyzak/docker-release${NC}\n" -echo -e "${GREEN}Has vCards: $(find /app/vcards/collection-root/cn -name '*.vcf' | wc -l) files.${NC}\n" +echo -e "${GREEN}Has vCards: $(find /app/vcards/collection-root/cn -type d -name '*cache*' -prune -o -type f -name '*.vcf' -print | wc -l) files.${NC}\n" chmod +x /run-scripts/* @@ -23,7 +23,7 @@ mkdir -p /var/log/radicale /var/log/cron touch /var/log/radicale/radicale.log /var/log/cron/cron.log if [ "$SYNC_ON_STARTUP" == "true" ]; then - /run-scripts/cron-vcard.sh + /run-scripts/cron-vcards.sh fi if [ -n "$SYNC_CRON" ]; then @@ -33,7 +33,7 @@ if [ -n "$SYNC_CRON" ]; then echo -e "\n${GREEN}The vCard will be synchronized according to the following cron expression: ${SYNC_CRON}${NC}" echo -e "${YELLOW}Note: fetch the latest vCards from the repo: https://github.com/${REPO_NAME}${NC}\n" - CRON_STRINGS="$SYNC_CRON /run-scripts/cron-vcard.sh >> /var/log/cron/cron.log 2>&1" + CRON_STRINGS="$SYNC_CRON /run-scripts/cron-vcards.sh >> /var/log/cron/cron.log 2>&1" echo -e "$CRON_STRINGS\n" > /var/spool/cron/crontabs/root chmod 0644 /var/spool/cron/crontabs/root diff --git a/README.md b/README.md index 15b4666..6174505 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ All images are provided with the `latest` and `nightly` tags (if available). For The following images are available: - [**Nginx**](https://github.com/funnyzak/docker-release/tree/main/Docker/nginx): `funnyzak/nginx:latest` ([Docker Hub](https://hub.docker.com/r/funnyzak/nginx)) - [**openjdk**](https://github.com/funnyzak/docker-release/tree/main/Docker/openjdk): `funnyzak/openjdk:latest` ([Docker Hub](https://hub.docker.com/r/funnyzak/openjdk)) +- [**git-sync**](https://github.com/funnyzak/docker-release/tree/main/Docker/git-sync): `funnyzak/git-sync:latest` ([Docker Hub](https://hub.docker.com/r/funnyzak/git-sync)) - [**Snell-Server**](https://github.com/funnyzak/docker-release/tree/main/Docker/snell-server): `funnyzak/snell-server:latest` ([Docker Hub](https://hub.docker.com/r/funnyzak/snell-server)) - [**One-API**](https://github.com/funnyzak/docker-release/tree/main/Docker/one-api): `funnyzak/one-api:latest` ([Docker Hub](https://hub.docker.com/r/funnyzak/one-api)) - [**NeZha-Dashboard**](https://github.com/funnyzak/docker-release/tree/main/Docker/nezha): `funnyzak/nezha-dashboard:latest` ([Docker Hub](https://hub.docker.com/r/funnyzak/nezha-dashboard)) @@ -45,6 +46,7 @@ You can pull the above images from Docker Hub, GitHub Container Registry, or Ali | [Nginx](https://github.com/funnyzak/docker-release/tree/main/Docker/nginx/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/nginx?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/nginx) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/nginx)](https://hub.docker.com/r/funnyzak/nginx) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/nginx.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/nginx) | | [openjdk](https://github.com/funnyzak/docker-release/tree/main/Docker/openjdk/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/openjdk?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/openjdk) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/openjdk)](https://hub.docker.com/r/funnyzak/openjdk) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/openjdk.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/openjdk) | | [Snell-Server](https://github.com/funnyzak/docker-release/tree/main/Docker/snell-server/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/snell-server?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/snell-server) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/snell-server)](https://hub.docker.com/r/funnyzak/snell-server) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/snell-server.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/snell-server) | +| [git-sync](https://github.com/funnyzak/docker-release/tree/main/Docker/git-sync/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/git-sync?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/git-sync) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/git-sync)](https://hub.docker.com/r/funnyzak/git-sync) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/git-sync.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/git-sync) | | [One-API](https://github.com/funnyzak/docker-release/tree/main/Docker/one-api/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/one-api?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/one-api) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/one-api)](https://hub.docker.com/r/funnyzak/one-api) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/one-api.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/one-api) | | [vCards](https://github.com/funnyzak/docker-release/tree/main/Docker/vcards/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/vcards?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/vcards) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/vcards)](https://hub.docker.com/r/funnyzak/vcards) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/vcards.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/vcards) | | [NeZha-Dashboard](https://github.com/funnyzak/docker-release/tree/main/Docker/nezha/README.md) | [![Docker Tag](https://img.shields.io/docker/v/funnyzak/nezha-dashboard?sort=semver&style=flat-square)](https://hub.docker.com/r/funnyzak/nezha-dashboard) | [![Docker Image Size](https://img.shields.io/docker/image-size/funnyzak/nezha-dashboard)](https://hub.docker.com/r/funnyzak/nezha-dashboard) | [![Docker Pulls](https://img.shields.io/docker/pulls/funnyzak/nezha-dashboard.svg?style=flat-square)](https://hub.docker.com/r/funnyzak/nezha-dashboard) | @@ -316,7 +318,7 @@ services: **After Startup**: -![Abracadabra_demo](https://cdn.jsdelivr.net/gh/funnyzak/docker-release@main/Docker/abracadabra-web/abracadabra-demo.png) +![Abracadabra_demo](https://github.com/user-attachments/assets/5f9e5806-6372-49ce-9088-cc60bb47ed65) @@ -415,7 +417,7 @@ services: **After Deployment**: -![Request-Hub](https://cdn.jsdelivr.net/gh/funnyzak/docker-release@main/Docker/request-hub/request-hub-demo.jpg) +![Request-Hub](https://github.com/user-attachments/assets/a4dacbb9-1131-4db9-a5f3-3d477487a070)