Skip to main content

Installation

Permission Mongo can be installed in multiple ways depending on your environment and preferences.

Prerequisites

Permission Mongo requires:
  • MongoDB 6.0+ - Document storage, versioning, audit logs
  • Redis 7.0+ - Policy caching, hierarchy lookups (optional but recommended)
  • Go 1.21+ - Only required if building from source
Redis is optional but highly recommended for production deployments. Without Redis, policies and hierarchy data will be fetched from MongoDB on every request, significantly impacting performance.

Installation methods

Configuration files

Permission Mongo requires configuration files in YAML format. The config directory should contain:
config/
├── config.example.yaml  # Server, MongoDB, Redis settings
├── schema.yml          # Collection definitions
├── policy.yml          # RBAC policies
└── hooks.yml           # Pre/post operation hooks (optional)

Minimal configuration

Create config/config.example.yaml:
config/config.example.yaml
server:
  host: "0.0.0.0"
  port: 8080

mongodb:
  uri: "mongodb://localhost:27017"
  database: "permission_mongo"

redis:
  addr: "localhost:6379"
  password: ""
  db: 0

auth:
  jwt_secret: "your-secret-key-change-in-production"
  token_expiry: "24h"
See the full example in config/config.example.yaml:1-70.

Schema definition

Create config/schema.yml with at least one collection:
config/schema.yml
version: "1.0"

settings:
  auto_timestamps: true
  id_type: objectId

collections:
  users:
    fields:
      _id: { type: objectId, auto: true }
      email: { type: string, required: true }
      name: { type: string, required: true }
      created_at: { type: date, auto: true }
    
    indexes:
      - fields: [email]
        unique: true
See complete schema examples in examples/config/schema.yml.

Policy definition

Create config/policy.yml to define access control:
config/policy.yml
version: "1.0"

roles:
  admin:
    description: "Full access"
  
  user:
    description: "Standard user"

policies:
  users:
    admin:
      actions: [create, read, update, delete]
      when: "true"  # Admins can access all
    
    user:
      actions: [read, update]
      when: doc._id == user.id  # Users can only access themselves

defaults:
  deny_all: true
See policy examples in examples/config/policy.yml.

Running the server

Command-line options

Usage: pm-server [options]

Options:
  --config <dir>     Path to configuration directory (default: ./config)
  --version          Show version and exit
  --help             Show this help message
See flag parsing in cmd/server/main.go:31-34.

Starting the server

# With default config directory
pm-server

# With custom config directory
pm-server --config /etc/permission-mongo

# Check version
pm-server --version
# Output:
# Permission Mongo Server
# Version: v1.0.0
# Build Time: 2026-03-04T12:00:00Z
The server outputs startup logs showing:
  1. Configuration loading
  2. MongoDB connection
  3. Redis connection
  4. Component initialization (schema, RBAC, hooks, etc.)
  5. HTTP server start
Example output from cmd/server/main.go:41-200:
Permission Mongo Server
Version: v1.0.0
Loading configuration from: ./config
Connecting to MongoDB...
MongoDB connected successfully
Connecting to Redis...
Redis connected successfully
Initializing schema validator...
Initializing hierarchy resolver...
Initializing RBAC engine...
Initializing version manager...
Initializing audit logger...
Initializing API handlers...
Starting HTTP server on 0.0.0.0:8080
Server ready - all handlers initialized

Production deployment

Systemd service (Linux)

Create /etc/systemd/system/permission-mongo.service:
[Unit]
Description=Permission Mongo Server
After=network.target mongodb.service redis.service

[Service]
Type=simple
User=pmongo
Group=pmongo
WorkingDirectory=/opt/permission-mongo
ExecStart=/usr/local/bin/pm-server --config /etc/permission-mongo/config
Restart=on-failure
RestartSec=5

# Environment
Environment="MONGO_URI=mongodb://localhost:27017"
Environment="MONGO_DATABASE=permission_mongo"
Environment="REDIS_URL=redis://localhost:6379"

# Security
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/log/permission-mongo

[Install]
WantedBy=multi-user.target
Enable and start:
sudo systemctl daemon-reload
sudo systemctl enable permission-mongo
sudo systemctl start permission-mongo
sudo systemctl status permission-mongo

Kubernetes deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: permission-mongo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: permission-mongo
  template:
    metadata:
      labels:
        app: permission-mongo
    spec:
      containers:
      - name: pm-server
        image: permissionmongo/server:latest
        ports:
        - containerPort: 8080
        env:
        - name: MONGO_URI
          valueFrom:
            secretKeyRef:
              name: pm-secrets
              key: mongo-uri
        - name: REDIS_URL
          valueFrom:
            secretKeyRef:
              name: pm-secrets
              key: redis-url
        volumeMounts:
        - name: config
          mountPath: /app/config
          readOnly: true
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: config
        configMap:
          name: pm-config
---
apiVersion: v1
kind: Service
metadata:
  name: permission-mongo
spec:
  selector:
    app: permission-mongo
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

Environment variables

All configuration can be overridden with environment variables:
VariableDescriptionDefault
MONGO_URIMongoDB connection stringmongodb://localhost:27017
MONGO_DATABASEDatabase namepermission_mongo
REDIS_URLRedis connection URLredis://localhost:6379
PM_DEV_MODEEnable dev mode (no auth)false
PM_DEV_TENANT_IDDefault tenant ID in dev mode000000000000000000000001
See environment variable handling in cmd/server/main.go:63-84.

Monitoring setup

Permission Mongo exposes Prometheus metrics on /metrics.

Prometheus configuration

Add to prometheus.yml:
scrape_configs:
  - job_name: 'permission-mongo'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: /metrics
    scrape_interval: 15s

Grafana dashboard

Import the pre-built dashboard:
# Start monitoring stack
docker-compose -f docker-compose.monitoring.yaml up -d

# Access Grafana at http://localhost:3000
# Default credentials: admin/admin
The dashboard is located in monitoring/grafana/dashboards/permission-mongo.json. Available metrics (from README.md:164-177):
  • permission_mongo_http_requests_total - Request counts
  • permission_mongo_http_request_duration_seconds - Latency
  • permission_mongo_mongo_operations_total - MongoDB ops
  • permission_mongo_cache_hits_total / cache_misses_total - Cache performance
  • permission_mongo_rbac_evaluations_total - RBAC decisions
See full monitoring documentation in monitoring/README.md.

Upgrading

Binary upgrade

# Download new version
curl -LO https://github.com/KTS-o7/permission-mongo/releases/download/v1.1.0/pm-server-linux-amd64

# Stop server
sudo systemctl stop permission-mongo

# Replace binary
sudo mv pm-server-linux-amd64 /usr/local/bin/pm-server
sudo chmod +x /usr/local/bin/pm-server

# Start server
sudo systemctl start permission-mongo

Docker upgrade

# Pull new image
docker pull permissionmongo/server:v1.1.0

# Update docker-compose.yaml to use new tag
# Then restart
docker-compose -f docker/docker-compose.yaml up -d

Database migrations

Permission Mongo does not require schema migrations. Configuration changes in schema.yml and policy.yml are applied automatically on server restart (hot reload is supported).

Next steps

Quickstart

Make your first API call in 5 minutes

Architecture

Understand the system components and data flow

Configuration

Learn how to configure schema, policies, and hooks

Production Best Practices

Security, performance, and reliability recommendations

Build docs developers (and LLMs) love