A medical 3D case presentation and sharing system designed for hospitals, clinical teams, and medical education scenarios. Built with PHP, MySQL, and Three.js, the project supports case management, STL upload, server-side asynchronous preprocessing to GLB, secure front-end viewing, and Docker-based deployment.
link: https://3d.czsyyy.cn/v?token=cddaa9000ca8fb4ed363a4c8457ced10
password: 1234

none / password / patient_name verification modesPHP / PDO MySQLMySQL 8Three.js, GLTFLoaderNode.js, threeNginxsupervisordDocker Compose. ├─ app/ PHP application logic ├─ bootstrap/ bootstrap, helpers, and autoloading ├─ config/ configuration files ├─ database/migrations/ initialization SQL migrations ├─ docker/php/ PHP + Nginx + Worker container definition ├─ install/ first-time installation wizard ├─ public/assets/ front-end static assets ├─ scripts/ worker and STL→GLB processing scripts └─ storage/uploads/ raw STL assets and processed GLB assets
Use docker-compose.yml:
docker compose up -d --build
After the container starts, open the installer:
http://<host>:8098/install/The installation workflow is handled by install/install.php, which automatically:
database/migrations.envstorage/installed.lockDefault design:
80988099The dual Nginx entry points are defined in docker/php/nginx.conf and docker/php/nginx.conf.
Recommended deployment strategy:
The project supports multiple share channels that administrators can choose manually when generating links and QR codes:
Configuration file:
Environment variables:
APP_FRONT_URLAPP_SHARE_PUBLIC_URLAPP_SHARE_DEFAULT_CHANNELThis design ensures that shared links and QR codes are explicitly generated from a selected channel, rather than always following the current backend access host.
pendingscripts/process-model-queue.php scans pending modelsscripts/stl-to-glb.mjs converts STL into GLBpendingprocessingreadyfailedBefore all display assets are ready, the frontend viewer shows a waiting message instead of falling back to raw STL rendering.
During first installation, SQL files under database/migrations are executed automatically.
If you are upgrading an existing deployment, compare the target schema with the SQL files under database/migrations/ and prepare upgrade SQL based on your current database state.
See .env.example
Important variables include:
APP_NAMEAPP_FRONT_URLAPP_ADMIN_URLAPP_SHARE_PUBLIC_URLDB_HOSTDB_PORTDB_NAMEDB_USERDB_PASSThe backend entry is defined at docker/php/nginx.conf. It is strongly recommended to keep it accessible only from the internal network.
If a case uses the none verification mode, leaked links create higher risk. In production, the recommended default mode is password.
The model download endpoint is controlled by ViewerController.modelFile(). If you use a CDN, avoid public caching for protected model download routes.
After deployment is completed, it is recommended to restrict /install/ using gateway or Nginx rules.
This project is licensed under the Apache 2.0 license.