Rewrites dashboard and finder Dockerfiles to use a clean multi-stage build (deps → builder → runner) that installs npm packages inside Alpine Linux, avoiding the SWC musl binary issue when building from Windows host. Uses registry.npmmirror.com for reliable installs from restricted networks (Iran). - docker/api/Dockerfile: .NET 10 multi-stage build - docker/web/Dockerfile: Node 20-alpine multi-stage, npmmirror - docker/finder/Dockerfile: Node 20-alpine multi-stage, npmmirror - docker/website/Dockerfile: marketing website build - scripts/: PowerShell helper scripts for local dev Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
4.5 KiB
Running Meezi fully in Docker
Quick start
cd F:\Projects\Meezi
copy .env.example .env # if not done yet
powershell -File scripts\docker-up-full.ps1
Or manually:
docker compose up -d --build
| Service | URL |
|---|---|
| Dashboard | http://localhost:3101/fa/login |
| API | http://localhost:5080/swagger |
| Health | http://localhost:5080/health |
Demo OTP phone: 09121234567
If API build fails pulling .NET images
Default bases are MCR (official):
mcr.microsoft.com/dotnet/sdk:10.0mcr.microsoft.com/dotnet/aspnet:10.0
Override in .env if needed:
DOTNET_SDK_IMAGE=mcr.microsoft.com/dotnet/sdk:10.0
DOTNET_ASPNET_IMAGE=mcr.microsoft.com/dotnet/aspnet:10.0
insufficient_scope / pull access denied on docker.io/dotnet/sdk:10.0
That usually means Docker Hub auth, not a missing .NET 10 tag. Do not rely on dotnet/sdk:10.0 on Docker Hub unless pulls work on your machine.
-
Clear bad Hub login (fixes many
insufficient_scopeerrors):docker logout docker pull mcr.microsoft.com/dotnet/sdk:10.0 docker pull mcr.microsoft.com/dotnet/aspnet:10.0 -
VPN — then pre-pull MCR and build:
docker pull mcr.microsoft.com/dotnet/sdk:10.0 docker pull mcr.microsoft.com/dotnet/aspnet:10.0 docker compose up -d --build -
Registry mirror — Docker Desktop → Settings → Docker Engine, merge
docker/daemon-registry-mirror.example.json, Apply & Restart. -
Pre-pull all images with VPN, then build offline:
docker pull mcr.microsoft.com/dotnet/sdk:10.0 docker pull mcr.microsoft.com/dotnet/aspnet:10.0 docker pull postgres:16-alpine docker pull redis:7-alpine docker pull node:20-alpine docker compose up -d --build
NuGet restore fails inside Docker (SSL_ERROR_SSL, bad record mac)
Example during dotnet restore:
Failed to download package 'Microsoft.CodeAnalysis.CSharp.4.14.0' from 'https://api.nuget.org/...'
Decrypt failed with OpenSSL error - SSL_ERROR_SSL
error:0A000119:SSL routines::decryption failed or bad record mac
This is not a Meezi code bug — TLS to api.nuget.org is being corrupted or cut off inside the build container (unstable VPN, antivirus HTTPS scan, filtered ISP, Docker Desktop network glitch).
Try in order:
-
Restart Docker Desktop fully (Quit → start again). After
Ctrl+Cmid-build, the engine often returns500 Internal Server Erroruntil restarted. -
VPN on for the whole build (connect before
docker compose build, keep it on until restore finishes). -
Pre-restore on the host (uses Windows network, often more reliable), then rebuild:
cd F:\Projects\Meezi dotnet restore src\Meezi.API\Meezi.API.csproj docker compose build api docker compose up -d -
Disable HTTPS inspection in antivirus / corporate proxy for Docker Desktop and
docker.exe. -
Retry —
docker compose build api --no-cacheonce network is stable.
The API Dockerfile uses nuget.config retries, NUGET_CERT_REVOCATION_MODE=offline, and a NuGet cache mount to make repeat builds easier.
Docker Desktop 500 Internal Server Error on docker compose up
unable to get image 'meezi-web': request returned 500 Internal Server Error
... dockerDesktopLinuxEngine ...
The Linux engine crashed or is stuck (common after aborting a long build).
# 1) Quit Docker Desktop from the tray (not only close the window)
# 2) Optional — reset WSL backend (Docker Desktop → WSL2):
wsl --shutdown
# 3) Start Docker Desktop, wait until it says "Running"
docker version
docker compose build
docker compose up -d
If docker version hangs, Docker is still broken — reboot Windows or Troubleshoot → Reset to factory defaults in Docker Desktop (last resort).
Why the API image does not run apt-get
Older Dockerfiles installed curl for healthchecks, which downloads Ubuntu packages during build (archive.ubuntu.com). That often fails in Iran without VPN.
The API image now uses a TCP healthcheck on port 8080 instead — no extra OS packages.
Commands
docker compose ps
docker compose logs -f api
docker compose down
docker compose down -v # also removes DB volume
Infra-only fallback (host API)
Only if Docker cannot build .NET images at all:
docker compose up -d postgres redis
cd src\Meezi.API
$env:RUN_MIGRATIONS="true"
dotnet run