Skip to main content

Docker Installation

Deploy MatsushibaDB using Docker containers for consistent, scalable, and portable database solutions across any environment.

Quick Start

Basic Docker Run

# Run MatsushibaDB container
docker run -d \
  --name matsushiba-db \
  -p 8000:8000 \
  -v matsushiba-data:/data \
  matsushibadb/matsushibadb:latest

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  matsushiba-db:
    image: matsushibadb/matsushibadb:latest
    container_name: matsushiba-db
    ports:
      - "8000:8000"
    volumes:
      - matsushiba-data:/data
    environment:
      - NODE_ENV=production
      - DATABASE_PATH=/data/production.db
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  matsushiba-data:
    driver: local

Container Variants

Standard Container

# Latest stable release
docker pull matsushibadb/matsushibadb:latest

# Specific version
docker pull matsushibadb/matsushibadb:1.0.9

# Run with custom configuration
docker run -d \
  --name matsushiba-db \
  -p 8000:8000 \
  -v $(pwd)/data:/data \
  -e DATABASE_PATH=/data/app.db \
  -e ENABLE_WAL=true \
  -e CACHE_SIZE=2000 \
  matsushibadb/matsushibadb:latest

Development Container

# Development container with debugging tools
docker run -d \
  --name matsushiba-dev \
  -p 8000:8000 \
  -p 9229:9229 \
  -v $(pwd)/src:/app/src \
  -v $(pwd)/data:/data \
  -e NODE_ENV=development \
  -e DEBUG=true \
  matsushibadb/matsushibadb:dev

Minimal Container

# Minimal container for resource-constrained environments
docker run -d \
  --name matsushiba-minimal \
  -p 8000:8000 \
  -v matsushiba-data:/data \
  matsushibadb/matsushibadb:minimal

Distroless Container

# Distroless container for enhanced security
docker run -d \
  --name matsushiba-secure \
  -p 8000:8000 \
  -v matsushiba-data:/data \
  matsushibadb/matsushibadb:distroless

Configuration

Environment Variables

# Database configuration
DATABASE_PATH=/data/production.db
ENABLE_WAL=true
CACHE_SIZE=2000
SYNCHRONOUS=NORMAL
JOURNAL_MODE=WAL
TEMP_STORE=MEMORY

# Security configuration
JWT_SECRET=your-jwt-secret-key
ENABLE_ENCRYPTION=true
ENCRYPTION_KEY=your-encryption-key
ENABLE_AUDIT_LOGGING=true

# Performance configuration
MAX_CONNECTIONS=100
CONNECTION_TIMEOUT=30000
QUERY_TIMEOUT=30000
ENABLE_QUERY_CACHE=true
QUERY_CACHE_SIZE=1000

# Logging configuration
LOG_LEVEL=info
LOG_FORMAT=json
LOG_FILE=/var/log/matsushiba.log

# Network configuration
HOST=0.0.0.0
PORT=8000
CORS_ORIGINS=https://yourdomain.com,https://app.yourdomain.com

Custom Configuration File

# config.yml
database:
  path: /data/production.db
  enable_wal: true
  cache_size: 2000
  synchronous: NORMAL
  journal_mode: WAL
  temp_store: MEMORY

security:
  jwt_secret: ${JWT_SECRET}
  enable_encryption: true
  encryption_key: ${ENCRYPTION_KEY}
  enable_audit_logging: true

performance:
  max_connections: 100
  connection_timeout: 30000
  query_timeout: 30000
  enable_query_cache: true
  query_cache_size: 1000

logging:
  level: info
  format: json
  file: /var/log/matsushiba.log

network:
  host: 0.0.0.0
  port: 8000
  cors_origins:
    - https://yourdomain.com
    - https://app.yourdomain.com
# Run with custom config
docker run -d \
  --name matsushiba-db \
  -p 8000:8000 \
  -v $(pwd)/config.yml:/app/config.yml \
  -v matsushiba-data:/data \
  matsushibadb/matsushibadb:latest

