* refactor(attachment): multimodal attachment refactor with snapshot schema and storage layer - Add snapshot schema migration (0008) and update init/versions/snapshots - Add internal/attachment and internal/channel normalize for unified attachment handling - Move containerfs provider from internal/media to internal/storage - Update agent types, channel adapters (Telegram/Feishu), inbound and handlers - Add containerd snapshot lineage and local_channel tests - Regenerate sqlc, swagger and SDK * refactor(media): content-addressed asset system with unified naming - Replace asset_id foreign key with content_hash as sole identifier for bot_history_message_assets (pure soft-link model) - Remove mime, size_bytes, storage_key from DB; derive at read time via media.Resolve from actual storage - Merge migrations 0008/0009 into single 0008; keep 0001 as canonical schema - Add Docker initdb script for deterministic migration execution order - Fix cross-channel real-time image display (Telegram → WebUI SSE) - Fix message disappearing on refresh (null assets fallback) - Fix file icon instead of image preview (mime derivation from storage) - Unify AssetID → ContentHash naming across Go, Agent, and Frontend - Change storage key prefix from 4-char to 2-char for directory sharding - Add server-entrypoint.sh for Docker deployment migration handling * refactor(infra): embedded migrations, Docker simplification, and config consolidation - Embed SQL migrations into Go binary, removing shell-based migration scripts - Consolidate config files into conf/ directory (app.example.toml, app.docker.toml, app.dev.toml) - Simplify Docker setup: remove initdb.d scripts, streamline nginx config and entrypoint - Remove legacy CLI, feishu-echo commands, and obsolete incremental migration files - Update install script and docs to require sudo for one-click install - Add mise tasks for dev environment orchestration * chore: recover migrations --------- Co-authored-by: Acbox <acbox0328@gmail.com>
3.9 KiB
Docker Installation
Docker is the recommended way to run Memoh. The stack includes PostgreSQL, Qdrant, Containerd, the main server, agent gateway, and web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.
Prerequisites
One-Click Install
Run the official install script (requires Docker and Docker Compose):
curl -fsSL https://raw.githubusercontent.com/memohai/Memoh/main/scripts/install.sh | sudo sh
The script will:
- Check for Docker and Docker Compose
- Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password)
- Clone the repository
- Generate
config.tomlfrom the Docker template - Start all services with
docker compose up -d --build
Silent install (use all defaults, no prompts):
curl -fsSL https://raw.githubusercontent.com/memohai/Memoh/main/scripts/install.sh | sudo sh -s -- -y
Defaults when running silently:
- Workspace:
~/memoh - Data directory:
~/memoh/data - Admin:
admin/admin123 - JWT secret: auto-generated
- Postgres password:
memoh123
Manual Install
Clone the repository and start with Docker Compose:
git clone https://github.com/memohai/Memoh.git
cd Memoh
sudo docker compose up -d
On macOS or if your user is in the
dockergroup,sudois not required.
By default, Docker Compose uses conf/app.docker.toml. No config file in the project root is mounted — only this built-in config is used. See config.toml reference for all configuration fields.
Access Points
After startup:
| Service | URL |
|---|---|
| Web UI | http://localhost:8082 |
| API | http://localhost:8080 |
| Agent Gateway | http://localhost:8081 |
Default login: admin / admin123
First startup may take 1–2 minutes while images build and services initialize.
Custom Configuration
To use your own config file:
- Copy the Docker config template and edit it. See config.toml reference for field descriptions:
cp conf/app.docker.toml config.toml
nano config.toml
- Point
MEMOH_CONFIGat your config when starting (path is on the host; rundocker composefrom the project root):
sudo MEMOH_CONFIG=./config.toml docker compose up -d
Recommended changes for production (see config.toml reference for details):
admin.password— Change the admin passwordauth.jwt_secret— Generate withopenssl rand -base64 32postgres.password— Change the database password (and setPOSTGRES_PASSWORDwhen runningdocker compose)
Common Commands
Prefix with
sudoon Linux if your user is not in thedockergroup.
docker compose up -d # Start
docker compose down # Stop
docker compose logs -f # View logs
docker compose ps # Status
docker compose up -d --build # Rebuild and restart
Production Checklist
- HTTPS — Configure SSL (e.g. via
docker-compose.override.ymlwith certs) - Passwords — Change all default passwords and secrets
- Firewall — Restrict access to necessary ports
- Resource limits — Set memory/CPU limits for containers
- Backups — Regular backups of Postgres and Qdrant data
Troubleshooting
docker compose logs server # View main service logs
docker compose logs containerd # View containerd logs
docker compose config # Validate configuration
docker compose build --no-cache && docker compose up -d # Full rebuild
Security Warnings
- The main service runs with privileged container access — only run in trusted environments
- You must change all default passwords and secrets before production use
- Use HTTPS in production