Data Validation Platform (DVP) Windows 10/11 Installation Guide

Step-by-step instructions for deploying DVP on Windows using Docker Desktop and Docker Compose

advancedFebruary 19, 2026
Serpentua

Data Validation Platform (DVP)
Windows Installation Guide

Step-by-step instructions for deploying DVP on Windows using Docker Desktop and Docker Compose

PlatformWindows 10 (Build 19041+) / Windows 11
ApplicationPython 3.13 / Flask
DatabaseMySQL 8.0
RuntimeDocker Desktop & Docker Compose
Port8443 (HTTP)
Section 1

Overview

The Serpentua Data Validation Platform (DVP) is a web-based file integrity monitoring system. It continuously scans files and directories using SHA-256 checksums, alerts you when files are modified or deleted, and provides reporting and export capabilities.

DVP is delivered as a Docker Compose application consisting of two containers:

Container Image Role
app Built from Dockerfile (Python 3.13-slim) Flask web application — serves the UI on port 8443
db mysql:8.0 MySQL database — stores assets, checksums, and alerts
The application container mounts a Windows drive into the container at /host (read-only), allowing DVP to scan any local path without installing agents on individual machines.
Section 2

Prerequisites

Before you begin, confirm the following:

  • Windows 10 64-bit (Build 19041 or later) or Windows 11 — Home, Pro, Enterprise, or Education
  • An account with Administrator privileges
  • Hardware virtualisation enabled in BIOS/UEFI (Intel VT-x or AMD-V)
  • At least 4 GB RAM available (Docker Desktop requires a minimum of 4 GB)
  • Internet access (to download Docker Desktop, images, and Python packages)
  • At least 2 GB of free disk space for images and the MySQL data volume
  • Ports 8443 and 3306 not already in use
  • The DVP project files (folder serpentua-dvp-docker\)
Section 3

System Preparation — Enable WSL2

Docker Desktop on Windows uses the Windows Subsystem for Linux 2 (WSL2) backend for best performance. You must enable WSL2 before installing Docker Desktop.

Run all PowerShell commands below in a PowerShell window opened as Administrator. Right-click the Start menu, choose Windows Terminal (Admin) or Windows PowerShell (Admin).

3.1 — Enable WSL and the Virtual Machine Platform

PowerShell (Administrator) — enable required Windows features
PS> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
PS> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

Restart your computer after running both commands before continuing.

3.2 — Set WSL2 as the default version

PowerShell (Administrator)
PS> wsl --set-default-version 2
If you see a message about updating the WSL2 kernel, run wsl --update and then retry the command above.
Section 4

Install Docker Desktop

On Windows, Docker is installed via Docker Desktop — an all-in-one installer that includes Docker Engine, Docker Compose, and the WSL2 integration. Do not attempt to install Docker Engine directly on Windows.

4.1 — Download Docker Desktop

Go to docker.com/products/docker-desktop in your browser and download the Docker Desktop Installer for Windows (the .exe file).

4.2 — Run the installer

1

Launch the installer

Double-click Docker Desktop Installer.exe. Accept the UAC prompt when asked.

2

Choose the WSL2 backend

On the configuration screen, ensure "Use WSL 2 instead of Hyper-V" is checked. Click Ok.

3

Complete the installation

Wait for the installer to finish, then click Close and restart to reboot.

4

Launch Docker Desktop

After reboot, Docker Desktop will start automatically. Wait for the whale icon in the system tray to stop animating — this means the Docker Engine is running.

4.3 — Verify the installation

Open a new PowerShell or Command Prompt window (no administrator rights needed) and run:

PowerShell — expected output shown below each command
PS> docker --version
Docker version 27.x.x, build xxxxxxx

PS> docker compose version
Docker Compose version v2.x.x

4.4 — Enable drive sharing (if prompted)

Docker Desktop may ask for permission to share your local drives so that containers can access files on your Windows filesystem. When prompted, click Share it. You can also manage this manually:

Open Docker Desktop → SettingsResourcesFile Sharing, and confirm that the drive containing your project files (typically C:) is listed and enabled.

