Skip to content

Commit 3751c19

Browse files
authored
Ubuntu 26.04 base (ffmpeg 8, ImageMagick 7), Valkey 9, Postgres 18 (v2.7.0) (#68)
* Ubuntu 26.04 base (ffmpeg 8, ImageMagick 7), Valkey 9, Postgres 18 (v2.7.0) Fixes #67. Base image moves to ubuntu:26.04: FFmpeg 6.1.1 -> 8.0.1 and ImageMagick 6.9 -> 7.1.2. The app pins Python 3.12 via deadsnakes in a dedicated venv (26.04 ships 3.14, which psycopg2-binary has no wheels for). The image checker invokes magick with a convert fallback, the temporal-outlier probe uses pts_time (pkt_pts_time was removed in newer FFmpeg and silently disabled that signal), and kernel header packages are purged from the final image, clearing the unfixable linux-libc-dev CVE tail. Also fixed: the benign ImageMagick warning gates checked for "@warning/png.c" but ImageMagick (6 and 7) emits "@ warning/png.c" with a space, so the benign-classification paths were unreachable; same token fixed in tools/fix_imagemagick_profile_warnings.py. docker-compose defaults change to postgres:18-alpine (BREAKING for existing volumes; the 18+ images also moved the volume mount from /var/lib/postgresql/data to /var/lib/postgresql) and valkey/valkey:9-alpine (drop-in; service name and URLs unchanged). A tested 15->18 dump/restore migration guide is in docs/DOCKER_SETUP.md. CI gains an image-integration job that builds the Docker image and runs the real-media parser tests inside it, since the ffmpeg/ImageMagick stderr parsers fail soft and only break observably against the shipped binaries. Verified: real-media suite passes inside the new image (10/10, including corruption detection on ffmpeg 8 / IM7); fresh compose stack on postgres 18 + valkey 9 scanned 5 samples end-to-end and flagged exactly the 2 planted corrupt files; 15->18 dump/restore dry-run row counts match; host suite 475 passed. * Link migration guide from README docs index; changelog date * Docs accuracy audit + stop media playback when viewer closes Media viewer fix: closing the player modal only hid it, so a playing video or audio file kept playing (and buffering) in the background. closeModal() now pauses any media in the modal and detaches its sources; the viewer close button and outside-click both route through it. Verified in-browser: play, close, playback stops and sources detach for both video and audio. Docs audit: every doc was checked against the codebase by parallel auditors and corrected. Highlights: - docs/api/README.md and docs/examples/* documented endpoints that never existed (/api/scan-all, /api/stats/summary, /api/scan/parallel-v2*, /api/export/csv, /api/cleanup) and omitted authentication; all examples now call real endpoints with Bearer tokens. - DOCKER_SETUP.md's example compose would not have booted (celery_app module, /health healthcheck, missing SECRET_KEY, allkeys-lru eviction); it now mirrors the real docker-compose.yml. - CONFIGURATION.md/INSTALLATION.md described a Celery beat and a four-queue layout that do not exist; replaced with the real APScheduler jobs and the single pixelprobe queue. CELERY_WORKERS (read nowhere) corrected to CELERY_CONCURRENCY everywhere. - PERFORMANCE_TUNING.md rewritten: its entire env-var surface (MAX_SCAN_WORKERS, BATCH_COMMIT_SIZE, ...) never existed in this code. - Pool sizes (5+10, not 20+40), session lifetime (24h, not 30 days), task lists, adaptive chunk tiers, stuck-scan thresholds, module/model inventories all corrected against source. - openapi.yaml: removed duplicate /configurations path key and the nonexistent DELETE /configurations/{id}; schedule scan_type enum now includes file_changes and orphan; export formats csv/json/pdf only. - Removed a hardcoded deployment hostname from FIX_INCOMPLETE_SCANS.md. * Humanizer pass across all documentation Full-file pass over every doc (README, docs/, docs/api, docs/developer, docs/examples, docs/maintenance) removing AI-writing patterns while leaving audited technical facts untouched: significance inflation and promotional adjectives cut, "What it does / Why needed" bullet walls rewritten as prose, boilerplate best-practices lists reduced to their concrete items, duplicate link indexes and say-nothing intros removed, Unicode arrows in prose replaced with ASCII. Also removed two dead links into the gitignored docs/development/ directory and fixed list numbering in TOOLS_AND_SCRIPTS.md. Net 96 lines shorter.
1 parent f9c55a7 commit 3751c19

30 files changed

Lines changed: 1054 additions & 883 deletions

.github/workflows/test.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,28 @@ jobs:
5757
flags: unittests
5858
name: codecov-umbrella
5959
fail_ci_if_error: false
60+
61+
# The ffmpeg/ImageMagick stderr parsers fail soft (zero events, no
62+
# exceptions), so only running them against the image's actual tool
63+
# versions catches regressions from a base-image bump.
64+
image-integration:
65+
runs-on: ubuntu-latest
66+
timeout-minutes: 45
67+
steps:
68+
- uses: actions/checkout@v4
69+
70+
- name: Build Docker image
71+
run: docker build -t pixelprobe-ci .
72+
73+
# -p no:timeout disables the per-test timeout marks (they assume fast
74+
# local hardware); the job-level timeout-minutes is the hang backstop.
75+
- name: Run real-media parser tests inside the image
76+
run: |
77+
docker run --rm -e SECRET_KEY=ci-test-secret pixelprobe-ci \
78+
bash -c "pip install --no-cache-dir -r requirements-test.txt && \
79+
pip uninstall -y chardet 2>/dev/null; \
80+
pytest tests/test_real_media_samples.py -v -p no:cacheprovider -p no:timeout -o addopts=''"
81+
82+
- name: Verify tool versions in image
83+
run: |
84+
docker run --rm pixelprobe-ci bash -c "ffmpeg -version | head -1 && magick -version | head -1 && python --version"

CHANGELOG.MD

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,28 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0).
77

