From 6e0ec35bc8b920859c722059996d8c1bf8be7c82 Mon Sep 17 00:00:00 2001 From: Zeecka Date: Sun, 4 Jan 2026 23:40:24 +0100 Subject: [PATCH 1/2] Github CD --- .../workflows/{releases.yml => release.yml} | 32 +++++++++---------- .gitignore | 1 + aperisolve/models.py | 3 +- 3 files changed, 17 insertions(+), 19 deletions(-) rename .github/workflows/{releases.yml => release.yml} (62%) diff --git a/.github/workflows/releases.yml b/.github/workflows/release.yml similarity index 62% rename from .github/workflows/releases.yml rename to .github/workflows/release.yml index 6d780f8..b866453 100644 --- a/.github/workflows/releases.yml +++ b/.github/workflows/release.yml @@ -3,42 +3,40 @@ name: Docker Image CI on: push: tags: - - '*' + - '*' jobs: - docker-releases: - runs-on: ubuntu-latest + steps: - name: Get release version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - - name: downcase username + + - name: Downcase username run: echo "lower_actor=${GITHUB_ACTOR,,}" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v4 - + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push Docker images uses: docker/build-push-action@v6.9.0 with: - context: ./ - push: true - tags: | - ghcr.io/${{ env.lower_actor }}/aperisolve:latest - ghcr.io/${{ env.lower_actor }}/aperisolve:${{ env.RELEASE_VERSION }} - \ No newline at end of file + context: ./ + push: true + tags: | + ghcr.io/${{ env.lower_actor }}/aperisolve:${{ env.RELEASE_VERSION }} + ghcr.io/${{ env.lower_actor }}/aperisolve:latest diff --git a/.gitignore b/.gitignore index 8a70dc2..7b0fdd9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__/ .mypy_cache/ results/ +.vscode diff --git a/aperisolve/models.py b/aperisolve/models.py index e9f82b6..3f13c4d 100644 --- a/aperisolve/models.py +++ b/aperisolve/models.py @@ -78,7 +78,7 @@ def fill_ihdr_db() -> None: if db.session.query(IHDR.iid).first() is not None: print("IHDR table already populated, skipping fill.") return - + # Standard PNG IHDR parameters resolutions = get_resolutions() bit_color_pairs = get_valid_depth_color_pairs() @@ -155,4 +155,3 @@ def init_db(app: Flask) -> None: print("Running as worker, skipping IHDR table fill.") else: fill_ihdr_db() - From 82cdeabd2f8137c60634ad2abda72aec0dada2ab Mon Sep 17 00:00:00 2001 From: Zeecka Date: Mon, 5 Jan 2026 18:01:40 +0100 Subject: [PATCH 2/2] Lightest dockerfile --- .dockerignore | 6 +++++ CONTRIBUTING.md | 4 ++-- Dockerfile | 61 +++++++++++++++++++++++++++---------------------- compose.dev.yml | 4 ++-- compose.yml | 4 ++-- 5 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a809789 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.git +__pycache__ +*.pyc +tests +docs +exemples diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 88ab0eb..c8346db 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -148,10 +148,10 @@ docker exec -it aperisolve-web bash docker exec -it postgres psql -U aperiuser -d aperisolve # Backup all uploaded files -docker cp -r aperisolve-web:/aperisolve/results /path/to/backup/location +docker cp -r aperisolve-web:/app/aperisolve/results /path/to/backup/location # Backup a single uploaded file -docker cp aperisolve-web:/aperisolve/results/filename.ext /path/to/backup/filename.ext +docker cp aperisolve-web:/app/aperisolve/results/filename.ext /path/to/backup/filename.ext ``` > [!WARNING] diff --git a/Dockerfile b/Dockerfile index 1c0ce92..4055aa6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,31 @@ -FROM python:3.14-slim AS build +# ========================== +# Stage 1 : Builder (download OpenStego) +# ========================== +FROM python:3.14-slim AS builder -WORKDIR / - -# Install build tools and dependencies -RUN apt-get update && apt-get install -y \ +# Install wget only to download OpenStego +RUN apt-get update && apt-get install -y --no-install-recommends \ wget \ - default-jdk \ + && rm -rf /var/lib/apt/lists/* + +# Download OpenStego +RUN wget https://github.com/syvaidya/openstego/releases/download/openstego-0.8.6/openstego_0.8.6-1_all.deb \ + -O /tmp/openstego.deb + +# ========================== +# Stage 2 : Image runtime minimale +# ========================== +FROM python:3.14-slim + +WORKDIR /app + +# Install runtime + stego tools +RUN apt-get update && apt-get install -y --no-install-recommends \ + default-jre \ + file \ ruby \ zip \ - 7zip - -# Install steganography and forensics tools -RUN apt-get update && apt-get install -y \ + p7zip-full \ binwalk \ foremost \ exiftool \ @@ -19,27 +33,20 @@ RUN apt-get update && apt-get install -y \ binutils \ outguess \ pngcheck \ - && gem install zsteg + && gem install zsteg \ + && rm -rf /var/lib/apt/lists/* # Install OpenStego -RUN wget https://github.com/syvaidya/openstego/releases/download/openstego-0.8.6/openstego_0.8.6-1_all.deb -O /tmp/openstego.deb && \ - dpkg -i /tmp/openstego.deb && \ - rm /tmp/openstego.deb +COPY --from=builder /tmp/openstego.deb /tmp/openstego.deb +RUN dpkg -i /tmp/openstego.deb || apt-get install -f -y --no-install-recommends \ + && rm -rf /tmp/openstego.deb \ + && rm -rf /var/lib/apt/lists/* -# Copy application -COPY aperisolve/ /aperisolve/ - -RUN mkdir -p /data +# Copy app +COPY aperisolve/ /app/aperisolve/ # Install Python dependencies -RUN pip install --no-cache-dir -r /aperisolve/requirements.txt - -ENV PYTHONUNBUFFERED=1 - -# Auto clean after build -RUN apt-get remove -y wget && \ - apt-get autoremove -y && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* +RUN pip install --no-cache-dir -r /app/aperisolve/requirements.txt +# Commande de lancement CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "--access-logfile", "-", "--error-logfile", "-", "--log-level", "info", "--capture-output", "aperisolve.wsgi:application"] diff --git a/compose.dev.yml b/compose.dev.yml index ce677ea..4d251b5 100644 --- a/compose.dev.yml +++ b/compose.dev.yml @@ -8,7 +8,7 @@ services: ports: - "5000:5000" volumes: - - ./aperisolve:/aperisolve + - ./aperisolve:/app/aperisolve depends_on: postgres: condition: service_healthy @@ -30,7 +30,7 @@ services: restart: always command: rq worker default --url redis://redis:6379/0 volumes: - - ./aperisolve:/aperisolve + - ./aperisolve:/app/aperisolve depends_on: - redis - postgres diff --git a/compose.yml b/compose.yml index 4489e66..f4d1d1f 100644 --- a/compose.yml +++ b/compose.yml @@ -7,7 +7,7 @@ services: ports: - "5000:5000" volumes: - - apresults:/aperisolve/results + - apresults:/app/aperisolve/results depends_on: postgres: condition: service_healthy @@ -31,7 +31,7 @@ services: restart: always command: rq worker default --url redis://redis:6379/0 volumes: - - apresults:/aperisolve/results + - apresults:/app/aperisolve/results depends_on: - redis - postgres