Section 5

Get the Application Source

Copy the serpentua-dvp-docker project folder to your Windows machine. Choose the method that suits your situation:

Option A — Clone from a Git repository

If Git is not installed, download it from git-scm.com and run the installer with default settings. Then open PowerShell and run:

PowerShell
PS> git clone <repository-url> C:\serpentua-dvp
PS> cd C:\serpentua-dvp

Option B — Copy an existing folder

Use File Explorer to copy the serpentua-dvp-docker folder to a convenient location, for example C:\serpentua-dvp. Alternatively, use PowerShell:

PowerShell
PS> Copy-Item -Recurse "D:\Downloads\serpentua-dvp-docker" "C:\serpentua-dvp"

Option C — Extract from a ZIP archive

PowerShell — extract archive to C:\serpentua-dvp
PS> Expand-Archive -Path "C:\Downloads\serpentua-dvp-docker.zip" `
    -DestinationPath "C:\serpentua-dvp"
PS> cd "C:\serpentua-dvp\serpentua-dvp-docker"

After this step you should be inside a directory that contains, at a minimum: Dockerfile, docker-compose.yml, requirements.txt, runserver.py, .env, and the dvp\ folder.

Section 6

Configure the Environment

All runtime settings are read from the .env file in the project root. Open it with Notepad, Notepad++, or VS Code:

PowerShell — open .env in Notepad
PS> notepad .env

The file contains the following variables:

.env — default contents
DB_USER=dvp
DB_PASSWORD=ChangeMe!123
DB_NAME=dvp_app
DB_HOST=db
MYSQL_ROOT_PASSWORD=rootpassword
SERVER_HOST=0.0.0.0
SERVER_PORT=8443
Variable Default Description
DB_USER dvp MySQL application user name
DB_PASSWORD see file Password for the MySQL application user — change this
DB_NAME dvp_app Name of the MySQL database
DB_HOST db Internal Docker service name — do not change
MYSQL_ROOT_PASSWORD see file MySQL root password — change this
SERVER_HOST 0.0.0.0 Flask bind address — leave as-is to listen on all interfaces
SERVER_PORT 8443 Port the application listens on
Always change the default passwords before going into production. Use strong, unique values for both DB_PASSWORD and MYSQL_ROOT_PASSWORD. The .env file should never be committed to a public Git repository.

Save and close the file after making your changes.

Section 7

Build & Launch the Application

Open PowerShell, navigate to the project root directory, and run:

PowerShell — navigate to the project folder, then build and start
PS> cd C:\serpentua-dvp\serpentua-dvp-docker
PS> docker compose up -d --build

Docker will:

1

Pull the MySQL 8.0 image

Downloaded from Docker Hub (~600 MB on first run).

2

Build the application image

Uses python:3.13-slim as the base, installs gcc + libffi-dev, then installs all Python packages from requirements.txt.

3

Start the db container

MySQL initialises the database and creates the user defined in .env. A health check polls every 10 seconds.

4

Start the app container

Waits for the database health check to pass, then launches the Flask server on port 8443.

The first build takes several minutes because Python packages must be compiled and downloaded. Subsequent starts are much faster as Docker caches the image layers.

Watching the logs in real time

PowerShell
# Follow logs for all containers
PS> docker compose logs -f

# Follow logs for the app container only
PS> docker compose logs -f app
Section 8

Verify the Installation

Check container status

PowerShell
PS> docker compose ps

Both containers should show a status of running. The db container should show healthy.

expected output (approximate)
NAME                    IMAGE          STATUS          PORTS
dvp-app-1               dvp-app        Up 2 minutes    0.0.0.0:8443->8443/tcp
dvp-db-1                mysql:8.0      Up 2 minutes    0.0.0.0:3306->3306/tcp (healthy)

Access the web interface

Open a browser and navigate to:

URL — local access
http://localhost:8443

Or, from another machine on the same network:

URL — remote access
http://<server-ip-address>:8443
If the DVP dashboard loads in your browser, the installation is complete and the application is running correctly.
Section 9

File Path Mapping

The Docker Compose file mounts the Windows C:\ drive into the container at /host (read-only). When you add asset paths inside the DVP UI, you must use the container path, not the Windows path. Replace the drive letter and backslashes with the /host prefix and forward slashes.

Host Path (Windows) Container Path to Enter in DVP
C:\Users\alice\Documents /host/Users/alice/Documents
C:\ProgramData\MyApp /host/ProgramData/MyApp
C:\inetpub\wwwroot /host/inetpub/wwwroot
C:\Logs\AppLogs /host/Logs/AppLogs
C:\Data\Backups /host/Data/Backups
The general rule: strip the drive letter (C:\), prepend /host/, and replace all backslashes (\) with forward slashes (/). For example, C:\Users\alice\data becomes /host/Users/alice/data.
Only files on the C: drive are accessible by default. If you need to monitor files on another drive (e.g., D:\), the volume mount in docker-compose.yml must be updated to include that drive, and a new prefix (e.g., /host-d/) would need to be configured accordingly.
Section 10

Firewall & Remote Access

Windows Defender Firewall may block inbound connections on port 8443. When Docker Desktop starts a container that binds a port, Windows will often prompt you to allow access. If no prompt appeared, or if remote machines cannot reach the web UI, add the rule manually.

Add an inbound firewall rule via PowerShell

PowerShell (Administrator) — open port 8443 for DVP
PS> New-NetFirewallRule `
    -DisplayName "Serpentua DVP Web" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 8443 `
    -Action Allow

Verify the rule was created

PowerShell
PS> Get-NetFirewallRule -DisplayName "Serpentua DVP Web" | Select-Object DisplayName, Enabled, Direction

Add the rule via the GUI (alternative)

Open Windows Defender Firewall with Advanced Security (search in Start menu) → Inbound RulesNew Rule → select Port, enter 8443, choose Allow the connection, apply to all profiles, and name the rule Serpentua DVP Web.

Port 3306 (MySQL) is exposed on all interfaces by the default docker-compose.yml. In a production environment, consider removing the ports entry from the db service so MySQL is only accessible internally between containers.
Section 11

Auto-Start on Boot

Docker Desktop auto-start (recommended)

Both containers already have restart: unless-stopped set in docker-compose.yml, which means they will restart automatically whenever the Docker Engine restarts. Enable Docker Desktop to start with Windows by opening Docker Desktop → Settings (gear icon) → General → check "Start Docker Desktop when you sign in to your computer" → click Apply & Restart.

With Docker Desktop set to start on login and the containers configured with restart: unless-stopped, DVP will come back up automatically after a reboot without any additional configuration.

Optional — Task Scheduler startup task

If you need the containers to start before any user logs in (e.g., on a server), use Windows Task Scheduler to run docker compose up -d at system startup:

PowerShell (Administrator) — create a scheduled task
PS> $action = New-ScheduledTaskAction `
    -Execute "docker" `
    -Argument "compose up -d" `
    -WorkingDirectory "C:\serpentua-dvp\serpentua-dvp-docker"

