# Getting Started ## Installation Add Concord to your `mix.exs`: ```elixir def deps do [ {:concord, "~> 0.1.0"} ] end ``` ## Quick Start — Embedded Database Concord starts automatically with your application. No separate infrastructure needed. ```elixir # Store data Concord.put("user:1001", %{name: "Alice", role: "admin"}) #=> :ok # Retrieve data Concord.get("user:1001") #=> {:ok, %{name: "Alice", role: "admin"}} # Store with TTL (auto-expires after 1 hour) Concord.put("feature:dark_mode", "enabled", ttl: 3600) # Get value with remaining TTL Concord.get_with_ttl("feature:dark_mode") #=> {:ok, {"enabled", 3595}} # Delete Concord.delete("user:1001") #=> :ok ``` ## Quick Start — HTTP API **1. Start the HTTP API server:** ```bash # Development mode (auth disabled) iex -S mix # With HTTP API enabled (see config/dev.exs) CONCORD_API_PORT=4000 iex -S mix ``` **2. Use the REST API:** ```bash # Health check curl http://localhost:4000/api/v1/health # Store data curl -X PUT \ -H "Content-Type: application/json" \ -d '{"value": "Hello, World!"}' \ http://localhost:4000/api/v1/kv/greeting # Retrieve data curl http://localhost:4000/api/v1/kv/greeting # Interactive Swagger UI open http://localhost:4000/api/docs ``` See [HTTP API Guide](API_USAGE_EXAMPLES.md) for full examples including authentication. ## Multi-Node Cluster ```bash # Terminal 1 iex --name n1@127.0.0.1 --cookie concord -S mix # Terminal 2 iex --name n2@127.0.0.1 --cookie concord -S mix # Terminal 3 iex --name n3@127.0.0.1 --cookie concord -S mix ``` Nodes discover each other automatically via libcluster gossip. ## Authentication Authentication is disabled in dev and enabled in prod by default. ```elixir # config/prod.exs config :concord, auth_enabled: true ``` ```bash # Create a token mix concord.cluster token create # => Created token: sk_concord_abc123def456... # Revoke when needed mix concord.cluster token revoke sk_concord_abc123def456... ``` ```elixir # Use tokens in code token = System.fetch_env!("CONCORD_TOKEN") Concord.put("config:api_rate_limit", 1000, token: token) Concord.get("config:api_rate_limit", token: token) ``` ## Common Use Cases ### Feature Flags ```elixir Concord.put("flags:new_dashboard", "enabled") if Concord.get("flags:new_dashboard") == {:ok, "enabled"} do render_new_dashboard() end ``` ### Session Storage ```elixir # Store session with 30-minute TTL Concord.put("session:#{session_id}", session_data, ttl: 1800) # Retrieve session Concord.get_with_ttl("session:#{session_id}") #=> {:ok, {%{user_id: 123, ...}, 1755}} # Extend session on activity Concord.touch("session:#{session_id}", 1800) ``` ### Rate Limiting ```elixir user_key = "rate_limit:#{user_id}:#{Date.utc_today()}" case Concord.get(user_key) do {:ok, count} when count < 1000 -> Concord.put(user_key, count + 1, ttl: 86400) :allow _ -> :deny end ``` ### Service Discovery ```elixir Concord.put("services:web:1", %{ host: "10.0.1.100", port: 8080, health: "healthy" }) {:ok, all} = Concord.get_all() healthy = all |> Enum.filter(fn {k, _} -> String.starts_with?(k, "services:web:") end) |> Enum.filter(fn {_, v} -> v.health == "healthy" end) ``` ### Distributed Locks ```elixir case Concord.put("locks:job:123", "node:worker1", timeout: 5000) do :ok -> # Do work Concord.delete("locks:job:123") {:error, :timeout} -> # Lock already held end ``` ## Management Commands ```bash # Check cluster health mix concord.cluster status # List cluster members mix concord.cluster members # Create authentication token mix concord.cluster token create # Revoke a token mix concord.cluster token revoke ``` ## HTTP API Endpoints | Method | Path | Description | |--------|------|-------------| | PUT | `/api/v1/kv/:key` | Store key-value pair | | GET | `/api/v1/kv/:key` | Retrieve value | | DELETE | `/api/v1/kv/:key` | Delete key | | POST | `/api/v1/kv/:key/touch` | Extend TTL | | GET | `/api/v1/kv/:key/ttl` | Get remaining TTL | | POST | `/api/v1/kv/bulk` | Bulk store (up to 500) | | POST | `/api/v1/kv/bulk/get` | Bulk retrieve | | POST | `/api/v1/kv/bulk/delete` | Bulk delete | | POST | `/api/v1/kv/bulk/touch` | Bulk TTL extend | | GET | `/api/v1/kv` | List all keys | | GET | `/api/v1/status` | Cluster status | | GET | `/api/v1/health` | Health check | | GET | `/api/v1/openapi.json` | OpenAPI spec | | GET | `/api/docs` | Swagger UI | ## Next Steps - [Elixir API Guide](elixir-guide.md) — Read consistency, conditional updates, queries, compression - [HTTP API Reference](API_DESIGN.md) — Full HTTP endpoint documentation - [HTTP API Examples](API_USAGE_EXAMPLES.md) — curl examples - [Observability](observability.md) — Telemetry, Prometheus, tracing, audit logging - [Backup & Restore](backup-restore.md) — Data safety and disaster recovery - [Configuration](configuration.md) — All configuration options - [Production Deployment](deployment.md) — Docker, Kubernetes, security hardening