Production Deployment

Docker Compose for Production

# docker-compose.prod.yml
version: '3.8'

services:
  matsushiba-app:
    image: matsushibadb/matsushibadb:latest
    container_name: matsushiba-app
    restart: unless-stopped
    ports:
      - "8000:8000"
    environment:
      - NODE_ENV=production
      - DATABASE_PATH=/data/production.db
      - JWT_SECRET=${JWT_SECRET}
      - ENCRYPTION_KEY=${ENCRYPTION_KEY}
      - LOG_LEVEL=info
    volumes:
      - matsushiba-data:/data
      - ./logs:/var/log
    depends_on:
      - redis
      - nginx
    networks:
      - matsushiba-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  redis:
    image: redis:7-alpine
    container_name: matsushiba-redis
    restart: unless-stopped
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis-data:/data
    networks:
      - matsushiba-network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  nginx:
    image: nginx:alpine
    container_name: matsushiba-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
      - ./logs/nginx:/var/log/nginx
    depends_on:
      - matsushiba-app
    networks:
      - matsushiba-network

  prometheus:
    image: prom/prometheus:latest
    container_name: matsushiba-prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=200h'
      - '--web.enable-lifecycle'
    networks:
      - matsushiba-network

  grafana:
    image: grafana/grafana:latest
    container_name: matsushiba-grafana
    restart: unless-stopped
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
    volumes:
      - grafana-data:/var/lib/grafana
      - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards
      - ./monitoring/grafana/provisioning:/etc/grafana/provisioning
    depends_on:
      - prometheus
    networks:
      - matsushiba-network

volumes:
  matsushiba-data:
    driver: local
  redis-data:
    driver: local
  prometheus-data:
    driver: local
  grafana-data:
    driver: local

networks:
  matsushiba-network:
    driver: bridge

Nginx Configuration

# nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Logging
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    # Performance
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 10M;

    # Gzip compression
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml+rss
        application/atom+xml
        image/svg+xml;

    # Rate limiting
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

    # Upstream
    upstream matsushiba_backend {
        server matsushiba-app:8000;
        keepalive 32;
    }

    # HTTP server (redirect to HTTPS)
    server {
        listen 80;
        server_name your-domain.com www.your-domain.com;
        return 301 https://$server_name$request_uri;
    }

    # HTTPS server
    server {
        listen 443 ssl http2;
        server_name your-domain.com www.your-domain.com;

        # SSL configuration
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/key.pem;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        # Security headers
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

        # API routes
        location /api/ {
            limit_req zone=api burst=20 nodelay;
            proxy_pass http://matsushiba_backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_cache_bypass $http_upgrade;
            proxy_read_timeout 300s;
            proxy_connect_timeout 75s;
        }

        # Login endpoint with stricter rate limiting
        location /api/auth/login {
            limit_req zone=login burst=5 nodelay;
            proxy_pass http://matsushiba_backend;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # Health check
        location /health {
            proxy_pass http://matsushiba_backend;
            access_log off;
        }

        # Static files
        location /static/ {
            alias /app/public/;
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
}

Kubernetes Deployment

Kubernetes Manifests

# k8s/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: matsushiba
  labels:
    name: matsushiba

---
# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: matsushiba-config
  namespace: matsushiba
data:
  NODE_ENV: "production"
  DATABASE_PATH: "/data/production.db"
  LOG_LEVEL: "info"
  REDIS_URL: "redis://matsushiba-redis:6379"

---
# k8s/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: matsushiba-secrets
  namespace: matsushiba
type: Opaque
data:
  JWT_SECRET: <base64-encoded-jwt-secret>
  REDIS_PASSWORD: <base64-encoded-redis-password>
  GRAFANA_PASSWORD: <base64-encoded-grafana-password>

---
# k8s/persistent-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: matsushiba-pv
  namespace: matsushiba
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: matsushiba-storage
  hostPath:
    path: /data/matsushiba

---
# k8s/persistent-volume-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: matsushiba-pvc
  namespace: matsushiba
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: matsushiba-storage

---
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: matsushiba-app
  namespace: matsushiba
  labels:
    app: matsushiba-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: matsushiba-app
  template:
    metadata:
      labels:
        app: matsushiba-app
    spec:
      containers:
      - name: matsushiba-app
        image: matsushibadb/matsushibadb:latest
        ports:
        - containerPort: 8000
        env:
        - name: NODE_ENV
          valueFrom:
            configMapKeyRef:
              name: matsushiba-config
              key: NODE_ENV
        - name: DATABASE_PATH
          valueFrom:
            configMapKeyRef:
              name: matsushiba-config
              key: DATABASE_PATH
        - name: JWT_SECRET
          valueFrom:
            secretKeyRef:
              name: matsushiba-secrets
              key: JWT_SECRET
        - name: REDIS_URL
          valueFrom:
            configMapKeyRef:
              name: matsushiba-config
              key: REDIS_URL
        volumeMounts:
        - name: data-volume
          mountPath: /data
        - name: logs-volume
          mountPath: /var/log
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 3
      volumes:
      - name: data-volume
        persistentVolumeClaim:
          claimName: matsushiba-pvc
      - name: logs-volume
        emptyDir: {}
      imagePullSecrets:
      - name: registry-secret

---
# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: matsushiba-service
  namespace: matsushiba
spec:
  selector:
    app: matsushiba-app
  ports:
  - port: 80
    targetPort: 8000
    protocol: TCP
  type: ClusterIP

---
# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: matsushiba-ingress
  namespace: matsushiba
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/rate-limit: "100"
    nginx.ingress.kubernetes.io/rate-limit-window: "1m"
spec:
  tls:
  - hosts:
    - your-domain.com
    secretName: matsushiba-tls
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: matsushiba-service
            port:
              number: 80

---
# k8s/hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: matsushiba-hpa
  namespace: matsushiba
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: matsushiba-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

Helm Chart

# helm/matsushiba/Chart.yaml
apiVersion: v2
name: matsushiba
description: MatsushibaDB Application Helm Chart
type: application
version: 1.0.0
appVersion: "1.0.0"

---
# helm/matsushiba/values.yaml
replicaCount: 3

image:
  repository: matsushibadb/matsushibadb
  pullPolicy: IfNotPresent
  tag: "latest"

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

service:
  type: ClusterIP
  port: 80
  targetPort: 8000

ingress:
  enabled: true
  className: "nginx"
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  hosts:
    - host: your-domain.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: matsushiba-tls
      hosts:
        - your-domain.com

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70
  targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

persistence:
  enabled: true
  storageClass: matsushiba-storage
  accessMode: ReadWriteOnce
  size: 10Gi

config:
  NODE_ENV: production
  DATABASE_PATH: /data/production.db
  LOG_LEVEL: info
  REDIS_URL: redis://matsushiba-redis:6379

secrets:
  JWT_SECRET: ""
  REDIS_PASSWORD: ""
  GRAFANA_PASSWORD: ""

monitoring:
  enabled: true
  prometheus:
    enabled: true
  grafana:
    enabled: true

Cloud Platform Deployment

AWS ECS Deployment

// aws/ecs-task-definition.json
{
  "family": "matsushiba-app",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024",
  "executionRoleArn": "arn:aws:iam::account:role/ecsTaskExecutionRole",
  "taskRoleArn": "arn:aws:iam::account:role/ecsTaskRole",
  "containerDefinitions": [
    {
      "name": "matsushiba-app",
      "image": "your-account.dkr.ecr.region.amazonaws.com/matsushibadb:latest",
      "portMappings": [
        {
          "containerPort": 8000,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "environment": [
        {
          "name": "NODE_ENV",
          "value": "production"
        },
        {
          "name": "DATABASE_PATH",
          "value": "/data/production.db"
        }
      ],
      "secrets": [
        {
          "name": "JWT_SECRET",
          "valueFrom": "arn:aws:secretsmanager:region:account:secret:matsushiba/jwt-secret"
        },
        {
          "name": "REDIS_URL",
          "valueFrom": "arn:aws:secretsmanager:region:account:secret:matsushiba/redis-url"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/matsushiba-app",
          "awslogs-region": "us-west-2",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -f http://localhost:8000/health || exit 1"
        ],
        "interval": 30,
        "timeout": 5,
        "retries": 3,
        "startPeriod": 60
      },
      "mountPoints": [
        {
          "sourceVolume": "data",
          "containerPath": "/data",
          "readOnly": false
        }
      ]
    }
  ],
  "volumes": [
    {
      "name": "data",
      "efsVolumeConfiguration": {
        "fileSystemId": "fs-12345678",
        "rootDirectory": "/matsushiba",
        "transitEncryption": "ENABLED"
      }
    }
  ]
}

Google Cloud Run

# gcp/cloud-run.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: matsushiba-app
  annotations:
    run.googleapis.com/ingress: all
    run.googleapis.com/execution-environment: gen2
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "10"
        autoscaling.knative.dev/minScale: "1"
        run.googleapis.com/cpu-throttling: "false"
        run.googleapis.com/execution-environment: gen2
    spec:
      containerConcurrency: 100
      timeoutSeconds: 300
      containers:
      - image: gcr.io/your-project/matsushibadb:latest
        ports:
        - containerPort: 8000
        env:
        - name: NODE_ENV
          value: "production"
        - name: DATABASE_PATH
          value: "/data/production.db"
        - name: JWT_SECRET
          valueFrom:
            secretKeyRef:
              name: matsushiba-secrets
              key: jwt-secret
        - name: REDIS_URL
          valueFrom:
            secretKeyRef:
              name: matsushiba-secrets
              key: redis-url
        resources:
          limits:
            cpu: "2"
            memory: "2Gi"
          requests:
            cpu: "1"
            memory: "1Gi"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5

Azure Container Instances

# azure/container-instance.yaml
apiVersion: 2019-12-01
location: eastus
name: matsushiba-app
properties:
  containers:
  - name: matsushiba-app
    properties:
      image: your-registry.azurecr.io/matsushibadb:latest
      ports:
      - port: 8000
        protocol: TCP
      environmentVariables:
      - name: NODE_ENV
        value: production
      - name: DATABASE_PATH
        value: /data/production.db
      - name: JWT_SECRET
        secureValue: your-jwt-secret
      - name: REDIS_URL
        secureValue: redis://your-redis:6379
      resources:
        requests:
          cpu: 1
          memoryInGb: 1
        limits:
          cpu: 2
          memoryInGb: 2
      livenessProbe:
        httpGet:
          path: /health
          port: 8000
        initialDelaySeconds: 30
        periodSeconds: 10
      readinessProbe:
        httpGet:
          path: /health
          port: 8000
        initialDelaySeconds: 5
        periodSeconds: 5
  osType: Linux
  restartPolicy: Always
  ipAddress:
    type: Public
    ports:
    - protocol: TCP
      port: 80
    - protocol: TCP
      port: 443
  volumes:
  - name: data
    azureFile:
      shareName: matsushiba-data
      storageAccountName: yourstorageaccount
      storageAccountKey: your-storage-key

Monitoring and Logging

Prometheus Configuration

# monitoring/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - "rules/*.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - alertmanager:9093

scrape_configs:
  - job_name: 'matsushiba-app'
    static_configs:
      - targets: ['matsushiba-app:8000']
    metrics_path: '/metrics'
    scrape_interval: 5s

  - job_name: 'redis'
    static_configs:
      - targets: ['redis:6379']

  - job_name: 'nginx'
    static_configs:
      - targets: ['nginx:9113']

  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']

Grafana Dashboard

{
  "dashboard": {
    "id": null,
    "title": "MatsushibaDB Application Dashboard",
    "tags": ["matsushiba", "application"],
    "style": "dark",
    "timezone": "browser",
    "panels": [
      {
        "id": 1,
        "title": "Request Rate",
        "type": "graph",
        "targets": [
          {
            "expr": "rate(http_requests_total[5m])",
            "legendFormat": "{{method}} {{endpoint}}"
          }
        ],
        "yAxes": [
          {
            "label": "requests/sec"
          }
        ]
      },
      {
        "id": 2,
        "title": "Response Time",
        "type": "graph",
        "targets": [
          {
            "expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))",
            "legendFormat": "95th percentile"
          },
          {
            "expr": "histogram_quantile(0.50, rate(http_request_duration_seconds_bucket[5m]))",
            "legendFormat": "50th percentile"
          }
        ],
        "yAxes": [
          {
            "label": "seconds"
          }
        ]
      },
      {
        "id": 3,
        "title": "Error Rate",
        "type": "graph",
        "targets": [
          {
            "expr": "rate(http_requests_total{status=~\"5..\"}[5m])",
            "legendFormat": "5xx errors"
          },
          {
            "expr": "rate(http_requests_total{status=~\"4..\"}[5m])",
            "legendFormat": "4xx errors"
          }
        ],
        "yAxes": [
          {
            "label": "errors/sec"
          }
        ]
      },
      {
        "id": 4,
        "title": "Database Connections",
        "type": "graph",
        "targets": [
          {
            "expr": "matsushiba_db_connections_active",
            "legendFormat": "Active Connections"
          },
          {
            "expr": "matsushiba_db_connections_idle",
            "legendFormat": "Idle Connections"
          }
        ],
        "yAxes": [
          {
            "label": "connections"
          }
        ]
      },
      {
        "id": 5,
        "title": "Database Query Performance",
        "type": "graph",
        "targets": [
          {
            "expr": "histogram_quantile(0.95, rate(matsushiba_db_query_duration_seconds_bucket[5m]))",
            "legendFormat": "95th percentile"
          }
        ],
        "yAxes": [
          {
            "label": "seconds"
          }
        ]
      }
    ],
    "time": {
      "from": "now-1h",
      "to": "now"
    },
    "refresh": "5s"
  }
}

Backup and Recovery

Automated Backup Script

#!/bin/bash
# backup.sh

# Configuration
BACKUP_DIR="/backups/matsushiba"
DB_PATH="/data/production.db"
RETENTION_DAYS=30
S3_BUCKET="your-backup-bucket"
S3_PREFIX="matsushiba-backups"

# Create backup directory
mkdir -p "$BACKUP_DIR"

# Generate backup filename
BACKUP_FILE="matsushiba-backup-$(date +%Y%m%d-%H%M%S).db"

# Create database backup
echo "Creating database backup..."
sqlite3 "$DB_PATH" ".backup '$BACKUP_DIR/$BACKUP_FILE'"

# Compress backup
echo "Compressing backup..."
gzip "$BACKUP_DIR/$BACKUP_FILE"

# Upload to S3
echo "Uploading to S3..."
aws s3 cp "$BACKUP_DIR/$BACKUP_FILE.gz" "s3://$S3_BUCKET/$S3_PREFIX/$BACKUP_FILE.gz"

# Clean up local backups older than retention period
echo "Cleaning up old backups..."
find "$BACKUP_DIR" -name "*.gz" -mtime +$RETENTION_DAYS -delete

# Clean up S3 backups older than retention period
echo "Cleaning up old S3 backups..."
aws s3 ls "s3://$S3_BUCKET/$S3_PREFIX/" --recursive | while read -r line; do
    createDate=$(echo $line | awk '{print $1" "$2}')
    createDate=$(date -d"$createDate" +%s)
    olderThan=$(date -d"$RETENTION_DAYS days ago" +%s)
    if [[ $createDate -lt $olderThan ]]; then
        fileName=$(echo $line | awk '{print $4}')
        aws s3 rm "s3://$S3_BUCKET/$fileName"
    fi
done

echo "Backup completed successfully!"

Recovery Script

#!/bin/bash
# restore.sh

# Configuration
BACKUP_DIR="/backups/matsushiba"
DB_PATH="/data/production.db"
S3_BUCKET="your-backup-bucket"
S3_PREFIX="matsushiba-backups"

# Function to list available backups
list_backups() {
    echo "Available backups:"
    aws s3 ls "s3://$S3_BUCKET/$S3_PREFIX/" --recursive | sort -r | head -10
}

# Function to restore from backup
restore_backup() {
    local backup_file="$1"
    
    if [ -z "$backup_file" ]; then
        echo "Error: Backup file not specified"
        list_backups
        exit 1
    fi
    
    echo "Stopping application..."
    # Stop your application here
    
    echo "Creating backup of current database..."
    cp "$DB_PATH" "$DB_PATH.backup.$(date +%Y%m%d-%H%M%S)"
    
    echo "Downloading backup from S3..."
    aws s3 cp "s3://$S3_BUCKET/$S3_PREFIX/$backup_file" "$BACKUP_DIR/$backup_file"
    
    echo "Decompressing backup..."
    gunzip "$BACKUP_DIR/$backup_file"
    
    echo "Restoring database..."
    cp "$BACKUP_DIR/${backup_file%.gz}" "$DB_PATH"
    
    echo "Starting application..."
    # Start your application here
    
    echo "Restore completed successfully!"
}

# Main script
case "$1" in
    list)
        list_backups
        ;;
    restore)
        restore_backup "$2"
        ;;
    *)
        echo "Usage: $0 {list|restore} [backup_file]"
        echo "  list    - List available backups"
        echo "  restore - Restore from specified backup file"
        exit 1
        ;;
esac

Security Hardening

Container Security

# Dockerfile.security
FROM matsushibadb/matsushibadb:latest

# Create non-root user
RUN addgroup -g 1001 -S matsushiba && \
    adduser -S matsushiba -u 1001

# Set proper permissions
RUN chown -R matsushiba:matsushiba /app && \
    chmod -R 755 /app

# Switch to non-root user
USER matsushiba

# Expose port
EXPOSE 8000

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8000/health || exit 1

# Start application
CMD ["node", "app.js"]

Security Configuration

# security-config.yml
security:
  # Authentication
  authentication:
    enabled: true
    jwt_secret: ${JWT_SECRET}
    token_expiry: 1h
    refresh_token_expiry: 7d
  
  # Authorization
  authorization:
    enabled: true
    rbac_enabled: true
    default_role: user
  
  # Encryption
  encryption:
    enabled: true
    algorithm: AES-256-CBC
    key: ${ENCRYPTION_KEY}
    key_rotation:
      enabled: true
      interval: 30d
  
  # Audit logging
  audit_logging:
    enabled: true
    log_level: info
    log_file: /var/log/audit.log
  
  # Network security
  network:
    cors_origins:
      - https://yourdomain.com
    rate_limiting:
      enabled: true
      window_ms: 900000  # 15 minutes
      max_requests: 1000

Best Practices

1

Use Production Images

Always use production-optimized images with proper security configurations.
2

Implement Health Checks

Configure proper health checks for container orchestration and monitoring.
3

Use Secrets Management

Store sensitive configuration in secure secret management systems.
4

Enable Monitoring

Set up comprehensive monitoring and logging for production deployments.
5

Implement Backup Strategy

Create automated backup and recovery procedures for data protection.
6

Use Resource Limits

Set appropriate resource limits and requests for container scheduling.
7

Enable Security Scanning

Regularly scan container images for vulnerabilities and security issues.
8

Use Multi-Architecture Images

Deploy multi-architecture images for better compatibility across platforms.
Docker deployment provides excellent portability and scalability. Always use production-ready configurations, implement proper monitoring, and follow security best practices for containerized deployments.