A production-ready Helm chart for deploying Appwrite on Kubernetes with high availability, monitoring, and enterprise-grade configurations.
- Complete Appwrite stack deployment (API, Realtime, Workers, Database, Cache, Storage)
- Production-optimized configurations with resource management and security hardening
- S3-compatible storage support (AWS S3, MinIO, DigitalOcean Spaces, Backblaze, Wasabi, Linode)
- Comprehensive monitoring with InfluxDB and Telegraf for metrics collection
- Multiple deployment profiles (lean single-node vs full multi-node production)
- Extensive customization options for enterprise environments
- Local testing infrastructure with k3d for development and validation
- Kubernetes 1.19+
- Helm 3.8+
- Storage class for persistent volumes
- Ingress controller (Traefik, NGINX, etc.)
# Add Helm repository
helm repo add algol-labs https://algol-labs.github.io/algol-appwrite-helm
helm repo update
# Install with lean production values (recommended for single node)
helm install appwrite algol-labs/appwrite \
--namespace appwrite --create-namespace \
--values https://raw.githubusercontent.com/Algol-Labs/algol-appwrite-helm/main/values-production-lean.yaml# Install with your own values
helm install appwrite . \
--namespace appwrite --create-namespace \
--values values-production-lean.yaml| Profile | Use Case | CPU | Memory | Replicas | HA | Storage |
|---|---|---|---|---|---|---|
| Lean | Single node, testing, MVP | 2.5 cores | 6GB | 1 | β | 50GB+ |
| Full | Multi-node, production | 6.4 cores | 13GB | 2 | β | 100GB+ |
Perfect for single-node clusters, development, or MVP deployments:
# Generate secrets
export APPWRITE_OPENSSL_KEY=$(openssl rand -hex 32)
export DB_ROOT_PASSWORD=$(openssl rand -base64 32)
export DB_PASSWORD=$(openssl rand -base64 32)
export EXECUTOR_SECRET=$(openssl rand -hex 32)
export S3_ACCESS_KEY='your-minio-access-key'
export S3_SECRET='your-minio-secret-key'
# Install
helm install appwrite . \
--namespace appwrite --create-namespace \
--values values-production-lean.yaml \
--set secrets.opensslKeyV1="$APPWRITE_OPENSSL_KEY" \
--set secrets.dbRootPassword="$DB_ROOT_PASSWORD" \
--set secrets.dbPassword="$DB_PASSWORD" \
--set secrets.executorSecret="$EXECUTOR_SECRET" \
--set secrets.storage.s3.accessKey="$S3_ACCESS_KEY" \
--set secrets.storage.s3.secret="$S3_SECRET"For multi-node clusters with high availability:
# Use full production configuration
helm install appwrite . \
--namespace appwrite --create-namespace \
--values values-production.yaml \
--set secrets.opensslKeyV1="$APPWRITE_OPENSSL_KEY" \
--set secrets.dbRootPassword="$DB_ROOT_PASSWORD" \
--set secrets.dbPassword="$DB_PASSWORD" \
--set secrets.executorSecret="$EXECUTOR_SECRET" \
--set secrets.storage.s3.accessKey="$S3_ACCESS_KEY" \
--set secrets.storage.s3.secret="$S3_SECRET"The chart supports multiple S3-compatible storage providers:
storage:
s3:
enabled: true
provider: "minio" # aws, minio, do, backblaze, linode, wasabi
endpoint: "https://your-s3-endpoint.com"
region: "us-east-1"
bucket: "appwrite"
accessKey: "your-access-key" # Set via secrets
secret: "your-secret-key" # Set via secretsglobal:
domain: "appwrite.example.com" # Main domain
domainRealtime: "realtime.example.com" # WebSocket domain
domainFunctions: "functions.example.com" # Functions domainResources are optimized for different deployment sizes:
resources:
api:
requests:
cpu: "1000m"
memory: "2Gi"
limits:
cpu: "2000m"
memory: "4Gi"The chart includes comprehensive monitoring with:
- InfluxDB for metrics storage
- Telegraf for metrics collection
- Grafana-ready dashboards (configure separately)
Access metrics at: http://appwrite-influxdb:8086
# Install testing tools
brew install k3d kubectl helm # macOS
# or
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash # Linux# Setup local cluster
./test/k3d/setup.sh
# Install chart
OPENSSL_KEY=$(openssl rand -hex 32)
helm install appwrite . -n appwrite -f test/k3d/values-local.yaml \
--set secrets.opensslKeyV1=$OPENSSL_KEY
# Access
open http://localhost # or http://appwrite.localSee Local Testing Guide for detailed setup.
- Production Deployment Guide - Complete production setup
- Local Testing Setup - Development environment
- Sprint Development Notes - Development roadmap and progress
- Open Source Guide - Release preparation and community building
We welcome contributions! See CONTRIBUTING.md for:
- Development setup and environment
- Chart development guidelines
- Testing requirements
- Pull request process
# Setup local test environment
./test/k3d/setup.sh
# Make changes to templates
vim templates/core/appwrite-deployment.yaml
# Test changes
helm upgrade appwrite . --namespace appwrite
# Validate
helm lint .
kubectl get pods -n appwrite- Appwrite API - Main application server
- Appwrite Realtime - WebSocket server for real-time features
- Appwrite Workers - Background job processors
- MariaDB - Primary database (MySQL compatible)
- Redis - Cache and session storage
- InfluxDB - Metrics and analytics storage
- Telegraf - Metrics collection agent
- Persistent volumes for all stateful data
- Ingress controller integration (Traefik, NGINX, etc.)
- S3-compatible storage for file uploads and assets
Pods stuck in Pending:
kubectl describe pod -n appwrite <pod-name>
# Check Events section for resource constraintsDatabase connection issues:
kubectl logs -n appwrite deployment/appwrite-mariadbStorage mounting problems:
kubectl get pvc -n appwrite
kubectl describe pvc <pvc-name># Check resource usage
kubectl top pods -n appwrite
# View logs
kubectl logs -n appwrite -l component=api --tail=50
# Check all resources
kubectl get all,ingress,pvc,secrets -n appwrite# Upgrade with new values
helm upgrade appwrite . \
--namespace appwrite \
--values values-production-lean.yaml
# Check upgrade status
helm list -n appwrite
kubectl get pods -n appwrite --watch# Remove deployment
helm uninstall appwrite -n appwrite
# Clean up persistent data (optional)
kubectl delete pvc --all -n appwrite
# Remove namespace
kubectl delete namespace appwriteLicensed under the MIT License.
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: See full docs in
/docs
Made with β€οΈ by Algol Labs