Data Validation Platform (DVP) macOS Installation Guide

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

advancedFebruary 19, 2026
Serpentua

Data Validation Platform (DVP)
macOS Installation Guide

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

PlatformmacOS 12 Monterey+ (Intel & Apple Silicon)
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 the host's filesystem 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:

  • macOS 12 Monterey or later — Intel or Apple Silicon (M1 / M2 / M3)
  • An account with Administrator (sudo) privileges
  • Internet access (to download Docker Desktop, images, and Python packages)
  • At least 4 GB RAM available (Docker Desktop requires a minimum of 4 GB)
  • 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

3.1 — Verify your macOS version

Open the Terminal application (find it in Finder → Applications → Utilities → Terminal, or press ⌘ + Space and type Terminal) and run:

Terminal — check macOS version
$ sw_vers -productVersion
12.x.x  (must be 12.0 or later)

3.2 — Install Xcode Command Line Tools

The Xcode Command Line Tools provide git and other utilities needed during installation. If they are not already installed, run:

Terminal
$ xcode-select --install

A dialog will appear asking you to install the tools. Click Install and wait for the download to complete (~500 MB). If the tools are already installed you will see the message "xcode-select: error: command line tools are already installed" — that is fine, continue to the next step.

3.3 — (Apple Silicon only) Install Rosetta 2

If your Mac has an Apple Silicon chip (M1, M2, or M3), install Rosetta 2 so that Docker can run x86_64 container images when needed:

Terminal — Apple Silicon only
$ softwareupdate --install-rosetta --agree-to-license
Not sure which chip you have? Click the Apple menu → About This Mac. If you see Apple M1 / M2 / M3 under the chip field, you have Apple Silicon. If you see an Intel Core processor listed, you have an Intel Mac and can skip this step.
Section 4

Install Docker Desktop

On macOS, Docker is installed via Docker Desktop — an all-in-one application that includes Docker Engine and Docker Compose. There are two separate builds: one for Intel chips and one for Apple Silicon. Download the correct version for your Mac.

4.1 — Download Docker Desktop for Mac

Go to docker.com/products/docker-desktop in your browser and download the Docker Desktop for Mac installer (.dmg file). On the download page, choose either Mac with Intel Chip or Mac with Apple Chip to match your hardware.

4.2 — Install from the disk image

1

Open the .dmg file

Double-click the downloaded Docker.dmg to mount it.

2

Drag Docker to Applications

In the window that opens, drag the Docker icon into the Applications folder.

3

Launch Docker Desktop

Open Finder → Applications and double-click Docker. macOS may ask you to confirm opening an application downloaded from the internet — click Open.

4

Complete the first-run setup

Accept the Docker Subscription Service Agreement. Docker Desktop will ask for your password to install its helper components — enter it and click Install Helper. Wait for the Docker Engine to start (the whale icon in the menu bar will stop animating).

4.3 — Verify the installation

Terminal — expected output shown below each command
$ docker --version
Docker version 27.x.x, build xxxxxxx

$ docker compose version
Docker Compose version v2.x.x

4.4 — Configure file sharing

Docker Desktop on macOS can only mount directories that are explicitly allowed. Confirm that the directory containing your project files is in the sharing list:

Open Docker Desktop → Settings (gear icon) → ResourcesFile Sharing. The list should already include /Users, /Volumes, /private, and /tmp. If you plan to store the project or monitor files outside of these paths, click + to add the required directory, then click Apply & Restart.

Section 5

Get the Application Source

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

Option A — Clone from a Git repository

Terminal
$ git clone <repository-url> ~/serpentua-dvp
$ cd ~/serpentua-dvp

Option B — Copy an existing folder

Use Finder to copy the serpentua-dvp-docker folder to your home directory, or use Terminal:

Terminal
$ cp -r /Volumes/USB/serpentua-dvp-docker ~/serpentua-dvp

Option C — Extract from a ZIP archive

Terminal — extract archive to ~/serpentua-dvp
# macOS includes unzip natively
$ unzip ~/Downloads/serpentua-dvp-docker.zip -d ~/serpentua-dvp
$ cd ~/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 any text editor — nano in Terminal is the quickest option:

Terminal — open .env in nano
$ nano .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 the file after making your changes (Ctrl+O then Ctrl+X in nano).

Section 7

Build & Launch the Application

From the project root directory, run:

Terminal — build images and start all services in the background
$ 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

Terminal
# Follow logs for all containers
$ docker compose logs -f

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

Verify the Installation

Check container status

Terminal
$ 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 macOS host's filesystem into the container at /host (read-only). Because macOS already uses Unix-style paths, the mapping is straightforward: prepend /host to any absolute macOS path when entering it inside the DVP application.

Host Path (macOS) Container Path to Enter in DVP
/Users/alice/Documents /host/Users/alice/Documents
/Users/alice/Desktop/data /host/Users/alice/Desktop/data
/var/log /host/var/log
/Volumes/BackupDisk/files /host/Volumes/BackupDisk/files
/private/etc /host/private/etc
The general rule: prepend /host to any absolute macOS path when entering it inside the DVP application. For example, /Users/alice/data becomes /host/Users/alice/data.
Docker Desktop for Mac can only access directories listed in its File Sharing settings. By default this includes /Users, /Volumes, /private, and /tmp. If you need to monitor a path outside these directories, add it under Docker Desktop → Settings → Resources → File Sharing before adding it as an asset in DVP.
Section 10

