From f7318bc870df1b29c48272f328fae5a4d503fc0a Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Wed, 19 Aug 2026 15:28:45 +0900
Subject: [PATCH 01/44] =?UTF-8?q?=F0=9F=94=96=20Bump=20Docker=20image=20ta?=
=?UTF-8?q?gs=20to=201.0.1=20in=20docker-compose.yml?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docker-compose.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 3db6439..741cd43 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -17,7 +17,7 @@ x-app-env: &app-env
services:
mysql:
- image: seoyunje/deepguard-mysql:1.0.0
+ image: seoyunje/deepguard-mysql:1.0.1
container_name: deepguard-mysql
networks: [deepguard-network]
environment:
@@ -29,14 +29,14 @@ services:
- deepguard-data:/var/lib/mysql
redis:
- image: seoyunje/deepguard-redis:1.0.0
+ image: seoyunje/deepguard-redis:1.0.1
container_name: deepguard-redis
networks: [deepguard-network]
volumes:
- deepguard-memory:/data
fastapi:
- image: seoyunje/deepguard-fastapi:1.0.0
+ image: seoyunje/deepguard-fastapi:1.0.1
container_name: deepguard-fastapi
networks: [deepguard-network]
environment:
@@ -49,7 +49,7 @@ services:
- redis
celery:
- image: seoyunje/deepguard-celery:1.0.0
+ image: seoyunje/deepguard-celery:1.0.1
container_name: deepguard-celery
networks: [deepguard-network]
environment:
@@ -62,7 +62,7 @@ services:
- redis
react:
- image: seoyunje/deepguard-react:1.0.0
+ image: seoyunje/deepguard-react:1.0.1
container_name: deepguard-react
networks: [deepguard-network]
ports:
From 6bb4e286a89fe8fbcf243991cdbd45315a0232ca Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Wed, 19 Aug 2026 17:56:29 +0900
Subject: [PATCH 02/44] =?UTF-8?q?=E2=9C=A8=20Stale=20issue/PR=20auto-close?=
=?UTF-8?q?=20workflow?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/stale.yml | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
create mode 100644 .github/workflows/stale.yml
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 0000000..fac62e4
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,33 @@
+name: Close Stale Issues
+
+# 일정 기간 활동 없는 이슈/PR에 stale 라벨을 붙이고, 그 후에도 방치되면 자동으로 닫는다.
+
+on:
+ schedule:
+ - cron: "0 0 * * *" # 매일 UTC 00:00 (KST 09:00) 실행
+ workflow_dispatch:
+
+permissions:
+ issues: write
+ pull-requests: write
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/stale@v11
+ with:
+ days-before-stale: 60
+ days-before-close: 7
+ stale-issue-label: "stale"
+ stale-pr-label: "stale"
+ stale-issue-message: >
+ 이 이슈는 60일 동안 활동이 없어 stale 라벨이 추가되었습니다.
+ 7일 내에 추가 활동이 없으면 자동으로 닫힙니다.
+ stale-pr-message: >
+ 이 PR은 60일 동안 활동이 없어 stale 라벨이 추가되었습니다.
+ 7일 내에 추가 활동이 없으면 자동으로 닫힙니다.
+ close-issue-message: "60일 이상 활동이 없어 자동으로 닫습니다. 필요하면 다시 열어주세요."
+ close-pr-message: "60일 이상 활동이 없어 자동으로 닫습니다. 필요하면 다시 열어주세요."
+ exempt-issue-labels: "pinned,security"
+ exempt-pr-labels: "pinned"
From e1dac9567b1c1ecf98803a4fc4b7c3ec1c97f5d9 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Wed, 19 Aug 2026 17:57:30 +0900
Subject: [PATCH 03/44] =?UTF-8?q?=E2=9C=A8=20Lock-threads=20workflow=20for?=
=?UTF-8?q?=20old=20closed=20issues/PRs?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/lock-threads.yml | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 .github/workflows/lock-threads.yml
diff --git a/.github/workflows/lock-threads.yml b/.github/workflows/lock-threads.yml
new file mode 100644
index 0000000..e8aa43a
--- /dev/null
+++ b/.github/workflows/lock-threads.yml
@@ -0,0 +1,30 @@
+name: Lock Threads
+
+# 오래전에 closed된 이슈/PR을 자동으로 잠가서, 관련 없는 새 댓글(necro-posting)을 방지한다.
+
+on:
+ schedule:
+ - cron: "0 1 * * *" # 매일 UTC 01:00 (KST 10:00) 실행
+ workflow_dispatch:
+
+permissions:
+ issues: write
+ pull-requests: write
+
+jobs:
+ lock:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@v6.0.2
+ with:
+ process-only: "issues, prs"
+ issue-inactive-days: "365"
+ pr-inactive-days: "365"
+ issue-comment: >
+ 이 이슈는 closed된 지 오래되어 자동으로 잠겼습니다.
+ 관련된 새 이슈가 있다면 새로 열어주세요.
+ pr-comment: >
+ 이 PR은 closed된 지 오래되어 자동으로 잠겼습니다.
+ 관련된 새 PR이 있다면 새로 열어주세요.
+ issue-lock-reason: "resolved"
+ pr-lock-reason: "resolved"
From 169a5b0d86bda26d91fe3a425b00dce5c483efbb Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Wed, 19 Aug 2026 17:57:58 +0900
Subject: [PATCH 04/44] =?UTF-8?q?=E2=9C=A8=20First-interaction=20workflow?=
=?UTF-8?q?=20to=20greet=20new=20contributors?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/first-interaction.yml | 27 +++++++++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 .github/workflows/first-interaction.yml
diff --git a/.github/workflows/first-interaction.yml b/.github/workflows/first-interaction.yml
new file mode 100644
index 0000000..ebb3b88
--- /dev/null
+++ b/.github/workflows/first-interaction.yml
@@ -0,0 +1,27 @@
+name: First interaction
+
+# 처음 이슈/PR을 남기는 기여자에게 자동으로 환영 댓글을 남긴다.
+
+on:
+ issues:
+ types: [opened]
+ pull_request_target:
+ types: [opened]
+
+permissions:
+ issues: write
+ pull-requests: write
+
+jobs:
+ greeting:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/first-interaction@v3.1.0
+ with:
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
+ issue_message: >
+ 이슈를 남겨주셔서 감사합니다. 첫 이슈네요.
+ 메인테이너가 확인 후 곧 답변드리겠습니다.
+ pr_message: >
+ PR을 열어주셔서 감사합니다. 첫 PR이네요.
+ 리뷰 후 피드백 남기겠습니다.
From 244004cf2ed10e722df736a181319ea876d40e07 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 09:31:10 +0900
Subject: [PATCH 05/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Split=20docker-bump-?=
=?UTF-8?q?and-push.yml=20into=20per-service=20workflows?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/docker-build-check.yml | 105 ++++++++++------
.github/workflows/docker-bump-and-push.yml | 126 -------------------
.github/workflows/docker-bump-push-app.yml | 65 ++++++++++
.github/workflows/docker-bump-push-mysql.yml | 48 +++++++
.github/workflows/docker-bump-push-react.yml | 47 +++++++
.github/workflows/docker-bump-push-redis.yml | 47 +++++++
6 files changed, 272 insertions(+), 166 deletions(-)
delete mode 100644 .github/workflows/docker-bump-and-push.yml
create mode 100644 .github/workflows/docker-bump-push-app.yml
create mode 100644 .github/workflows/docker-bump-push-mysql.yml
create mode 100644 .github/workflows/docker-bump-push-react.yml
create mode 100644 .github/workflows/docker-bump-push-redis.yml
diff --git a/.github/workflows/docker-build-check.yml b/.github/workflows/docker-build-check.yml
index b07f70d..e6dbd65 100644
--- a/.github/workflows/docker-build-check.yml
+++ b/.github/workflows/docker-build-check.yml
@@ -4,10 +4,19 @@ on:
pull_request:
branches: [main, develop]
paths:
- - "App/Dockerfile"
- - "client/Dockerfile"
- - "docker/mysql/Dockerfile"
- - "docker/redis/Dockerfile"
+ # fastapi / celery (App/Dockerfile이 COPY하는 대상)
+ - "App/**"
+ - "requirements.txt"
+ - "deepguard/**"
+ - "inference/**"
+ - "explainability/**"
+ - "preprocess/**"
+ - "pyproject.toml"
+ # react (client/Dockerfile이 COPY하는 대상)
+ - "client/**"
+ # mysql / redis
+ - "docker/mysql/**"
+ - "docker/redis/**"
permissions:
contents: read
@@ -19,67 +28,83 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- - name: Detect changed Dockerfiles
+ - name: Detect changed sources
id: changes
uses: dorny/paths-filter@v3
with:
filters: |
app:
- - 'App/Dockerfile'
+ - 'App/**'
+ - 'requirements.txt'
+ - 'deepguard/**'
+ - 'inference/**'
+ - 'explainability/**'
+ - 'preprocess/**'
+ - 'pyproject.toml'
client:
- - 'client/Dockerfile'
+ - 'client/**'
mysql:
- - 'docker/mysql/Dockerfile'
+ - 'docker/mysql/**'
+ - 'App/sql/**'
redis:
- - 'docker/redis/Dockerfile'
+ - 'docker/redis/**'
- name: Set up Docker Buildx
if: steps.changes.outputs.app == 'true' || steps.changes.outputs.client == 'true' || steps.changes.outputs.mysql == 'true' || steps.changes.outputs.redis == 'true'
uses: docker/setup-buildx-action@v3
# ── fastapi + celery (App/Dockerfile) ────────────────────────────────────
- - name: Build fastapi/celery (validate only)
+ - name: Build fastapi (validate only)
if: steps.changes.outputs.app == 'true'
- run: |
- set -euo pipefail
- docker buildx build \
- --target fastapi \
- --cache-from type=gha,scope=fastapi \
- --cache-to type=gha,mode=max,scope=fastapi \
- -f App/Dockerfile .
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: App/Dockerfile
+ target: fastapi
+ push: false
+ cache-from: type=gha,scope=fastapi
+ cache-to: type=gha,mode=max,scope=fastapi
- docker buildx build \
- --target celery \
- --cache-from type=gha,scope=celery \
- --cache-to type=gha,mode=max,scope=celery \
- -f App/Dockerfile .
+ - name: Build celery (validate only)
+ if: steps.changes.outputs.app == 'true'
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: App/Dockerfile
+ target: celery
+ push: false
+ cache-from: type=gha,scope=celery
+ cache-to: type=gha,mode=max,scope=celery
# ── react (client/Dockerfile) ─────────────────────────────────────────────
- name: Build react (validate only)
if: steps.changes.outputs.client == 'true'
- run: |
- set -euo pipefail
- docker buildx build \
- --cache-from type=gha,scope=react \
- --cache-to type=gha,mode=max,scope=react \
- -f client/Dockerfile client
+ uses: docker/build-push-action@v7
+ with:
+ context: client
+ file: client/Dockerfile
+ push: false
+ cache-from: type=gha,scope=react
+ cache-to: type=gha,mode=max,scope=react
# ── mysql (docker/mysql/Dockerfile) ───────────────────────────────────────
- name: Build mysql (validate only)
if: steps.changes.outputs.mysql == 'true'
- run: |
- set -euo pipefail
- docker buildx build \
- --cache-from type=gha,scope=mysql \
- --cache-to type=gha,mode=max,scope=mysql \
- -f docker/mysql/Dockerfile .
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: docker/mysql/Dockerfile
+ push: false
+ cache-from: type=gha,scope=mysql
+ cache-to: type=gha,mode=max,scope=mysql
# ── redis (docker/redis/Dockerfile) ───────────────────────────────────────
- name: Build redis (validate only)
if: steps.changes.outputs.redis == 'true'
- run: |
- set -euo pipefail
- docker buildx build \
- --cache-from type=gha,scope=redis \
- --cache-to type=gha,mode=max,scope=redis \
- -f docker/redis/Dockerfile .
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: docker/redis/Dockerfile
+ push: false
+ cache-from: type=gha,scope=redis
+ cache-to: type=gha,mode=max,scope=redis
diff --git a/.github/workflows/docker-bump-and-push.yml b/.github/workflows/docker-bump-and-push.yml
deleted file mode 100644
index 57cb4bc..0000000
--- a/.github/workflows/docker-bump-and-push.yml
+++ /dev/null
@@ -1,126 +0,0 @@
-name: Docker Image Bump & Push
-
-# Dockerfile이 main에 push되면 해당 이미지를 새 patch 버전 태그로 빌드해 Docker Hub에 푸시한다.
-# docker-compose.yml의 태그 갱신은 각 build step 로그에 찍히는 새 태그를 보고 수동으로 반영한다.
-
-on:
- push:
- branches: [main]
- paths:
- - "App/Dockerfile"
- - "client/Dockerfile"
- - "docker/mysql/Dockerfile"
- - "docker/redis/Dockerfile"
- workflow_dispatch:
-
-env:
- DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
-
-jobs:
- bump-and-push:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Detect changed Dockerfiles
- id: changes
- uses: dorny/paths-filter@v3
- with:
- filters: |
- app:
- - 'App/Dockerfile'
- client:
- - 'client/Dockerfile'
- mysql:
- - 'docker/mysql/Dockerfile'
- redis:
- - 'docker/redis/Dockerfile'
-
- - name: Set up Docker Buildx
- if: steps.changes.outputs.app == 'true' || steps.changes.outputs.client == 'true' || steps.changes.outputs.mysql == 'true' || steps.changes.outputs.redis == 'true'
- uses: docker/setup-buildx-action@v3
-
- - name: Log in to Docker Hub
- if: steps.changes.outputs.app == 'true' || steps.changes.outputs.client == 'true' || steps.changes.outputs.mysql == 'true' || steps.changes.outputs.redis == 'true'
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- # ── fastapi + celery (App/Dockerfile, 같은 버전으로 동시 bump) ──────────────
- - name: Bump & build fastapi/celery
- if: steps.changes.outputs.app == 'true'
- run: |
- set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-fastapi:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
- IFS='.' read -r major minor patch <<< "$current"
- new_tag="${major}.${minor}.$((patch + 1))"
- echo "fastapi/celery: ${current} -> ${new_tag}"
-
- docker buildx build \
- --target fastapi \
- --tag "${DOCKERHUB_NAMESPACE}/deepguard-fastapi:${new_tag}" \
- --cache-from type=gha,scope=fastapi \
- --cache-to type=gha,mode=max,scope=fastapi \
- --push \
- -f App/Dockerfile .
-
- docker buildx build \
- --target celery \
- --tag "${DOCKERHUB_NAMESPACE}/deepguard-celery:${new_tag}" \
- --cache-from type=gha,scope=celery \
- --cache-to type=gha,mode=max,scope=celery \
- --push \
- -f App/Dockerfile .
-
- # ── react (client/Dockerfile) ────────────────────────────────────────────
- - name: Bump & build react
- if: steps.changes.outputs.client == 'true'
- run: |
- set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-react:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
- IFS='.' read -r major minor patch <<< "$current"
- new_tag="${major}.${minor}.$((patch + 1))"
- echo "react: ${current} -> ${new_tag}"
-
- docker buildx build \
- --tag "${DOCKERHUB_NAMESPACE}/deepguard-react:${new_tag}" \
- --cache-from type=gha,scope=react \
- --cache-to type=gha,mode=max,scope=react \
- --push \
- -f client/Dockerfile client
-
- # ── mysql (docker/mysql/Dockerfile) ──────────────────────────────────────
- - name: Bump & build mysql
- if: steps.changes.outputs.mysql == 'true'
- run: |
- set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-mysql:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
- IFS='.' read -r major minor patch <<< "$current"
- new_tag="${major}.${minor}.$((patch + 1))"
- echo "mysql: ${current} -> ${new_tag}"
-
- docker buildx build \
- --tag "${DOCKERHUB_NAMESPACE}/deepguard-mysql:${new_tag}" \
- --cache-from type=gha,scope=mysql \
- --cache-to type=gha,mode=max,scope=mysql \
- --push \
- -f docker/mysql/Dockerfile .
-
- # ── redis (docker/redis/Dockerfile) ──────────────────────────────────────
- - name: Bump & build redis
- if: steps.changes.outputs.redis == 'true'
- run: |
- set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-redis:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
- IFS='.' read -r major minor patch <<< "$current"
- new_tag="${major}.${minor}.$((patch + 1))"
- echo "redis: ${current} -> ${new_tag}"
-
- docker buildx build \
- --tag "${DOCKERHUB_NAMESPACE}/deepguard-redis:${new_tag}" \
- --cache-from type=gha,scope=redis \
- --cache-to type=gha,mode=max,scope=redis \
- --push \
- -f docker/redis/Dockerfile .
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
new file mode 100644
index 0000000..ffab18a
--- /dev/null
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -0,0 +1,65 @@
+name: Docker Bump & Push - FastAPI/Celery
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - "App/**"
+ - "requirements.txt"
+ - "deepguard/**"
+ - "inference/**"
+ - "explainability/**"
+ - "preprocess/**"
+ - "pyproject.toml"
+ workflow_dispatch:
+
+env:
+ DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+
+jobs:
+ bump-and-push:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Compute new tag
+ id: bump
+ run: |
+ set -euo pipefail
+ current=$(grep -oP "seoyunje/deepguard-fastapi:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+ IFS='.' read -r major minor patch <<< "$current"
+ new_tag="${major}.${minor}.$((patch + 1))"
+ echo "fastapi/celery: ${current} -> ${new_tag}"
+ echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
+
+ - name: Build & push fastapi
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: App/Dockerfile
+ target: fastapi
+ tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-fastapi:${{ steps.bump.outputs.new_tag }}
+ push: true
+ cache-from: type=gha,scope=fastapi
+ cache-to: type=gha,mode=max,scope=fastapi
+
+ - name: Build & push celery
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: App/Dockerfile
+ target: celery
+ tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-celery:${{ steps.bump.outputs.new_tag }}
+ push: true
+ cache-from: type=gha,scope=celery
+ cache-to: type=gha,mode=max,scope=celery
diff --git a/.github/workflows/docker-bump-push-mysql.yml b/.github/workflows/docker-bump-push-mysql.yml
new file mode 100644
index 0000000..11d4141
--- /dev/null
+++ b/.github/workflows/docker-bump-push-mysql.yml
@@ -0,0 +1,48 @@
+name: Docker Bump & Push - MySQL
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - "docker/mysql/**"
+ - "App/sql/**"
+ workflow_dispatch:
+
+env:
+ DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+
+jobs:
+ bump-and-push:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Compute new tag
+ id: bump
+ run: |
+ set -euo pipefail
+ current=$(grep -oP "seoyunje/deepguard-mysql:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+ IFS='.' read -r major minor patch <<< "$current"
+ new_tag="${major}.${minor}.$((patch + 1))"
+ echo "mysql: ${current} -> ${new_tag}"
+ echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
+
+ - name: Build & push mysql
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: docker/mysql/Dockerfile
+ tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-mysql:${{ steps.bump.outputs.new_tag }}
+ push: true
+ cache-from: type=gha,scope=mysql
+ cache-to: type=gha,mode=max,scope=mysql
diff --git a/.github/workflows/docker-bump-push-react.yml b/.github/workflows/docker-bump-push-react.yml
new file mode 100644
index 0000000..0115fa7
--- /dev/null
+++ b/.github/workflows/docker-bump-push-react.yml
@@ -0,0 +1,47 @@
+name: Docker Bump & Push - React
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - "client/**"
+ workflow_dispatch:
+
+env:
+ DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+
+jobs:
+ bump-and-push:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Compute new tag
+ id: bump
+ run: |
+ set -euo pipefail
+ current=$(grep -oP "seoyunje/deepguard-react:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+ IFS='.' read -r major minor patch <<< "$current"
+ new_tag="${major}.${minor}.$((patch + 1))"
+ echo "react: ${current} -> ${new_tag}"
+ echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
+
+ - name: Build & push react
+ uses: docker/build-push-action@v7
+ with:
+ context: client
+ file: client/Dockerfile
+ tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-react:${{ steps.bump.outputs.new_tag }}
+ push: true
+ cache-from: type=gha,scope=react
+ cache-to: type=gha,mode=max,scope=react
diff --git a/.github/workflows/docker-bump-push-redis.yml b/.github/workflows/docker-bump-push-redis.yml
new file mode 100644
index 0000000..f1bf669
--- /dev/null
+++ b/.github/workflows/docker-bump-push-redis.yml
@@ -0,0 +1,47 @@
+name: Docker Bump & Push - Redis
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - "docker/redis/**"
+ workflow_dispatch:
+
+env:
+ DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+
+jobs:
+ bump-and-push:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Compute new tag
+ id: bump
+ run: |
+ set -euo pipefail
+ current=$(grep -oP "seoyunje/deepguard-redis:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+ IFS='.' read -r major minor patch <<< "$current"
+ new_tag="${major}.${minor}.$((patch + 1))"
+ echo "redis: ${current} -> ${new_tag}"
+ echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
+
+ - name: Build & push redis
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ file: docker/redis/Dockerfile
+ tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-redis:${{ steps.bump.outputs.new_tag }}
+ push: true
+ cache-from: type=gha,scope=redis
+ cache-to: type=gha,mode=max,scope=redis
From a52524f487e49f64649f482c1c48d714b8407677 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 09:40:22 +0900
Subject: [PATCH 06/44] =?UTF-8?q?=F0=9F=94=A5=20Remove=20orphaned=20labele?=
=?UTF-8?q?r.yml=20config?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/labeler.yml | 31 -------------------------------
1 file changed, 31 deletions(-)
delete mode 100644 .github/labeler.yml
diff --git a/.github/labeler.yml b/.github/labeler.yml
deleted file mode 100644
index 8f69fee..0000000
--- a/.github/labeler.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-model:
- - changed-files:
- - any-glob-to-any-file: ["src/model/**", "models/**", "*.pt", "*.pth"]
-
-data:
- - changed-files:
- - any-glob-to-any-file: ["data/**", "datasets/**", "src/data/**"]
-
-training:
- - changed-files:
- - any-glob-to-any-file: ["train*.py", "src/train/**", "configs/**"]
-
-api:
- - changed-files:
- - any-glob-to-any-file: ["api/**", "routers/**", "app.py"]
-
-test:
- - changed-files:
- - any-glob-to-any-file: ["tests/**", "test_*.py"]
-
-docs:
- - changed-files:
- - any-glob-to-any-file: ["docs/**", "*.md", "*.rst"]
-
-ci:
- - changed-files:
- - any-glob-to-any-file: [".github/**"]
-
-dependencies:
- - changed-files:
- - any-glob-to-any-file: ["requirements*.txt", "pyproject.toml", "setup.py"]
\ No newline at end of file
From 0165da8cabc54796d11f12596c3830740daf6970 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 09:41:27 +0900
Subject: [PATCH 07/44] =?UTF-8?q?=E2=9C=A8=20Add=20Dependabot=20config=20f?=
=?UTF-8?q?or=20pip/npm/docker/github-actions?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/dependabot.yml | 45 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
create mode 100644 .github/dependabot.yml
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..6046dc7
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,45 @@
+version: 2
+updates:
+ # Python (requirements.txt, pyproject.toml)
+ - package-ecosystem: "pip"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+
+ # React frontend (client/package.json)
+ - package-ecosystem: "npm"
+ directory: "/client"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+
+ # GitHub Actions workflows
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+
+ # Docker base image - FastAPI/Celery
+ - package-ecosystem: "docker"
+ directory: "/App"
+ schedule:
+ interval: "weekly"
+
+ # Docker base image - React/Nginx
+ - package-ecosystem: "docker"
+ directory: "/client"
+ schedule:
+ interval: "weekly"
+
+ # Docker base image - MySQL
+ - package-ecosystem: "docker"
+ directory: "/docker/mysql"
+ schedule:
+ interval: "weekly"
+
+ # Docker base image - Redis
+ - package-ecosystem: "docker"
+ directory: "/docker/redis"
+ schedule:
+ interval: "weekly"
From 68de79dc154a3f2a7803c9f4d5520d69b2ce2f06 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:42:58 +0000
Subject: [PATCH 08/44] Bump redis from 7.4-alpine to 8.10-alpine in
/docker/redis
Bumps redis from 7.4-alpine to 8.10-alpine.
---
updated-dependencies:
- dependency-name: redis
dependency-version: 8.10-alpine
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
docker/redis/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker/redis/Dockerfile b/docker/redis/Dockerfile
index 06629f2..40017a1 100644
--- a/docker/redis/Dockerfile
+++ b/docker/redis/Dockerfile
@@ -1,4 +1,4 @@
-FROM redis:7.4-alpine
+FROM redis:8.10-alpine
COPY docker/redis/config/redis.conf /usr/local/etc/redis/redis.conf
From 7a2859d7411e09a13a1048efc07ef69317fb44dc Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:42:59 +0000
Subject: [PATCH 09/44] Bump mysql from 9.5-oraclelinux9 to 26.7-oraclelinux9
in /docker/mysql
Bumps mysql from 9.5-oraclelinux9 to 26.7-oraclelinux9.
---
updated-dependencies:
- dependency-name: mysql
dependency-version: 26.7-oraclelinux9
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
docker/mysql/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker/mysql/Dockerfile b/docker/mysql/Dockerfile
index 3bcec60..49abf57 100644
--- a/docker/mysql/Dockerfile
+++ b/docker/mysql/Dockerfile
@@ -1,4 +1,4 @@
-FROM mysql:9.5-oraclelinux9
+FROM mysql:26.7-oraclelinux9
COPY App/sql/*.sql /docker-entrypoint-initdb.d/
From aea588504ed26b07f516339a742d6b1d7b4836c2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:08 +0000
Subject: [PATCH 10/44] Bump docker/login-action from 3 to 4
Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3...v4)
---
updated-dependencies:
- dependency-name: docker/login-action
dependency-version: '4'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/docker-bump-push-app.yml | 2 +-
.github/workflows/docker-bump-push-mysql.yml | 2 +-
.github/workflows/docker-bump-push-react.yml | 2 +-
.github/workflows/docker-bump-push-redis.yml | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
index ffab18a..da2439e 100644
--- a/.github/workflows/docker-bump-push-app.yml
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -27,7 +27,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
diff --git a/.github/workflows/docker-bump-push-mysql.yml b/.github/workflows/docker-bump-push-mysql.yml
index 11d4141..a0d4b80 100644
--- a/.github/workflows/docker-bump-push-mysql.yml
+++ b/.github/workflows/docker-bump-push-mysql.yml
@@ -22,7 +22,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
diff --git a/.github/workflows/docker-bump-push-react.yml b/.github/workflows/docker-bump-push-react.yml
index 0115fa7..ac1c811 100644
--- a/.github/workflows/docker-bump-push-react.yml
+++ b/.github/workflows/docker-bump-push-react.yml
@@ -21,7 +21,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
diff --git a/.github/workflows/docker-bump-push-redis.yml b/.github/workflows/docker-bump-push-redis.yml
index f1bf669..a7ce956 100644
--- a/.github/workflows/docker-bump-push-redis.yml
+++ b/.github/workflows/docker-bump-push-redis.yml
@@ -21,7 +21,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
- uses: docker/login-action@v3
+ uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
From 309ad491809bd91e72facfd718750f061d96c4ef Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:13 +0000
Subject: [PATCH 11/44] Bump dorny/paths-filter from 3 to 4
Bumps [dorny/paths-filter](https://github.com/dorny/paths-filter) from 3 to 4.
- [Release notes](https://github.com/dorny/paths-filter/releases)
- [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dorny/paths-filter/compare/v3...v4)
---
updated-dependencies:
- dependency-name: dorny/paths-filter
dependency-version: '4'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/docker-build-check.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/docker-build-check.yml b/.github/workflows/docker-build-check.yml
index e6dbd65..72e5aaa 100644
--- a/.github/workflows/docker-build-check.yml
+++ b/.github/workflows/docker-build-check.yml
@@ -30,7 +30,7 @@ jobs:
- name: Detect changed sources
id: changes
- uses: dorny/paths-filter@v3
+ uses: dorny/paths-filter@v4
with:
filters: |
app:
From 3e50d2e0e33b9a636934bfbf9d7cb2aef41fa4aa Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:20 +0000
Subject: [PATCH 12/44] Update torchvision requirement from >=0.25.0 to
>=0.28.0
Updates the requirements on [torchvision](https://github.com/pytorch/vision) to permit the latest version.
- [Release notes](https://github.com/pytorch/vision/releases)
- [Commits](https://github.com/pytorch/vision/compare/v0.25.0...v0.28.0)
---
updated-dependencies:
- dependency-name: torchvision
dependency-version: 0.28.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index e4bb2ea..e980320 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -31,7 +31,7 @@ albumentations>=2.0.8
# --- [Deep Learning Framework] ---
torch>=2.10.0
-torchvision>=0.25.0
+torchvision>=0.28.0
torchmetrics>=1.6.1
timm>=1.0.12
ultralytics>=8.4.41
From 82520fcecf9190492bbe6caf5e192f60d39ed537 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:23 +0000
Subject: [PATCH 13/44] Update redis requirement from >=7.4.0 to >=8.1.0
Updates the requirements on [redis](https://github.com/redis/redis-py) to permit the latest version.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v7.4.0...v8.1.0)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 8.1.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index e4bb2ea..7429b2a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,7 +12,7 @@ sqlalchemy>=2.0.48
pymysql>=1.1.2
aiomysql>=0.3.2
mysql-connector-python>=9.6.0
-redis>=7.4.0
+redis>=8.1.0
# --- [Security & Auth] ---
bcrypt==4.0.1 # pinned: passlib 1.7.4 breaks on bcrypt>=4.1 (72-byte length check regression)
From 93b3e2fa214d79053a36549f642c18064cdcaa7e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:30 +0000
Subject: [PATCH 14/44] Update matplotlib requirement from >=3.10.0 to >=3.10.9
Updates the requirements on [matplotlib](https://github.com/matplotlib/matplotlib) to permit the latest version.
- [Release notes](https://github.com/matplotlib/matplotlib/releases)
- [Commits](https://github.com/matplotlib/matplotlib/compare/v3.10.0...v3.10.9)
---
updated-dependencies:
- dependency-name: matplotlib
dependency-version: 3.10.9
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index e4bb2ea..2a62497 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -38,7 +38,7 @@ ultralytics>=8.4.41
grad-cam>=1.5.5
# --- [Visualization & Utilities] ---
-matplotlib>=3.10.0
+matplotlib>=3.10.9
seaborn>=0.13.2
colorama>=0.4.6
From 564543a51cae6058615f0e7252c17f9f71930cd7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:37 +0000
Subject: [PATCH 15/44] Update sqlalchemy requirement from >=2.0.48 to >=2.0.52
Updates the requirements on [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) to permit the latest version.
- [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases)
- [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst)
- [Commits](https://github.com/sqlalchemy/sqlalchemy/commits)
---
updated-dependencies:
- dependency-name: sqlalchemy
dependency-version: 2.0.52
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index e4bb2ea..5a30c0a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,7 +8,7 @@ itsdangerous>=2.2.0
python-dotenv>=0.9.9
# --- [Database & ORM] ---
-sqlalchemy>=2.0.48
+sqlalchemy>=2.0.52
pymysql>=1.1.2
aiomysql>=0.3.2
mysql-connector-python>=9.6.0
From 312dedd6b416d0a7c82e71c751e214e076b5782d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:43:42 +0000
Subject: [PATCH 16/44] Update opencv-python requirement from >=4.11.0 to
>=5.0.0.93
Updates the requirements on [opencv-python](https://github.com/opencv/opencv-python) to permit the latest version.
- [Release notes](https://github.com/opencv/opencv-python/releases)
- [Commits](https://github.com/opencv/opencv-python/commits)
---
updated-dependencies:
- dependency-name: opencv-python
dependency-version: 5.0.0.93
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index e4bb2ea..3d10659 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -25,7 +25,7 @@ pandas>=2.2.3
scikit-learn>=1.6.1
# --- [Computer Vision & Image Processing] ---
-opencv-python>=4.11.0
+opencv-python>=5.0.0.93
Pillow>=11.1.0
albumentations>=2.0.8
From 3ce5891cdd99c58c57a05194397178184d816514 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:44:11 +0000
Subject: [PATCH 17/44] Bump node from 20.18-alpine to 26.7-alpine in /client
Bumps node from 20.18-alpine to 26.7-alpine.
---
updated-dependencies:
- dependency-name: node
dependency-version: 26.7-alpine
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
client/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/Dockerfile b/client/Dockerfile
index 67593b3..6deb4e2 100644
--- a/client/Dockerfile
+++ b/client/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20.18-alpine AS build
+FROM node:26.7-alpine AS build
WORKDIR /app
From 39fdfc913fb3a038e11929d6a26f27a2021f4212 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 00:44:15 +0000
Subject: [PATCH 18/44] Bump nginx from 1.27-alpine to 1.30-alpine in /client
Bumps nginx from 1.27-alpine to 1.30-alpine.
---
updated-dependencies:
- dependency-name: nginx
dependency-version: 1.30-alpine
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
client/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/Dockerfile b/client/Dockerfile
index 67593b3..b5a025b 100644
--- a/client/Dockerfile
+++ b/client/Dockerfile
@@ -9,7 +9,7 @@ COPY . .
ENV GENERATE_SOURCEMAP=false
RUN npm run build
-FROM nginx:1.27-alpine
+FROM nginx:1.30-alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
From 57e6511916f16977d181ea5973e7604a6bb6167a Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 10:11:48 +0900
Subject: [PATCH 19/44] =?UTF-8?q?=F0=9F=90=9B=20Read=20latest=20tag=20from?=
=?UTF-8?q?=20Docker=20Hub=20instead=20of=20docker-compose.yml?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/docker-bump-push-app.yml | 18 +++++++++++++++---
.github/workflows/docker-bump-push-mysql.yml | 15 ++++++++++++---
.github/workflows/docker-bump-push-react.yml | 15 ++++++++++++---
.github/workflows/docker-bump-push-redis.yml | 15 ++++++++++++---
4 files changed, 51 insertions(+), 12 deletions(-)
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
index ffab18a..42bb95b 100644
--- a/.github/workflows/docker-bump-push-app.yml
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -32,14 +32,26 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Compute new tag
+ - name: Compute new tag from Docker Hub
id: bump
run: |
set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-fastapi:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+
+ get_latest_tag() {
+ local repo="$1"
+ local token tags_json
+ token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${DOCKERHUB_NAMESPACE}/${repo}:pull" | python3 -c "import json,sys;print(json.load(sys.stdin).get('token',''))")
+ tags_json=$(curl -s -H "Authorization: Bearer ${token}" "https://registry-1.docker.io/v2/${DOCKERHUB_NAMESPACE}/${repo}/tags/list")
+ echo "$tags_json" | python3 -c "import json,sys; d=json.load(sys.stdin); v=sorted(tuple(int(p) for p in t.split('.')) for t in (d.get('tags') or []) if len(t.split('.'))==3 and all(p.isdigit() for p in t.split('.'))); print('%d.%d.%d'%v[-1] if v else '1.0.0')"
+ }
+
+ current_fastapi=$(get_latest_tag "deepguard-fastapi")
+ current_celery=$(get_latest_tag "deepguard-celery")
+ current=$(printf '%s\n%s\n' "$current_fastapi" "$current_celery" | sort -V | tail -1)
+
IFS='.' read -r major minor patch <<< "$current"
new_tag="${major}.${minor}.$((patch + 1))"
- echo "fastapi/celery: ${current} -> ${new_tag}"
+ echo "fastapi/celery: 현재 최댓값 ${current} -> ${new_tag}"
echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
- name: Build & push fastapi
diff --git a/.github/workflows/docker-bump-push-mysql.yml b/.github/workflows/docker-bump-push-mysql.yml
index 11d4141..7a61d8f 100644
--- a/.github/workflows/docker-bump-push-mysql.yml
+++ b/.github/workflows/docker-bump-push-mysql.yml
@@ -27,14 +27,23 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Compute new tag
+ - name: Compute new tag from Docker Hub
id: bump
run: |
set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-mysql:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+
+ get_latest_tag() {
+ local repo="$1"
+ local token tags_json
+ token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${DOCKERHUB_NAMESPACE}/${repo}:pull" | python3 -c "import json,sys;print(json.load(sys.stdin).get('token',''))")
+ tags_json=$(curl -s -H "Authorization: Bearer ${token}" "https://registry-1.docker.io/v2/${DOCKERHUB_NAMESPACE}/${repo}/tags/list")
+ echo "$tags_json" | python3 -c "import json,sys; d=json.load(sys.stdin); v=sorted(tuple(int(p) for p in t.split('.')) for t in (d.get('tags') or []) if len(t.split('.'))==3 and all(p.isdigit() for p in t.split('.'))); print('%d.%d.%d'%v[-1] if v else '1.0.0')"
+ }
+
+ current=$(get_latest_tag "deepguard-mysql")
IFS='.' read -r major minor patch <<< "$current"
new_tag="${major}.${minor}.$((patch + 1))"
- echo "mysql: ${current} -> ${new_tag}"
+ echo "mysql: 현재 최댓값 ${current} -> ${new_tag}"
echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
- name: Build & push mysql
diff --git a/.github/workflows/docker-bump-push-react.yml b/.github/workflows/docker-bump-push-react.yml
index 0115fa7..acd2017 100644
--- a/.github/workflows/docker-bump-push-react.yml
+++ b/.github/workflows/docker-bump-push-react.yml
@@ -26,14 +26,23 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Compute new tag
+ - name: Compute new tag from Docker Hub
id: bump
run: |
set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-react:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+
+ get_latest_tag() {
+ local repo="$1"
+ local token tags_json
+ token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${DOCKERHUB_NAMESPACE}/${repo}:pull" | python3 -c "import json,sys;print(json.load(sys.stdin).get('token',''))")
+ tags_json=$(curl -s -H "Authorization: Bearer ${token}" "https://registry-1.docker.io/v2/${DOCKERHUB_NAMESPACE}/${repo}/tags/list")
+ echo "$tags_json" | python3 -c "import json,sys; d=json.load(sys.stdin); v=sorted(tuple(int(p) for p in t.split('.')) for t in (d.get('tags') or []) if len(t.split('.'))==3 and all(p.isdigit() for p in t.split('.'))); print('%d.%d.%d'%v[-1] if v else '1.0.0')"
+ }
+
+ current=$(get_latest_tag "deepguard-react")
IFS='.' read -r major minor patch <<< "$current"
new_tag="${major}.${minor}.$((patch + 1))"
- echo "react: ${current} -> ${new_tag}"
+ echo "react: 현재 최댓값 ${current} -> ${new_tag}"
echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
- name: Build & push react
diff --git a/.github/workflows/docker-bump-push-redis.yml b/.github/workflows/docker-bump-push-redis.yml
index f1bf669..cda7a71 100644
--- a/.github/workflows/docker-bump-push-redis.yml
+++ b/.github/workflows/docker-bump-push-redis.yml
@@ -26,14 +26,23 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Compute new tag
+ - name: Compute new tag from Docker Hub
id: bump
run: |
set -euo pipefail
- current=$(grep -oP "seoyunje/deepguard-redis:\K[0-9]+\.[0-9]+\.[0-9]+" docker-compose.yml | head -1)
+
+ get_latest_tag() {
+ local repo="$1"
+ local token tags_json
+ token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${DOCKERHUB_NAMESPACE}/${repo}:pull" | python3 -c "import json,sys;print(json.load(sys.stdin).get('token',''))")
+ tags_json=$(curl -s -H "Authorization: Bearer ${token}" "https://registry-1.docker.io/v2/${DOCKERHUB_NAMESPACE}/${repo}/tags/list")
+ echo "$tags_json" | python3 -c "import json,sys; d=json.load(sys.stdin); v=sorted(tuple(int(p) for p in t.split('.')) for t in (d.get('tags') or []) if len(t.split('.'))==3 and all(p.isdigit() for p in t.split('.'))); print('%d.%d.%d'%v[-1] if v else '1.0.0')"
+ }
+
+ current=$(get_latest_tag "deepguard-redis")
IFS='.' read -r major minor patch <<< "$current"
new_tag="${major}.${minor}.$((patch + 1))"
- echo "redis: ${current} -> ${new_tag}"
+ echo "redis: 현재 최댓값 ${current} -> ${new_tag}"
echo "new_tag=${new_tag}" >> "$GITHUB_OUTPUT"
- name: Build & push redis
From 6a4e54711afe6f8986576c9c8ca9bf53246ba452 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 01:19:08 +0000
Subject: [PATCH 20/44] Update pillow requirement from >=11.1.0 to >=12.3.0
Updates the requirements on [pillow](https://github.com/python-pillow/Pillow) to permit the latest version.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/11.1.0...12.3.0)
---
updated-dependencies:
- dependency-name: pillow
dependency-version: 12.3.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 3d10659..388b663 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -26,7 +26,7 @@ scikit-learn>=1.6.1
# --- [Computer Vision & Image Processing] ---
opencv-python>=5.0.0.93
-Pillow>=11.1.0
+Pillow>=12.3.0
albumentations>=2.0.8
# --- [Deep Learning Framework] ---
From a6ecc47d98ed315b13f20e16f3e8f8ddfec21b72 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 01:22:55 +0000
Subject: [PATCH 21/44] Update python-dotenv requirement from >=0.9.9 to
>=1.2.3
Updates the requirements on [python-dotenv](https://github.com/theskumar/python-dotenv) to permit the latest version.
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v0.10.0...v1.2.3)
---
updated-dependencies:
- dependency-name: python-dotenv
dependency-version: 1.2.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 93ed553..1fb7f53 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,7 +5,7 @@ python-multipart>=0.0.22
pydantic[email]>=2.12.5
aiofiles>=25.1.0
itsdangerous>=2.2.0
-python-dotenv>=0.9.9
+python-dotenv>=1.2.3
# --- [Database & ORM] ---
sqlalchemy>=2.0.52
From 68606b507ff5474b489fa6db22cf6c74a54f1a75 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 01:32:20 +0000
Subject: [PATCH 22/44] Bump docker/setup-buildx-action from 3 to 4
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3 to 4.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v3...v4)
---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
dependency-version: '4'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/docker-build-check.yml | 2 +-
.github/workflows/docker-bump-push-app.yml | 2 +-
.github/workflows/docker-bump-push-mysql.yml | 2 +-
.github/workflows/docker-bump-push-react.yml | 2 +-
.github/workflows/docker-bump-push-redis.yml | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/docker-build-check.yml b/.github/workflows/docker-build-check.yml
index e6dbd65..4ab22ac 100644
--- a/.github/workflows/docker-build-check.yml
+++ b/.github/workflows/docker-build-check.yml
@@ -51,7 +51,7 @@ jobs:
- name: Set up Docker Buildx
if: steps.changes.outputs.app == 'true' || steps.changes.outputs.client == 'true' || steps.changes.outputs.mysql == 'true' || steps.changes.outputs.redis == 'true'
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
# ── fastapi + celery (App/Dockerfile) ────────────────────────────────────
- name: Build fastapi (validate only)
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
index a212d08..1861755 100644
--- a/.github/workflows/docker-bump-push-app.yml
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -24,7 +24,7 @@ jobs:
uses: actions/checkout@v4
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
- name: Log in to Docker Hub
uses: docker/login-action@v4
diff --git a/.github/workflows/docker-bump-push-mysql.yml b/.github/workflows/docker-bump-push-mysql.yml
index dce79fd..f6a2d06 100644
--- a/.github/workflows/docker-bump-push-mysql.yml
+++ b/.github/workflows/docker-bump-push-mysql.yml
@@ -19,7 +19,7 @@ jobs:
uses: actions/checkout@v4
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
- name: Log in to Docker Hub
uses: docker/login-action@v4
diff --git a/.github/workflows/docker-bump-push-react.yml b/.github/workflows/docker-bump-push-react.yml
index e9b1034..cc49f8b 100644
--- a/.github/workflows/docker-bump-push-react.yml
+++ b/.github/workflows/docker-bump-push-react.yml
@@ -18,7 +18,7 @@ jobs:
uses: actions/checkout@v4
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
- name: Log in to Docker Hub
uses: docker/login-action@v4
diff --git a/.github/workflows/docker-bump-push-redis.yml b/.github/workflows/docker-bump-push-redis.yml
index 25e31b1..7ebb931 100644
--- a/.github/workflows/docker-bump-push-redis.yml
+++ b/.github/workflows/docker-bump-push-redis.yml
@@ -18,7 +18,7 @@ jobs:
uses: actions/checkout@v4
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
+ uses: docker/setup-buildx-action@v4
- name: Log in to Docker Hub
uses: docker/login-action@v4
From dd8b5339deee55dabbfcc8121a78b33990141024 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 01:37:27 +0000
Subject: [PATCH 23/44] Update pydantic requirement from >=2.12.5 to >=2.13.4
Updates the requirements on [pydantic](https://github.com/pydantic/pydantic) to permit the latest version.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](https://github.com/pydantic/pydantic/compare/v2.12.5...v2.13.4)
---
updated-dependencies:
- dependency-name: pydantic
dependency-version: 2.13.4
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 1fb7f53..bed1187 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,7 +2,7 @@
fastapi>=0.135.1
uvicorn>=0.41.0
python-multipart>=0.0.22
-pydantic[email]>=2.12.5
+pydantic[email]>=2.13.4
aiofiles>=25.1.0
itsdangerous>=2.2.0
python-dotenv>=1.2.3
From 8374501448da2291ae370336d1f130b7a1bf4479 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 01:43:50 +0000
Subject: [PATCH 24/44] Bump actions/checkout from 4 to 7
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/docker-build-check.yml | 2 +-
.github/workflows/docker-bump-push-app.yml | 2 +-
.github/workflows/docker-bump-push-mysql.yml | 2 +-
.github/workflows/docker-bump-push-react.yml | 2 +-
.github/workflows/docker-bump-push-redis.yml | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/docker-build-check.yml b/.github/workflows/docker-build-check.yml
index 4ad8787..5aa6bef 100644
--- a/.github/workflows/docker-build-check.yml
+++ b/.github/workflows/docker-build-check.yml
@@ -26,7 +26,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Detect changed sources
id: changes
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
index 1861755..4af7c7d 100644
--- a/.github/workflows/docker-bump-push-app.yml
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
diff --git a/.github/workflows/docker-bump-push-mysql.yml b/.github/workflows/docker-bump-push-mysql.yml
index f6a2d06..b97a535 100644
--- a/.github/workflows/docker-bump-push-mysql.yml
+++ b/.github/workflows/docker-bump-push-mysql.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
diff --git a/.github/workflows/docker-bump-push-react.yml b/.github/workflows/docker-bump-push-react.yml
index cc49f8b..6be521a 100644
--- a/.github/workflows/docker-bump-push-react.yml
+++ b/.github/workflows/docker-bump-push-react.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
diff --git a/.github/workflows/docker-bump-push-redis.yml b/.github/workflows/docker-bump-push-redis.yml
index 7ebb931..bc36e1d 100644
--- a/.github/workflows/docker-bump-push-redis.yml
+++ b/.github/workflows/docker-bump-push-redis.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v7
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
From f4557e27127a695aa50a94a924c56d82b540530a Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 13:46:35 +0900
Subject: [PATCH 25/44] =?UTF-8?q?=F0=9F=90=9B=20=20Fetch=20Git=20LFS=20con?=
=?UTF-8?q?tent=20in=20checkout=20to=20fix=20corrupted=20yolov8n-face.pt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/docker-build-check.yml | 2 ++
.github/workflows/docker-bump-push-app.yml | 2 ++
2 files changed, 4 insertions(+)
diff --git a/.github/workflows/docker-build-check.yml b/.github/workflows/docker-build-check.yml
index 5aa6bef..af11f2d 100644
--- a/.github/workflows/docker-build-check.yml
+++ b/.github/workflows/docker-build-check.yml
@@ -27,6 +27,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v7
+ with:
+ lfs: true
- name: Detect changed sources
id: changes
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
index 4af7c7d..32583fa 100644
--- a/.github/workflows/docker-bump-push-app.yml
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -22,6 +22,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v7
+ with:
+ lfs: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
From 8ece685fde4a1c7daaeb2fddd9a62b804baa13a0 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 14:29:43 +0900
Subject: [PATCH 26/44] =?UTF-8?q?=E2=9C=A8=20Add=20PyPI=20auto-publish=20w?=
=?UTF-8?q?orkflow?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/pypi-publish.yml | 53 ++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 .github/workflows/pypi-publish.yml
diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml
new file mode 100644
index 0000000..b7ac228
--- /dev/null
+++ b/.github/workflows/pypi-publish.yml
@@ -0,0 +1,53 @@
+name: Publish to PyPI
+
+# main에 pyproject.toml이 push되면: lint/test 검증 -> README 이미지 경로를 절대 URL로 치환 -> 빌드 -> PyPI에 바로 배포.
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - "pyproject.toml"
+
+permissions:
+ contents: read
+
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ permissions:
+ id-token: write # PyPI Trusted Publishing(OIDC)에 필요 - API 토큰 불필요
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v7
+ with:
+ lfs: true
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.11"
+ cache: "pip"
+
+ - name: Install dependencies
+ run: pip install -r requirements.txt
+
+ - name: Lint (ruff)
+ run: ruff check . --output-format=github
+
+ - name: Format check (ruff)
+ run: ruff format --check .
+
+ - name: Test (pytest)
+ run: pytest --tb=short -q
+
+ - name: Rewrite relative image paths for PyPI
+ run: sed -i -E 's#src="docs/#src="https://raw.githubusercontent.com/HanMoonSub/DeepGuard/main/docs/#g' README.md
+
+ - name: Install build tool
+ run: pip install build
+
+ - name: Build sdist & wheel
+ run: python -m build
+
+ - name: Publish to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
From 2eaf221621c62f5bee645f392d27d87f13942b80 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 14:30:16 +0900
Subject: [PATCH 27/44] =?UTF-8?q?=F0=9F=94=96=20Bump=20version=20to=200.3.?=
=?UTF-8?q?1=20and=20fix=20package=20metadata?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pyproject.toml | 32 ++++++++++++++++++++++----------
1 file changed, 22 insertions(+), 10 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 5f7357f..d28fe74 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,13 +8,15 @@ build-backend = "setuptools.build_meta"
# ─────────────────────────────────────────────
[project]
name = "deepguard" # pip install deepguard 할 때 이 이름
-version = "0.3.0" # pip install deepguard==0.2.4 으로 버전 고정 가능
+version = "0.3.1" # pip install deepguard==0.2.4 으로 버전 고정 가능
description = "Multi-Scale Efficient Global Context Vision Transformer for Robust Deepfake Detection"
readme = "README.md" # PyPI 페이지에 표시될 설명 (마크다운)
-requires-python = ">=3.10" # 이 버전 미만이면 pip install 자체를 막음
+requires-python = ">=3.10" # torch/torchvision/torchmetrics의 Requires-Python 하한이 3.10이라 이 값을 그대로 따름
license = { text = "MIT" }
authors = [
- { name = "seoyunje", email = "seoyunje2001@gmail.com" }
+ { name = "seoyunje", email = "seoyunje2001@gmail.com" },
+ { name = "한문섭", email = "hanmoon3054@gmail.com" },
+ { name = "이예솔", email = "yesol4138@chungbuk.ac.kr" }
]
classifiers = [
"Programming Language :: Python :: 3",
@@ -24,17 +26,27 @@ classifiers = [
"Operating System :: OS Independent",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
-dependencies = ["torchmetrics>=1.6.1",
- "ultralytics>=8.4.41",
- "grad-cam>=1.5.5",
- "timm>=1.0.12",
- "torch>=2.10.0"
- ]
+dependencies = [
+ "torch>=2.10.0",
+ "torchmetrics>=1.6.1",
+ "timm>=1.0.12",
+ "ultralytics>=8.4.41",
+ "grad-cam>=1.5.5",
+ "albumentations>=2.0.8",
+ "opencv-python>=5.0.0.93",
+ "numpy>=1.23.0,<3.0.0",
+ "pandas>=2.2.3",
+ "scikit-learn>=1.6.1",
+ "scipy>=1.10.0",
+ "matplotlib>=3.10.9",
+ "tqdm>=4.60.0",
+ "colorama>=0.4.6",
+]
[project.urls]
Homepage = "https://github.com/HanMoonSub/DeepGuard"
"Bug Tracker" = "https://github.com/HanMoonSub/DeepGuard/issues"
"Source Code" = "https://github.com/HanMoonSub/DeepGuard"
-"Hugging Face" = "https://huggingface.co/KoreaPeter/ms-eff-gcvit-deepfake"
+"Hugging Face" = "https://huggingface.co/KoreaPeter"
[tool.setuptools.packages.find]
include = [
"deepguard*", # 모델, 레이어, 데이터셋 등 핵심 패키지
From 5edf6dbb955e10b716635b9887f79588862601b7 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 14:41:43 +0900
Subject: [PATCH 28/44] =?UTF-8?q?=F0=9F=94=A5=20Remove=20ruff/pytest=20ver?=
=?UTF-8?q?ification=20steps=20from=20PyPI=20publish=20workflow?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/pypi-publish.yml | 15 ++-------------
1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml
index b7ac228..a5141e8 100644
--- a/.github/workflows/pypi-publish.yml
+++ b/.github/workflows/pypi-publish.yml
@@ -1,12 +1,13 @@
name: Publish to PyPI
-# main에 pyproject.toml이 push되면: lint/test 검증 -> README 이미지 경로를 절대 URL로 치환 -> 빌드 -> PyPI에 바로 배포.
+# main에 pyproject.toml이 push되면: README 이미지 경로를 절대 URL로 치환 -> 빌드 -> PyPI에 바로 배포.
on:
push:
branches: [main]
paths:
- "pyproject.toml"
+ workflow_dispatch:
permissions:
contents: read
@@ -28,18 +29,6 @@ jobs:
python-version: "3.11"
cache: "pip"
- - name: Install dependencies
- run: pip install -r requirements.txt
-
- - name: Lint (ruff)
- run: ruff check . --output-format=github
-
- - name: Format check (ruff)
- run: ruff format --check .
-
- - name: Test (pytest)
- run: pytest --tb=short -q
-
- name: Rewrite relative image paths for PyPI
run: sed -i -E 's#src="docs/#src="https://raw.githubusercontent.com/HanMoonSub/DeepGuard/main/docs/#g' README.md
From 7cd8e847668bf4bf31f43bca3c352b1caf17ebc4 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 20 Aug 2026 20:14:13 +0900
Subject: [PATCH 29/44] =?UTF-8?q?=F0=9F=94=96=20Bump=20version=20to=200.3.?=
=?UTF-8?q?2=20and=20add=20project=20urls?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pyproject.toml | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/pyproject.toml b/pyproject.toml
index d28fe74..bd2fef8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
# ─────────────────────────────────────────────
[project]
name = "deepguard" # pip install deepguard 할 때 이 이름
-version = "0.3.1" # pip install deepguard==0.2.4 으로 버전 고정 가능
+version = "0.3.2" # pip install deepguard==0.2.4 으로 버전 고정 가능
description = "Multi-Scale Efficient Global Context Vision Transformer for Robust Deepfake Detection"
readme = "README.md" # PyPI 페이지에 표시될 설명 (마크다운)
requires-python = ">=3.10" # torch/torchvision/torchmetrics의 Requires-Python 하한이 3.10이라 이 값을 그대로 따름
@@ -47,6 +47,9 @@ Homepage = "https://github.com/HanMoonSub/DeepGuard"
"Bug Tracker" = "https://github.com/HanMoonSub/DeepGuard/issues"
"Source Code" = "https://github.com/HanMoonSub/DeepGuard"
"Hugging Face" = "https://huggingface.co/KoreaPeter"
+"Demo - DeepFake Image" = "https://huggingface.co/spaces/KoreaPeter/DeepFake-Image-Detection"
+"Demo - DeepFake Video" = "https://huggingface.co/spaces/KoreaPeter/DeepFake-Video-Detection"
+"Demo - DeepFake XAI" = "https://huggingface.co/spaces/KoreaPeter/DeepFake-Detection-XAI"
[tool.setuptools.packages.find]
include = [
"deepguard*", # 모델, 레이어, 데이터셋 등 핵심 패키지
From ece8e17d63fa73b25db7a90ac716227cafd62212 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 16:14:28 +0000
Subject: [PATCH 30/44] Bump actions/setup-python from 5 to 7
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 7.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v7)
---
updated-dependencies:
- dependency-name: actions/setup-python
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/pypi-publish.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml
index a5141e8..2903c78 100644
--- a/.github/workflows/pypi-publish.yml
+++ b/.github/workflows/pypi-publish.yml
@@ -24,7 +24,7 @@ jobs:
lfs: true
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v7
with:
python-version: "3.11"
cache: "pip"
From c870dcb61da6030c44d575ddfd14f998918d517a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 16:14:40 +0000
Subject: [PATCH 31/44] Update uvicorn requirement from >=0.41.0 to >=0.52.3
Updates the requirements on [uvicorn](https://github.com/Kludex/uvicorn) to permit the latest version.
- [Release notes](https://github.com/Kludex/uvicorn/releases)
- [Changelog](https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md)
- [Commits](https://github.com/Kludex/uvicorn/compare/0.41.0...0.52.3)
---
updated-dependencies:
- dependency-name: uvicorn
dependency-version: 0.52.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 12083d8..a1ba1a8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,6 @@
# --- [Core Backend & Server] ---
fastapi>=0.135.1
-uvicorn>=0.41.0
+uvicorn>=0.52.3
python-multipart>=0.0.22
pydantic[email]>=2.13.4
aiofiles>=25.1.0
From 3799299ac46f5484df4c1ebc3fe1a81c3caa40e0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 16:15:04 +0000
Subject: [PATCH 32/44] Update ruff requirement from >=0.9.0 to >=0.16.3
Updates the requirements on [ruff](https://github.com/astral-sh/ruff) to permit the latest version.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.9.0...0.16.3)
---
updated-dependencies:
- dependency-name: ruff
dependency-version: 0.16.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 12083d8..b66f154 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -46,4 +46,4 @@ colorama>=0.4.6
celery>=5.6.3
# --- [Linting & Formatting] ---
-ruff>=0.9.0
\ No newline at end of file
+ruff>=0.16.3
\ No newline at end of file
From 4a7c7786b62f060b577e065a9b20da999d83775d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 16:15:08 +0000
Subject: [PATCH 33/44] Update pymysql requirement from >=1.1.2 to >=1.2.0
Updates the requirements on [pymysql](https://github.com/PyMySQL/PyMySQL) to permit the latest version.
- [Release notes](https://github.com/PyMySQL/PyMySQL/releases)
- [Changelog](https://github.com/PyMySQL/PyMySQL/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyMySQL/PyMySQL/compare/v1.1.2...v1.2.0)
---
updated-dependencies:
- dependency-name: pymysql
dependency-version: 1.2.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 12083d8..51abf64 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,7 +9,7 @@ python-dotenv>=1.2.3
# --- [Database & ORM] ---
sqlalchemy>=2.0.52
-pymysql>=1.1.2
+pymysql>=1.2.0
aiomysql>=0.3.2
mysql-connector-python>=9.6.0
redis>=8.1.0
From 52b27853f86f25fb0df2245b39bdb8a515d0b770 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Fri, 21 Aug 2026 08:51:18 +0900
Subject: [PATCH 34/44] =?UTF-8?q?=F0=9F=93=9D=20Add=20Docker=20Quick=20Sta?=
=?UTF-8?q?rt=20guide=20to=20README=20(all=20languages)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 44 ++++++++++++++++++++++++++++----------------
README_JP.md | 41 +++++++++++++++++++++++++++--------------
README_KR.md | 41 +++++++++++++++++++++++++++--------------
3 files changed, 82 insertions(+), 44 deletions(-)
diff --git a/README.md b/README.md
index 47997df..1368867 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -28,6 +28,12 @@
+
+
+
+
+
+
🇰🇷 한국어 버전 |
🇯🇵 日本語版 |
@@ -37,8 +43,7 @@
## 📌 Contents
-- [💡 Install & Requirements](#-install--requirements)
-- [🛠 SetUp](#-setup)
+- [🐳 Docker Quick Start](#-docker-quick-start) - Run the full stack (MySQL, Redis, FastAPI, Celery, React) with Docker Compose
- [📚 DeepFake Video BenchMark Datasets](#-deepfake-video-benchmark-datasets) — Overview of Celeb-DF-v2, FF++, and KoDF datasets used for training.
- [⚙️ Data Preparation](#data-preparation) — Efficient face detection and landmark extraction pipeline using YOLOv8
- [🏗 Model Architecture](#-model-architecture) — Detailed look into our hybrid CNN-ViT (MS-EffViT & MS-EffGCViT) designs.
@@ -49,27 +54,26 @@
- [🔮 Predict Image & Video](#-predict-image--video) - Simple Inference examples for detecting deepfakes in image and video
- [🎨 DeepFake AI Explainability](#-deepfake-ai-explainability) - Visualizing model focus using Grad-CAM and attention maps
- [📓 Tutorials](#-tutorials) - Hands-on Colab notebooks for inference and dual-branch XAI visualization
-- [📬 Authors](#-authors)
-- [📝 Reference](#-reference)
-- [⚖️ License](#-license)
+- [📬 Authors](#-authors) - Team behind this senior graduation project at Chungbuk National University
+- [📝 Reference](#-reference) - Libraries, datasets, and prior work this project builds on
+- [⚖️ License](#-license) - MIT license
-## 💡 Install & Requirements
+## 🐳 Docker Quick Start
-To install requirements:
-
-```python
-pip install -r requirements.txt
-```
+Run the full stack (MySQL + Redis + FastAPI + Celery + React) with Docker Compose — no local Python/Node setup required.
-## 🛠 SetUp
+**Prerequisites**: [Docker](https://www.docker.com/) with Compose v2
-Clone the repository and move into it:
-```
+```bash
git clone https://github.com/HanMoonSub/DeepGuard.git
-
cd DeepGuard
+docker compose up -d
```
+Once all containers are up, open **http://localhost:80** in your browser.
+
+Images are published to Docker Hub under [`seoyunje/deepguard-*`](https://hub.docker.com/u/seoyunje) (`fastapi`, `celery`, `mysql`, `redis`, `react`) and mirrored to [GitHub Packages](https://github.com/HanMoonSub/DeepGuard/pkgs/container/deepguard-fastapi).
+
## 📚 DeepFake Video BenchMark Datasets
To evaluate the generalization and robustness of our deepfake detection model, we utilize three large-scale, widely recognized benchmark datasets. Each dataset presents unique challenges and covers different types of forgery methods.
@@ -167,6 +171,14 @@ We utilizes two distinct types of self-attention to capture both long-range and
## 🚀 Training
+These training scripts run against the full repo, not the `pip install deepguard` package. Clone it and install the full dev environment first:
+
+```bash
+git clone https://github.com/HanMoonSub/DeepGuard.git
+cd DeepGuard
+pip install -r requirements.txt
+```
+
We provide training scripts for both `ms_eff_vit` and `ms_eff_gcvit`. We recommend using **Google Colab** for free GPU access and **Weightes & Biases(W&B)** for experiment tracking
#### 📊 Weight & Biases Experiments
diff --git a/README_JP.md b/README_JP.md
index 581d6fb..1e621d5 100644
--- a/README_JP.md
+++ b/README_JP.md
@@ -6,7 +6,7 @@
-
+
@@ -28,6 +28,12 @@
+
+
+
+
+
+
🇺🇸 English Version |
🇰🇷 한국어 버전 |
@@ -37,8 +43,7 @@
## 📌 目次
-- [💡 インストールと要件](#-インストールと要件)
-- [🛠 セットアップ](#-セットアップ)
+- [🐳 Docker Quick Start](#-docker-quick-start) - Docker Compose でフルスタック(MySQL, Redis, FastAPI, Celery, React)を起動
- [📚 ディープフェイク動画ベンチマークデータセット](#-ディープフェイク動画ベンチマークデータセット) — 学習に使用した Celeb-DF-v2, FF++, KoDF データセットの概要。
- [⚙️ データ準備](#データ準備) — YOLOv8 を用いた効率的な顔検出およびランドマーク抽出パイプライン。
- [🏗 モデルアーキテクチャ](#-モデルアーキテクチャ) — ハイブリッド CNN-ViT (MS-EffViT & MS-EffGCViT) 設計の詳細。
@@ -49,28 +54,28 @@
- [🔮 画像と動画の予測](#-画像と動画の予測) - ディープフェイク検出のためのシンプルな推論例。
- [🎨 ディープフェイクAI説明可能性(XAI)](#-ディープフェイクai説明可能性xai) - Grad-CAM およびアテンションマップによるモデル判断根拠の可視化。
- [📓 Tutorials](#-tutorials) - 推論とデュアルブランチXAI可視化のためのハンズオンノートブック
-- [📬 制作者](#-制作者)
-- [📝 参考文献](#-参考文献)
-- [⚖️ ライセンス](#-ライセンス)
+- [📬 制作者](#-制作者) - 忠北大学校の卒業制作を手がけたチーム紹介
+- [📝 参考文献](#-参考文献) - 本プロジェクトが参考にしたライブラリ、データセット、先行研究
+- [⚖️ ライセンス](#-ライセンス) - MIT ライセンス
---
-## 💡 インストールと要件
-
-必要なライブラリのインストール:
+## 🐳 Docker Quick Start
-```bash
-pip install -r requirements.txt
-```
+Docker Compose でフルスタック(MySQL + Redis + FastAPI + Celery + React)を起動します — ローカルに Python/Node 環境を用意する必要はありません。
-## 🛠 セットアップ
+**前提条件**: Compose v2 を含む [Docker](https://www.docker.com/)
-リポジトリをクローンし、該当ディレクトリへ移動します:
```bash
git clone https://github.com/HanMoonSub/DeepGuard.git
cd DeepGuard
+docker compose up -d
```
+すべてのコンテナが起動したら、ブラウザで **http://localhost:80** にアクセスしてください。
+
+イメージは Docker Hub の [`seoyunje/deepguard-*`](https://hub.docker.com/u/seoyunje) (`fastapi`, `celery`, `mysql`, `redis`, `react`) として公開されており、[GitHub Packages](https://github.com/HanMoonSub/DeepGuard/pkgs/container/deepguard-fastapi) にもミラーされています。
+
## 📚 ディープフェイク動画ベンチマークデータセット
モデルの汎化性能と頑健性を評価するため、広く認知された3つの大規模ベンチマークデータセットを使用します。各データセットはそれぞれ異なる改ざん手法と難易度の高い課題を含んでいます。
@@ -162,6 +167,14 @@ DATA_ROOT/
## 🚀 学習
+これらの学習スクリプトは `pip install deepguard` パッケージではなく、リポジトリ全体を対象に動作します。まずリポジトリをクローンし、フル開発環境をインストールしてください:
+
+```bash
+git clone https://github.com/HanMoonSub/DeepGuard.git
+cd DeepGuard
+pip install -r requirements.txt
+```
+
`ms_eff_vit` と `ms_eff_gcvit` の両方について学習スクリプトを提供します。無料の GPU 環境として **Google Colab** を、実験の記録およびトラッキングとして **Weights & Biases(W&B)** の使用を推奨します。
#### 📊 Weight & Biases 実験結果
diff --git a/README_KR.md b/README_KR.md
index 18d0c38..b7dc485 100644
--- a/README_KR.md
+++ b/README_KR.md
@@ -6,7 +6,7 @@
-
+
@@ -28,6 +28,12 @@
+
+
+
+
+
+
🇺🇸 English Version |
🇯🇵 日本語版 |
@@ -37,8 +43,7 @@
## 📌 목차
-- [💡 설치 및 요구사항](#-설치-및-요구사항)
-- [🛠 설정](#-설정)
+- [🐳 Docker Quick Start](#-docker-quick-start) - Docker Compose로 전체 스택(MySQL, Redis, FastAPI, Celery, React) 실행
- [📚 딥페이크 비디오 벤치마크 데이터셋](#-딥페이크-비디오-벤치마크-데이터셋) — 학습에 사용된 Celeb-DF-v2, FF++, KoDF 데이터셋 개요.
- [⚙️ 데이터 준비](#데이터-준비) — YOLOv8을 이용한 효율적인 얼굴 검출 및 랜드마크 추출 파이프라인.
- [🏗 모델 구조](#-모델-구조) — 하이브리드 CNN-ViT (MS-EffViT & MS-EffGCViT) 설계 상세.
@@ -49,28 +54,28 @@
- [🔮 이미지 및 비디오 예측](#-이미지-및-비디오-예측) - 딥페이크 탐지를 위한 간단한 추론 예시.
- [🎨 딥페이크 AI 설명가능성(XAI)](#-딥페이크-ai-설명가능성xai) - Grad-CAM 및 어텐션 맵을 통한 모델 판단 근거 시각화.
- [📓 Tutorials](#-tutorials) - 추론과 듀얼 브랜치 XAI 시각화를 위한 실습 노트북
-- [📬 제작자](#-제작자)
-- [📝 참고 문헌](#-참고-문헌)
-- [⚖️ 라이선스](#-라이선스)
+- [📬 제작자](#-제작자) - 충북대학교 졸업 작품을 만든 팀 소개
+- [📝 참고 문헌](#-참고-문헌) - 이 프로젝트가 참고한 라이브러리, 데이터셋, 선행 연구
+- [⚖️ 라이선스](#-라이선스) - MIT 라이선스
---
-## 💡 설치 및 요구사항
-
-필수 라이브러리 설치:
+## 🐳 Docker Quick Start
-```bash
-pip install -r requirements.txt
-```
+Docker Compose로 전체 스택(MySQL + Redis + FastAPI + Celery + React)을 실행합니다 — 로컬에 Python/Node 환경을 따로 설치할 필요가 없습니다.
-## 🛠 설정
+**사전 요구사항**: Compose v2가 포함된 [Docker](https://www.docker.com/)
-저장소를 클론하고 해당 디렉토리로 이동합니다:
```bash
git clone https://github.com/HanMoonSub/DeepGuard.git
cd DeepGuard
+docker compose up -d
```
+모든 컨테이너가 정상적으로 실행되면 브라우저에서 **http://localhost:80**으로 접속하세요.
+
+이미지는 Docker Hub의 [`seoyunje/deepguard-*`](https://hub.docker.com/u/seoyunje) (`fastapi`, `celery`, `mysql`, `redis`, `react`)에 배포되며, [GitHub Packages](https://github.com/HanMoonSub/DeepGuard/pkgs/container/deepguard-fastapi)에도 미러링됩니다.
+
## 📚 딥페이크 비디오 벤치마크 데이터셋
모델의 범용성과 강건성을 평가하기 위해 널리 인정받는 세 가지 대규모 벤치마크 데이터셋을 사용합니다. 각 데이터셋은 서로 다른 조작 기법과 도전적인 과제들을 포함하고 있습니다.
@@ -162,6 +167,14 @@ DATA_ROOT/
## 🚀 학습
+이 학습 스크립트는 `pip install deepguard` 패키지가 아니라 리포지토리 전체를 대상으로 동작합니다. 먼저 리포지토리를 클론하고 전체 개발 환경을 설치하세요:
+
+```bash
+git clone https://github.com/HanMoonSub/DeepGuard.git
+cd DeepGuard
+pip install -r requirements.txt
+```
+
`ms_eff_vit` 및 `ms_eff_gcvit` 모두에 대한 학습 스크립트를 제공합니다. 무료 GPU 환경을 위해 **Google Colab**을, 실험 기록 및 트래킹을 위해 **Weights & Biases(W&B)** 사용을 권장합니다.
#### 📊 Weight & Biases 실험 결과
From c37a950ffd83256ed0399c1b0a79d52a7bd09090 Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Fri, 21 Aug 2026 09:02:03 +0900
Subject: [PATCH 35/44] =?UTF-8?q?=E2=9C=A8=20Mirror=20Docker=20images=20to?=
=?UTF-8?q?=20GitHub=20Packages?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/workflows/docker-bump-push-app.yml | 19 +++++++++++++++++--
.github/workflows/docker-bump-push-mysql.yml | 15 ++++++++++++++-
.github/workflows/docker-bump-push-react.yml | 15 ++++++++++++++-
.github/workflows/docker-bump-push-redis.yml | 15 ++++++++++++++-
4 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/docker-bump-push-app.yml b/.github/workflows/docker-bump-push-app.yml
index 32583fa..1d89224 100644
--- a/.github/workflows/docker-bump-push-app.yml
+++ b/.github/workflows/docker-bump-push-app.yml
@@ -15,10 +15,14 @@ on:
env:
DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+ GHCR_NAMESPACE: ghcr.io/hanmoonsub
jobs:
bump-and-push:
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
steps:
- name: Checkout
uses: actions/checkout@v7
@@ -34,6 +38,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Log in to GHCR
+ uses: docker/login-action@v4
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
- name: Compute new tag from Docker Hub
id: bump
run: |
@@ -62,7 +73,9 @@ jobs:
context: .
file: App/Dockerfile
target: fastapi
- tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-fastapi:${{ steps.bump.outputs.new_tag }}
+ tags: |
+ ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-fastapi:${{ steps.bump.outputs.new_tag }}
+ ${{ env.GHCR_NAMESPACE }}/deepguard-fastapi:${{ steps.bump.outputs.new_tag }}
push: true
cache-from: type=gha,scope=fastapi
cache-to: type=gha,mode=max,scope=fastapi
@@ -73,7 +86,9 @@ jobs:
context: .
file: App/Dockerfile
target: celery
- tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-celery:${{ steps.bump.outputs.new_tag }}
+ tags: |
+ ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-celery:${{ steps.bump.outputs.new_tag }}
+ ${{ env.GHCR_NAMESPACE }}/deepguard-celery:${{ steps.bump.outputs.new_tag }}
push: true
cache-from: type=gha,scope=celery
cache-to: type=gha,mode=max,scope=celery
diff --git a/.github/workflows/docker-bump-push-mysql.yml b/.github/workflows/docker-bump-push-mysql.yml
index b97a535..afa337a 100644
--- a/.github/workflows/docker-bump-push-mysql.yml
+++ b/.github/workflows/docker-bump-push-mysql.yml
@@ -10,10 +10,14 @@ on:
env:
DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+ GHCR_NAMESPACE: ghcr.io/hanmoonsub
jobs:
bump-and-push:
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
steps:
- name: Checkout
uses: actions/checkout@v7
@@ -27,6 +31,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Log in to GHCR
+ uses: docker/login-action@v4
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
- name: Compute new tag from Docker Hub
id: bump
run: |
@@ -51,7 +62,9 @@ jobs:
with:
context: .
file: docker/mysql/Dockerfile
- tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-mysql:${{ steps.bump.outputs.new_tag }}
+ tags: |
+ ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-mysql:${{ steps.bump.outputs.new_tag }}
+ ${{ env.GHCR_NAMESPACE }}/deepguard-mysql:${{ steps.bump.outputs.new_tag }}
push: true
cache-from: type=gha,scope=mysql
cache-to: type=gha,mode=max,scope=mysql
diff --git a/.github/workflows/docker-bump-push-react.yml b/.github/workflows/docker-bump-push-react.yml
index 6be521a..c17d66d 100644
--- a/.github/workflows/docker-bump-push-react.yml
+++ b/.github/workflows/docker-bump-push-react.yml
@@ -9,10 +9,14 @@ on:
env:
DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+ GHCR_NAMESPACE: ghcr.io/hanmoonsub
jobs:
bump-and-push:
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
steps:
- name: Checkout
uses: actions/checkout@v7
@@ -26,6 +30,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Log in to GHCR
+ uses: docker/login-action@v4
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
- name: Compute new tag from Docker Hub
id: bump
run: |
@@ -50,7 +61,9 @@ jobs:
with:
context: client
file: client/Dockerfile
- tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-react:${{ steps.bump.outputs.new_tag }}
+ tags: |
+ ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-react:${{ steps.bump.outputs.new_tag }}
+ ${{ env.GHCR_NAMESPACE }}/deepguard-react:${{ steps.bump.outputs.new_tag }}
push: true
cache-from: type=gha,scope=react
cache-to: type=gha,mode=max,scope=react
diff --git a/.github/workflows/docker-bump-push-redis.yml b/.github/workflows/docker-bump-push-redis.yml
index bc36e1d..1bfd5ef 100644
--- a/.github/workflows/docker-bump-push-redis.yml
+++ b/.github/workflows/docker-bump-push-redis.yml
@@ -9,10 +9,14 @@ on:
env:
DOCKERHUB_NAMESPACE: ${{ secrets.DOCKERHUB_USERNAME }}
+ GHCR_NAMESPACE: ghcr.io/hanmoonsub
jobs:
bump-and-push:
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
steps:
- name: Checkout
uses: actions/checkout@v7
@@ -26,6 +30,13 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Log in to GHCR
+ uses: docker/login-action@v4
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
- name: Compute new tag from Docker Hub
id: bump
run: |
@@ -50,7 +61,9 @@ jobs:
with:
context: .
file: docker/redis/Dockerfile
- tags: ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-redis:${{ steps.bump.outputs.new_tag }}
+ tags: |
+ ${{ env.DOCKERHUB_NAMESPACE }}/deepguard-redis:${{ steps.bump.outputs.new_tag }}
+ ${{ env.GHCR_NAMESPACE }}/deepguard-redis:${{ steps.bump.outputs.new_tag }}
push: true
cache-from: type=gha,scope=redis
cache-to: type=gha,mode=max,scope=redis
From d269e16070cbf2693ebf94e1ce357c604b2c503e Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Fri, 21 Aug 2026 10:31:23 +0900
Subject: [PATCH 36/44] =?UTF-8?q?=F0=9F=94=96=20Bump=20version=20to=201.0.?=
=?UTF-8?q?0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pyproject.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyproject.toml b/pyproject.toml
index bd2fef8..952eaa8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
# ─────────────────────────────────────────────
[project]
name = "deepguard" # pip install deepguard 할 때 이 이름
-version = "0.3.2" # pip install deepguard==0.2.4 으로 버전 고정 가능
+version = "1.0.0"
description = "Multi-Scale Efficient Global Context Vision Transformer for Robust Deepfake Detection"
readme = "README.md" # PyPI 페이지에 표시될 설명 (마크다운)
requires-python = ">=3.10" # torch/torchvision/torchmetrics의 Requires-Python 하한이 3.10이라 이 값을 그대로 따름
From 0338fe8c32c520edc1d8c869f6818b79649ceb3d Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Fri, 21 Aug 2026 10:36:26 +0900
Subject: [PATCH 37/44] =?UTF-8?q?=F0=9F=94=96=20Bump=20Docker=20image=20ta?=
=?UTF-8?q?gs=20to=20latest=20(fastapi/celery=201.0.15,=20react=201.0.7,?=
=?UTF-8?q?=20mysql/redis=201.0.6)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docker-compose.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 741cd43..cb1c93f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -17,7 +17,7 @@ x-app-env: &app-env
services:
mysql:
- image: seoyunje/deepguard-mysql:1.0.1
+ image: seoyunje/deepguard-mysql:1.0.6
container_name: deepguard-mysql
networks: [deepguard-network]
environment:
@@ -29,14 +29,14 @@ services:
- deepguard-data:/var/lib/mysql
redis:
- image: seoyunje/deepguard-redis:1.0.1
+ image: seoyunje/deepguard-redis:1.0.6
container_name: deepguard-redis
networks: [deepguard-network]
volumes:
- deepguard-memory:/data
fastapi:
- image: seoyunje/deepguard-fastapi:1.0.1
+ image: seoyunje/deepguard-fastapi:1.0.15
container_name: deepguard-fastapi
networks: [deepguard-network]
environment:
@@ -49,7 +49,7 @@ services:
- redis
celery:
- image: seoyunje/deepguard-celery:1.0.1
+ image: seoyunje/deepguard-celery:1.0.15
container_name: deepguard-celery
networks: [deepguard-network]
environment:
@@ -62,7 +62,7 @@ services:
- redis
react:
- image: seoyunje/deepguard-react:1.0.1
+ image: seoyunje/deepguard-react:1.0.7
container_name: deepguard-react
networks: [deepguard-network]
ports:
From 87d33c7b2ee223781274527037d24b64c9fe12ae Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 21 Aug 2026 04:13:57 +0000
Subject: [PATCH 38/44] Update fastapi requirement from >=0.135.1 to >=0.141.1
Updates the requirements on [fastapi](https://github.com/fastapi/fastapi) to permit the latest version.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](https://github.com/fastapi/fastapi/compare/0.135.1...0.141.1)
---
updated-dependencies:
- dependency-name: fastapi
dependency-version: 0.141.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index a1ba1a8..36a6e5e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
# --- [Core Backend & Server] ---
-fastapi>=0.135.1
+fastapi>=0.141.1
uvicorn>=0.52.3
python-multipart>=0.0.22
pydantic[email]>=2.13.4
From 4a5e8e039cff8c35ef5075a0ffea6bfb049762a5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 21 Aug 2026 04:14:08 +0000
Subject: [PATCH 39/44] Update python-multipart requirement from >=0.0.22 to
>=0.0.32
Updates the requirements on [python-multipart](https://github.com/Kludex/python-multipart) to permit the latest version.
- [Release notes](https://github.com/Kludex/python-multipart/releases)
- [Changelog](https://github.com/Kludex/python-multipart/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.22...0.0.32)
---
updated-dependencies:
- dependency-name: python-multipart
dependency-version: 0.0.32
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index a1ba1a8..8ec2d05 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
# --- [Core Backend & Server] ---
fastapi>=0.135.1
uvicorn>=0.52.3
-python-multipart>=0.0.22
+python-multipart>=0.0.32
pydantic[email]>=2.13.4
aiofiles>=25.1.0
itsdangerous>=2.2.0
From af3aa9ad86af77c7f96e0d9443bb577f5ac9f8a8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 21 Aug 2026 04:19:43 +0000
Subject: [PATCH 40/44] Update mysql-connector-python requirement from >=9.6.0
to >=26.7.0
Updates the requirements on [mysql-connector-python](https://github.com/mysql/mysql-connector-python) to permit the latest version.
- [Changelog](https://github.com/mysql/mysql-connector-python/blob/trunk/CHANGES.txt)
- [Commits](https://github.com/mysql/mysql-connector-python/compare/9.6.0...26.7.0)
---
updated-dependencies:
- dependency-name: mysql-connector-python
dependency-version: 26.7.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index 8ef44a7..0fd20a6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -11,7 +11,7 @@ python-dotenv>=1.2.3
sqlalchemy>=2.0.52
pymysql>=1.2.0
aiomysql>=0.3.2
-mysql-connector-python>=9.6.0
+mysql-connector-python>=26.7.0
redis>=8.1.0
# --- [Security & Auth] ---
From d3ac789a2db3833d673fb7682728eb8e4523fdfa Mon Sep 17 00:00:00 2001
From: seoyunje
Date: Thu, 27 Aug 2026 13:25:37 +0900
Subject: [PATCH 41/44] =?UTF-8?q?=F0=9F=8D=B1=20Add=20Docker=20Compose=20a?=
=?UTF-8?q?rchitecture=20diagram?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../docker_compose_architecture.png | Bin 0 -> 4061597 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 docs/architectures/docker_compose_architecture.png
diff --git a/docs/architectures/docker_compose_architecture.png b/docs/architectures/docker_compose_architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6adbf84bc215acdd826a07808fa13c1d06d1713
GIT binary patch
literal 4061597
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%0AS38flHOAtuc&8%`}jILw{99T_)>7k!Rz$)
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