PS> $trigger = New-ScheduledTaskTrigger -AtStartup

PS> Register-ScheduledTask `
    -TaskName "Serpentua DVP" `
    -Action $action `
    -Trigger $trigger `
    -RunLevel Highest `
    -User "SYSTEM"

To verify the task was created:

PowerShell
PS> Get-ScheduledTask -TaskName "Serpentua DVP"
Section 12

Day-to-Day Management

Run all management commands from a PowerShell window inside the project directory (C:\serpentua-dvp\serpentua-dvp-docker).

Task Command
Start all containersdocker compose up -d
Stop all containersdocker compose down
Restart all containersdocker compose restart
View live logsdocker compose logs -f
View app logs onlydocker compose logs -f app
Check container statusdocker compose ps
Open a shell in the app containerdocker compose exec app bash
Open a MySQL shelldocker compose exec db mysql -u dvp -p dvp_app
Rebuild after code changesdocker compose up -d --build
Remove containers (keeps data)docker compose down
Remove containers + volumes (deletes DB)docker compose down -v

Updating the application

PowerShell — pull latest code and rebuild
PS> git pull                      # if using git
PS> docker compose down
PS> docker compose up -d --build

Database backups

PowerShell — dump the database to a file
PS> $date = Get-Date -Format "yyyyMMdd"
PS> docker compose exec db mysqldump -u dvp -p dvp_app > "dvp_backup_$date.sql"
Section 13

Troubleshooting

Container fails to start — "port already in use"

Another process is already listening on port 8443 or 3306.

PowerShell — find what is using the port
PS> netstat -ano | findstr :8443
PS> netstat -ano | findstr :3306

Note the PID from the last column and find the process in Task Manager (Details tab), or use: Get-Process -Id <PID>. Stop the conflicting process, or change the port mapping in docker-compose.yml (e.g., "8080:8443" maps host port 8080 to container port 8443).

App container restarts repeatedly

PowerShell — inspect the error
PS> docker compose logs app

Common causes:

  • Database not yet ready — the app may have started before MySQL finished initialising. Wait 30 seconds and run docker compose restart app.
  • Wrong credentials in .env — ensure DB_USER, DB_PASSWORD, and DB_NAME match what MySQL was initialised with.
  • Missing .env file — make sure the file exists in the same directory as docker-compose.yml. Note: Windows File Explorer may hide file extensions; confirm the file is named .env and not .env.txt.

Database container health check failing

PowerShell
PS> docker compose logs db

If you see InnoDB or permission errors, the MySQL data volume may be corrupted or initialised with different credentials. Remove the volume and start fresh:

The following command permanently deletes all data in the MySQL volume. Take a backup first if you have data to preserve.
PowerShell — destructive: removes all database data
PS> docker compose down -v
PS> docker compose up -d --build

Cannot access the web UI from another machine

  • Confirm the firewall rule exists: Get-NetFirewallRule -DisplayName "Serpentua DVP Web" — the rule should show Enabled: True.
  • Confirm Docker is listening: netstat -ano | findstr :8443.
  • Check that any external firewall, router, or cloud security group also allows port 8443.
  • Try disabling Windows Defender Firewall temporarily to rule it out as the cause.

Docker Desktop does not start / whale icon not appearing

  • Confirm WSL2 is installed correctly: open PowerShell and run wsl --status.
  • Confirm virtualisation is enabled: open Task Manager → Performance tab → CPU — Virtualisation: Enabled should appear.
  • Try restarting Docker Desktop from the system tray: right-click the whale icon → Restart.
  • Review Docker Desktop logs at %APPDATA%\Docker\log.txt.

Line-ending issues with shell scripts in the container

Windows uses CRLF (\r\n) line endings while Linux expects LF (\n). If startup scripts fail inside the container with "No such file or directory" errors, configure Git to not alter line endings:

PowerShell — configure Git to preserve LF line endings
PS> git config --global core.autocrlf false

Then re-clone or re-checkout the project files.

Section 14

Uninstalling

Stop and remove containers and volumes

PowerShell
PS> cd C:\serpentua-dvp\serpentua-dvp-docker
PS> docker compose down -v     # stops containers and deletes the MySQL volume

Remove the Docker images

PowerShell
PS> docker images --filter "reference=dvp*" -q | ForEach-Object { docker image rm $_ }
PS> docker image rm mysql:8.0
PS> docker image prune -f    # remove any dangling build-cache images

Remove the project files

PowerShell
PS> Remove-Item -Recurse -Force "C:\serpentua-dvp"

Remove the firewall rule

PowerShell (Administrator)
PS> Remove-NetFirewallRule -DisplayName "Serpentua DVP Web"

Optionally uninstall Docker Desktop

Open Windows SettingsApps → search for Docker Desktop → click Uninstall. This will remove Docker Desktop and all associated data including any remaining images and volumes.

The Docker Desktop uninstaller does not remove WSL2 or the Linux distributions installed alongside it. If you no longer need WSL2, you can disable it from Turn Windows features on or off → uncheck Windows Subsystem for Linux and Virtual Machine Platform.