Firewall & Remote Access

The macOS Application Firewall controls inbound connections on a per-application basis rather than per port. When Docker Desktop first binds a port, macOS may display a dialog asking whether to allow incoming connections — click Allow. If the dialog was dismissed or the firewall blocks access, manage it manually:

Check and configure the firewall via Terminal

Terminal — check firewall status
$ sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
Firewall is enabled. (State = 1)

If the firewall is enabled and remote machines cannot connect, explicitly allow the Docker Desktop application:

Terminal — add Docker to the firewall allow list
$ sudo /usr/libexec/ApplicationFirewall/socketfilterfw \
    --add /Applications/Docker.app
$ sudo /usr/libexec/ApplicationFirewall/socketfilterfw \
    --unblockapp /Applications/Docker.app

Configure via System Settings (alternative)

Open System SettingsNetworkFirewallOptions. Locate Docker Desktop in the list and set it to Allow incoming connections. Click OK.

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 restart automatically whenever the Docker Engine restarts. Enable Docker Desktop to launch at login by opening Docker Desktop → Settings (gear icon) → General → check "Start Docker Desktop when you log in" → 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 — launchd service

If you need the containers to start as a background service without requiring a user login (e.g., on a dedicated Mac server), create a launchd plist:

Terminal — create the launchd plist
$ sudo nano /Library/LaunchDaemons/com.serpentua.dvp.plist
/Library/LaunchDaemons/com.serpentua.dvp.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.serpentua.dvp</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/docker</string>
    <string>compose</string>
    <string>up</string>
    <string>-d</string>
  </array>
  <key>WorkingDirectory</key>
  <string>/Users/YOUR_USER/serpentua-dvp</string>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
Terminal — load the service
$ sudo launchctl load /Library/LaunchDaemons/com.serpentua.dvp.plist
Section 12

Day-to-Day Management

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

Terminal — pull latest code and rebuild
$ git pull                      # if using git
$ docker compose down
$ docker compose up -d --build

Database backups

Terminal — dump the database to a file
$ docker compose exec db \
    mysqldump -u dvp -p dvp_app > dvp_backup_$(date +%Y%m%d).sql
Section 13

Troubleshooting

Container fails to start — "port already in use"

Another process is already listening on port 8443 or 3306.

Terminal — find what is using the port
$ sudo lsof -i :8443
$ sudo lsof -i :3306

Note the PID in the output and stop the conflicting process with kill <PID>, 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

Terminal — inspect the error
$ 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: macOS Finder hides files beginning with a dot (.) by default. Press ⌘ + Shift + . to show hidden files.

Database container health check failing

Terminal
$ 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.
Terminal — destructive: removes all database data
$ docker compose down -v
$ docker compose up -d --build

Cannot access the web UI from another machine

  • Confirm Docker is listening: sudo lsof -i :8443.
  • Check the macOS firewall: System Settings → Network → Firewall — confirm Docker Desktop is allowed.
  • Check that your router or any cloud security group also allows port 8443.

Apple Silicon — platform mismatch warnings

On Apple Silicon Macs you may see a warning such as: "The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)". Docker Desktop uses Rosetta 2 to run x86_64 images transparently, so the containers will still work, but you can silence the warning by adding a platform key to each service in docker-compose.yml:

docker-compose.yml — add platform key to suppress warnings
services:
  app:
    platform: linux/amd64
    build: .
    ...
  db:
    platform: linux/amd64
    image: mysql:8.0
    ...

Docker Desktop runs slowly or uses too much memory

Docker Desktop allocates a fixed amount of RAM and CPU to its Linux VM. If the machine feels sluggish, adjust the limits under Docker Desktop → SettingsResources. A minimum of 2 GB RAM and 2 CPUs is recommended for DVP.

Docker Desktop does not start

  • Restart Docker Desktop from the menu bar: click the whale icon → Restart.
  • Try the built-in reset tool: whale icon → TroubleshootRestart Docker Desktop.
  • Review Docker Desktop logs at ~/Library/Containers/com.docker.docker/Data/log/.
Section 14

Uninstalling

Stop and remove containers and volumes

Terminal
$ cd ~/serpentua-dvp
$ docker compose down -v     # stops containers and deletes the MySQL volume

Remove the Docker images

Terminal
$ docker image rm $(docker images -q 'dvp*') mysql:8.0 2>/dev/null || true
$ docker image prune -f    # remove any dangling build-cache images

Remove the project files

Terminal
$ rm -rf ~/serpentua-dvp

Optionally uninstall Docker Desktop

The easiest way to uninstall Docker Desktop is via its built-in uninstaller, which also removes all associated data and virtual machine files:

Click the whale icon in the menu bar → TroubleshootUninstall. Confirm when prompted.

Alternatively, drag Docker.app from Applications to the Trash, then remove the remaining data:

Terminal — remove Docker Desktop data
$ rm -rf ~/Library/Group\ Containers/group.com.docker
$ rm -rf ~/Library/Containers/com.docker.docker
$ rm -rf ~/.docker

Remove the launchd service (if created)

Terminal
$ sudo launchctl unload /Library/LaunchDaemons/com.serpentua.dvp.plist
$ sudo rm /Library/LaunchDaemons/com.serpentua.dvp.plist

Serpentua Data Validation Platform — macOS Installation Guide  |  serpentua.com

Licensed under the Serpentua Source Available License. See the LICENSE file for full terms.