# ============================================================================== # Documize Community Edition v5.14.0 — Docker Compose # https://github.com/documize/community # # Stack: # - documize-init one-shot downloader (runs once, then exits cleanly) # - documize-app Alpine runner (executes the pre-downloaded binary) # - MySQL 8 self-hosted database (named volume for persistence) # # Quick-start: # 1. Copy .env.template to .env and fill in all ⚠️ values. # 2. Run: docker compose up -d # 3. Wait ~60 s, then open http://localhost:5001 # 4. Complete the one-time setup wizard in your browser. # # See README.docx for full documentation. # ============================================================================== services: # ── MySQL 8 ────────────────────────────────────────────────────────────────── db: image: mysql:8 container_name: documize-db restart: unless-stopped mem_limit: 1g cpu_shares: 1024 security_opt: - no-new-privileges:true healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${MYSQL_USER}", "--password=${MYSQL_PASSWORD}"] interval: 15s timeout: 5s retries: 5 start_period: 45s environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # utf8mb4 + full-text search flags required by Documize command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --ft-min-word-len=3 --innodb-file-per-table=1 --max-allowed-packet=256M volumes: - db_data:/var/lib/mysql networks: - documize_net # ── Init container: download binary once into shared volume ────────────────── app-init: image: alpine:3.19 container_name: documize-init restart: "no" # runs once and exits — never restarts entrypoint: ["/bin/sh", "-c"] command: - | set -e apk add --no-cache curl ca-certificates if [ ! -f /app/bin/documize ]; then echo 'Downloading Documize Community v5.14.0...' curl -fsSL -o /app/bin/documize https://community-downloads.s3.us-east-2.amazonaws.com/documize-community-linux-amd64 chmod +x /app/bin/documize echo 'Download complete.' else echo 'Binary already present, skipping download.' fi volumes: - app_bin:/app/bin # ── App: run the pre-downloaded binary ─────────────────────────────────────── app: image: alpine:3.19 container_name: documize-app restart: unless-stopped entrypoint: ["/app/bin/documize"] depends_on: app-init: condition: service_completed_successfully db: condition: service_healthy ports: - "${DOCUMIZE_PORT}:5001" environment: # ── Network ──────────────────────────────────────────────────────────── DOCUMIZEPORT: "${DOCUMIZE_PORT}" DOCUMIZELOCATION: selfhost # ── Database (MySQL DSN) ──────────────────────────────────────────────── DOCUMIZEDBTYPE: mysql DOCUMIZEDB: "${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(db:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&maxAllowedPacket=4194304" # ── Security ──────────────────────────────────────────────────────────── DOCUMIZESALT: "${DOCUMIZE_SALT}" # ── SMTP (optional — only active when all SMTP_* vars are set) ────────── DOCUMIZESMTPHOST: "${SMTP_HOST}" DOCUMIZESMTPPORT: "${SMTP_PORT}" DOCUMIZESMTPUSER: "${SMTP_USER}" DOCUMIZESMTPPASSWORD: "${SMTP_PASSWORD}" DOCUMIZESMTPSENDER: "${SMTP_SENDER}" volumes: - app_bin:/app/bin networks: - documize_net # ── Named volumes ───────────────────────────────────────────────────────────── volumes: db_data: driver: local # MySQL data — survives container restarts and upgrades app_bin: driver: local # Documize binary — downloaded once by app-init # ── Internal network ────────────────────────────────────────────────────────── networks: documize_net: driver: bridge