8+
## [2.7.0] - 2026-07-16
9+
10+
### Breaking
11+
12+
- **docker-compose.yml now defaults to PostgreSQL 18 (#67).** PostgreSQL data directories are not portable across major versions: an existing `postgres_data` volume created by PostgreSQL 15 will not start on the 18 image. Follow the new migration guide in docs/DOCKER_SETUP.md (dump on 15, restore into 18, refresh collation) BEFORE pulling the new compose file, or pin `postgres:15-alpine` to stay. The application itself works with PostgreSQL 15 through 18, so only the compose default is breaking - existing deployments that manage their own database are unaffected until they choose to migrate.
13+
14+
### Changed
15+
16+
- **Base image upgraded to Ubuntu 26.04 (#67).** FFmpeg 6.1.1 becomes 8.0.1 (faster demuxing/probing) and ImageMagick 6.9 becomes 7.1.2. The app pins Python 3.12 via deadsnakes and runs from a dedicated virtualenv (Ubuntu 26.04 ships 3.14, which psycopg2-binary has no wheels for yet). The image checker now invokes `magick` when available, falling back to `convert` on ImageMagick 6 systems, and the temporal-outlier probe uses `pts_time` (its `pkt_pts_time` field was removed in newer FFmpeg, which silently disabled that signal). Kernel header packages are purged from the final image, clearing the long tail of unfixable linux-libc-dev CVEs from scans.
17+
- **Task broker image switched from Redis 7 to Valkey 9 (#67).** Drop-in replacement: the compose service name, all redis:// URLs, and the wire protocol are unchanged, and the Valkey image ships redis-* compatibility symlinks. Valkey stays open source (BSD) while Redis moved away from it after 7.2.
18+
19+
### Fixed
20+
21+
- **Closing the media viewer now actually stops playback.** The viewer modal was only hidden on close, so a playing video or audio file kept playing (and buffering) in the background. Closing now pauses the player and detaches its sources.
22+
- **Documentation accuracy audit.** All docs were checked against the codebase and corrected: removed endpoints that never existed (`/api/scan-all`, `/api/stats/summary`, `/api/scan/parallel-v2*`, `/api/export/csv`, `/api/cleanup`), fixed the example compose file (broken celery command, wrong healthcheck path, missing SECRET_KEY, fictional CELERY_WORKERS/REDIS_HOST vars), replaced the nonexistent Celery beat with the real APScheduler jobs, corrected pool sizes, session lifetime, task lists, chunking behavior, and rewrote PERFORMANCE_TUNING.md around env vars that actually exist. Example API clients now authenticate and call real endpoints. openapi.yaml: removed a duplicate path key and a nonexistent DELETE route, completed the schedule scan_type enum.
23+
- **Benign ImageMagick warning classification never matched.** The gates that classify PNG chunk and profile warnings as non-corruption checked for `@warning/png.c`, but ImageMagick (6 and 7 alike) emits `@ warning/png.c` with a space - so the benign-warning paths were unreachable and such files fell through to the generic error-keyword check. Verified against real ImageMagick output on both versions.
24+
25+
### Added
26+
27+
- **CI now builds the Docker image and runs the real-media parser tests inside it.** The FFmpeg/ImageMagick stderr parsers fail soft (a format change yields zero detections rather than an error), so unit tests on the runner's own tool versions cannot catch a base-image regression. The new job exercises corruption detection against the exact ffmpeg 8 / ImageMagick 7 binaries that ship in the image.
28+
- **PostgreSQL 15 to 18 migration guide** in docs/DOCKER_SETUP.md, including volume backup, restore verification, and collation refresh.
29+
830
## [2.6.65] - 2026-07-15
931

1032
### Fixed

Dockerfile

Lines changed: 55 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1-
FROM ubuntu:24.04
1+
FROM ubuntu:26.04
22

33
# Prevent interactive prompts during package installation
44
ENV DEBIAN_FRONTEND=noninteractive
55

6-
# Install Python and latest media tools
7-
# Ubuntu 24.04 includes:
8-
# - FFmpeg 6.1.1 (much newer than 22.04's 4.4.2)
9-
# - ImageMagick 6.9.13 (newer than 22.04's 6.9.11)
10-
# - Python 3.12 by default
6+
# Ubuntu 26.04 includes:
7+
# - FFmpeg 8.0.1 (vs 6.1.1 on 24.04)
8+
# - ImageMagick 7.1.2 (Q16; 'magick' CLI, 'convert' kept via alternatives)
9+
# - Python 3.14 by default; the app runs on 3.12 from deadsnakes (matches the
10+
# tested CI matrix and available psycopg2-binary wheels)
1111
RUN apt-get update && \
12+
apt-get install -y software-properties-common && \
13+
add-apt-repository ppa:deadsnakes/ppa && \
14+
apt-get update && \
1215
apt-get upgrade -y && \
1316
apt-get install -y \
14-
# Python and pip
15-
python3 \
16-
python3-dev \
17-
python3-venv \
18-
python3-pip \
17+
# Python 3.12 (deadsnakes)
18+
python3.12 \
19+
python3.12-dev \
20+
python3.12-venv \
1921
# Node.js for frontend build \
2022
nodejs \
2123
npm \
@@ -24,11 +26,12 @@ RUN apt-get update && \
2426
libmagic1 \
2527
curl \
2628
wget \
27-
# ImageMagick and dependencies (24.04 uses ImageMagick 7) \
29+
# ImageMagick 7 (Q16, non-HDRI) and extra codecs \
2830
imagemagick \
29-
libmagickcore-6.q16hdri-7-extra \
30-
libmagickwand-6.q16hdri-7 \
31-
# Image format libraries (updated versions in 24.04) \
31+
imagemagick-7.q16 \
32+
libmagickcore-7.q16-10-extra \
33+
libmagickwand-7.q16-10 \
34+
# Image format libraries \
3235
libjpeg-turbo8 \
3336
libjpeg-dev \
3437
libpng16-16t64 \
@@ -60,28 +63,31 @@ RUN apt-get update && \
6063
libfreetype6-dev \
6164
libfontconfig1 \
6265
libfontconfig1-dev \
63-
&& rm -rf /var/lib/apt/lists/*
64-
65-
# Python 3.12 is already default in Ubuntu 24.04
66-
# Just create python symlink for compatibility
67-
RUN ln -s /usr/bin/python3 /usr/bin/python
68-
69-
# Configure ImageMagick to allow all file formats and increase resource limits
70-
# Ubuntu 22.04 uses ImageMagick 6
71-
RUN sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/g' /etc/ImageMagick-6/policy.xml && \
72-
sed -i 's/<policy domain="coder" rights="none" pattern="HEIC" \/>/<policy domain="coder" rights="read|write" pattern="HEIC" \/>/g' /etc/ImageMagick-6/policy.xml && \
73-
sed -i 's/<policy domain="coder" rights="none" pattern="HEIF" \/>/<policy domain="coder" rights="read|write" pattern="HEIF" \/>/g' /etc/ImageMagick-6/policy.xml && \
74-
sed -i 's/<policy domain="resource" name="memory" value=".*"\/>/<policy domain="resource" name="memory" value="2GiB"\/>/g' /etc/ImageMagick-6/policy.xml && \
75-
sed -i 's/<policy domain="resource" name="map" value=".*"\/>/<policy domain="resource" name="map" value="4GiB"\/>/g' /etc/ImageMagick-6/policy.xml && \
76-
sed -i 's/<policy domain="resource" name="disk" value=".*"\/>/<policy domain="resource" name="disk" value="8GiB"\/>/g' /etc/ImageMagick-6/policy.xml
66+
&& rm -rf /var/lib/apt/lists/* \
67+
# pebble ships in the ubuntu:26.04 OCI rootfs (not dpkg-owned); unused
68+
# here and its embedded Go deps carry unfixed HIGH CVEs, so drop it
69+
&& rm -rf /usr/bin/pebble /var/lib/pebble
70+
71+
# All app Python runs from this venv (python/pip/gunicorn/celery resolve here).
72+
# A venv avoids pip 26+ conflicts with the system 3.14 dist-packages.
73+
RUN python3.12 -m venv /opt/venv
74+
ENV PATH="/opt/venv/bin:$PATH"
75+
76+
# Configure ImageMagick 7: raise resource limits for large media. The 26.04
77+
# default policy only sets disk=2GiB (no PDF/HEIC coder blocks to lift).
78+
RUN sed -i 's|<policy domain="resource" name="disk" value=".*"/>|<policy domain="resource" name="disk" value="8GiB"/>|' /etc/ImageMagick-7/policy.xml && \
79+
sed -i 's|</policymap>| <policy domain="resource" name="memory" value="2GiB"/>\n <policy domain="resource" name="map" value="4GiB"/>\n</policymap>|' /etc/ImageMagick-7/policy.xml && \
80+
# Fail the build if the seds silently matched nothing (policy format drift)
81+
grep -q '"disk" value="8GiB"' /etc/ImageMagick-7/policy.xml && \
82+
grep -q '"memory" value="2GiB"' /etc/ImageMagick-7/policy.xml && \
83+
grep -q '"map" value="4GiB"' /etc/ImageMagick-7/policy.xml
7784

7885
# Configure libpng and ImageMagick to handle benign PNG errors better
7986
# These environment variables tell libpng to be less strict
8087
ENV PNG_SKIP_SETJMP_CHECK=1
8188
ENV PNG_IGNORE_ADLER32=1
8289

83-
# Set ImageMagick to be less verbose about warnings
84-
ENV MAGICK_CONFIGURE_PATH=/etc/ImageMagick-6
90+
ENV MAGICK_CONFIGURE_PATH=/etc/ImageMagick-7
8591

8692
# Configure FFmpeg for optimal performance and compatibility
8793
# Set thread count for better performance
@@ -106,31 +112,36 @@ RUN ffmpeg -version && \
106112
ffmpeg -decoders 2>/dev/null | grep -E "(hevc|h264|h265|av1|vp9)" && \
107113
ffmpeg -encoders 2>/dev/null | grep -E "(libx264|libx265|libvpx)" && \
108114
echo "=== ImageMagick Version and Delegates ===" && \
109-
convert -version && \
115+
magick -version && \
110116
echo "=== ImageMagick Delegate Libraries ===" && \
111-
convert -list delegate | head -30 && \
117+
magick -list delegate | head -30 && \
112118
echo "=== ImageMagick Supported Formats ===" && \
113-
identify -list format | grep -E "(JPEG|JPG|PNG|WEBP|GIF|TIFF|HEIC)" && \
119+
magick identify -list format | grep -E "(JPEG|JPG|PNG|WEBP|GIF|TIFF|HEIC)" && \
114120
echo "=== Testing ImageMagick with sample images ===" && \
115121
# Test JPEG support \
116-
convert -size 100x100 xc:white /tmp/test.jpg && \
117-
identify -verbose /tmp/test.jpg | head -5 && \
122+
magick -size 100x100 xc:white /tmp/test.jpg && \
123+
magick identify -verbose /tmp/test.jpg | head -5 && \
118124
# Test PNG support \
119-
convert -size 100x100 xc:white /tmp/test.png && \
120-
identify -verbose /tmp/test.png | head -5 && \
125+
magick -size 100x100 xc:white /tmp/test.png && \
126+
magick identify -verbose /tmp/test.png | head -5 && \
121127
# Test WebP support \
122-
convert -size 100x100 xc:white /tmp/test.webp && \
123-
identify -verbose /tmp/test.webp | head -5 && \
128+
magick -size 100x100 xc:white /tmp/test.webp && \
129+
magick identify -verbose /tmp/test.webp | head -5 && \
124130
# Clean up test files \
125131
rm -f /tmp/test.jpg /tmp/test.png /tmp/test.webp && \
126132
echo "=== All image format tests passed ==="
127133

128134
COPY requirements.txt .
129-
# Ubuntu 24.04 requires --break-system-packages for pip install in Docker
130135
# After install, remove chardet (pulled in by reportlab) -- its 7.x version fails
131136
# requests' version check (requires <6.0.0). Our app uses charset_normalizer instead.
132-
RUN pip install --no-cache-dir --break-system-packages --ignore-installed -r requirements.txt \
133-
&& pip uninstall -y chardet --break-system-packages 2>/dev/null; true
137+
RUN pip install --no-cache-dir -r requirements.txt \
138+
&& pip uninstall -y chardet 2>/dev/null; true
139+
140+
# Build headers were only needed for pip C-extension builds above; linux-libc-dev
141+
# otherwise ships a stream of unfixed kernel-header CVEs the runtime never touches.
142+
RUN apt-get purge -y linux-libc-dev python3.12-dev 2>/dev/null; \
143+
apt-get autoremove -y 2>/dev/null; \
144+
rm -rf /var/lib/apt/lists/* /root/.cache
134145

135146
COPY package.json webpack.config.js ./
136147
RUN npm install
@@ -162,4 +173,4 @@ ENV FLASK_ENV=production
162173
# The app will read the version from version.py directly
163174

164175
# Bind/workers/timeout/logging live in gunicorn.conf.py (GUNICORN_* env overrides)
165-
CMD ["gunicorn", "-c", "gunicorn.conf.py", "app:app"]
176+
CMD ["gunicorn", "-c", "gunicorn.conf.py", "app:app"]

README.md

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,21 @@ PixelProbe detects corrupted video, image, and audio files across your media lib
3232
- **Rolling integrity queue**: Integrity checks sweep the library stalest-first in batches and resume where they left off; schedules can carry a per-run time budget so no single run monopolizes IO
3333
- **Scheduled automated scans**: Cron expressions or simple intervals for hands-free monitoring
3434
- **Smart exclusions**: Configure paths and file extensions to skip
35-
- **Phase-based scanning**: Discovery Database Validation workflow
35+
- **Phase-based scanning**: Discovery -> Database -> Validation workflow
3636
- **Bulk operations**: Rescan multiple files, deep analysis, batch actions
3737

3838
### Web Interface
39-
- Modern responsive design with dark/light theme support
39+
- Responsive design with dark/light theme support
4040
- Real-time scan progress with live polling updates
41-
- Advanced filtering and search capabilities
41+
- Filtering and search
4242
- Bulk file selection and management with shift-click range selection
4343
- Mobile-optimized touch interface
4444
- In-browser media file viewing and streaming
4545
- Detailed file corruption reports
4646

4747
### System Features
48-
- **PostgreSQL database**: Reliable ACID-compliant data storage
49-
- **Redis-backed task queue**: Background processing with Celery workers
48+
- **PostgreSQL database**: Stores scan results, users, schedules, and history
49+
- **Redis-compatible task queue (Valkey)**: Background processing with Celery workers
5050
- **Docker deployment**: Multi-container architecture (web, workers, database, queue)
5151
- **REST API**: Full OpenAPI/Swagger documentation
5252
- **Monitoring & Reports**: Real-time statistics, trend analytics, storage projections, PDF/JSON exports, complete audit trail
@@ -60,7 +60,7 @@ PixelProbe detects corrupted video, image, and audio files across your media lib
6060
- **API token authentication**: Generate and manage tokens for programmatic access
6161
- **Session management**: Cookie-based sessions with CSRF protection, configurable timeout
6262
- **First-run setup wizard**: Secure admin account creation on initial deployment
63-
- **Audit logging**: Complete security event tracking
63+
- **Audit logging**: Security event tracking
6464

6565
## Screenshots
6666

@@ -105,11 +105,7 @@ Full feature parity with a high-contrast dark theme. Preference persists across
105105
<img src="docs/screenshots/mobile-dark-dashboard.png" alt="Mobile Dark Dashboard" width="300" style="margin: 10px">
106106
</div>
107107

108-
The mobile interface is fully responsive and touch-optimized:
109-
- Adaptive layout that works on all screen sizes
110-
- Touch-friendly buttons and controls
111-
- Collapsible sidebar navigation
112-
- Card-based design for scan results on mobile
108+
The mobile layout has a collapsible sidebar and shows scan results as cards instead of a table.
113109

114110
### Advanced Features
115111

@@ -141,7 +137,7 @@ Skip specific directories or file extensions. Changes take effect on the next sc
141137
## Documentation
142138

143139
### Installation & Setup
144-
- [Docker Setup Guide](docs/DOCKER_SETUP.md) - Complete Docker Compose setup with container explanations
140+
- [Docker Setup Guide](docs/DOCKER_SETUP.md) - Complete Docker Compose setup with container explanations, including the PostgreSQL 15 to 18 migration guide
145141
- [Installation Guide](docs/INSTALLATION.md) - Detailed installation instructions
146142
- [Configuration Guide](docs/CONFIGURATION.md) - Environment variables and configuration options
147143

@@ -194,6 +190,7 @@ Skip specific directories or file extensions. Changes take effect on the next sc
194190

195191
# Edit .env file with your values
196192
SECRET_KEY=your-generated-secret-key-here
193+
POSTGRES_PASSWORD=your-secure-database-password
197194
MEDIA_PATH=/path/to/your/actual/media/directory
198195
SCAN_PATHS=/media
199196
```
@@ -235,6 +232,13 @@ PixelProbe is available on Docker Hub as `ttlequals0/pixelprobe`:
235232

236233
**Important**: PixelProbe requires PostgreSQL.
237234

235+
**Upgrading to v2.7.0**: the bundled docker-compose.yml now defaults to
236+
PostgreSQL 18 and Valkey 9. The app works with PostgreSQL 15-18 and any
237+
Redis-compatible broker, but an existing PostgreSQL 15 data volume will not
238+
start on the 18 image - follow the migration guide in
239+
[docs/DOCKER_SETUP.md](docs/DOCKER_SETUP.md#postgresql-15-to-18-migration-required-for-v270)
240+
before switching, or pin `postgres:15-alpine` in your compose file.
241+
238242
## Configuration
239243

240244
### Environment Variables
@@ -243,6 +247,7 @@ PixelProbe uses environment variables for all configuration. Copy `.env.example`
243247

244248
**Required Variables:**
245249
- `SECRET_KEY` - Secure secret key for Flask sessions
250+
- `POSTGRES_PASSWORD` - PostgreSQL password (compose refuses to start without it)
246251
- `MEDIA_PATH` - Host path to your media files (for Docker volume mounting)
247252

248253
**Optional Variables:**
@@ -312,12 +317,7 @@ export MEDIA_PATH=/mnt/all-media # Contains subdirs: movies/, tv/, backup/
312317

313318
### API Documentation
314319

315-
PixelProbe provides a REST API with OpenAPI/Swagger documentation.
316-
317-
#### Interactive API Documentation
318-
- **Swagger UI**: Available at `/api/v1/docs` when logged in
319-
- **OpenAPI Spec**: Full API specification with request/response schemas
320-
- **Try it out**: Test endpoints directly from the documentation
320+
Swagger UI is available at `/api-docs` when logged in. It includes the full OpenAPI spec with request/response schemas, and you can test endpoints directly from the page.
321321

322322
#### Authentication Endpoints
323323
- `GET /api/auth/status` - Check authentication status
@@ -482,9 +482,14 @@ for result in results:
482482
cd PixelProbe
483483
```
484484

485-
2. **Use development compose file**:
485+
2. **Run locally** (see [docs/INSTALLATION.md](docs/INSTALLATION.md) for the full manual setup):
486486
```bash
487-
docker-compose -f docker-compose.dev.yml up -d
487+
python3 -m venv venv && source venv/bin/activate
488+
pip install -r requirements.txt
489+
# Terminal 1: web app
490+
python app.py
491+
# Terminal 2: Celery worker
492+
python celery_worker.py
488493
```
489494

490495
### Testing
@@ -520,7 +525,7 @@ If you encounter **"no such table: scan_results"** errors after upgrading:
520525

521526
```bash
522527
# Quick fix
523-
docker exec pixelprobe python tools/fix_database_schema.py
528+
docker exec pixelprobe-app python tools/fix_database_schema.py
524529
```
525530

526531
### Common Issues
@@ -542,7 +547,7 @@ docker exec pixelprobe python tools/fix_database_schema.py
542547

543548
### Getting Help
544549

545-
1. **Check logs first**: `docker logs pixelprobe`
550+
1. **Check logs first**: `docker logs pixelprobe-app`
546551
2. **Search existing issues**: [GitHub Issues](https://github.com/ttlequals0/PixelProbe/issues)
547552
3. **Create new issue**: Include logs and system info
548553

0 commit comments

Comments
 (0)