publog
Deploy Publog centralized log viewer - supports Docker Compose, Docker Swarm, Kubernetes, or standalone binary
Recipaie - Deployment Recipe
The template that describes how to deploy this service.
Raw JSON
{
"$schema": "https://recipaie.com/schemas/recipaie.schema.json",
"name": "publog",
"version": "1.0.0",
"description": "Deploy Publog centralized log viewer - supports Docker Compose, Docker Swarm, Kubernetes, or standalone binary",
"prerequisites": [
"Redis 7+ with RediSearch module (Redis Stack recommended)",
"One of: Docker, Docker Swarm, Kubernetes, or a Linux server for standalone deployment",
"Network access to log.dixt.io for MCP client, or self-hosted instance"
],
"steps": [
{
"order": 1,
"what": "Determine deployment method",
"why": "Publog can run in multiple environments - choose what fits your infrastructure",
"when": "Before starting deployment",
"how": "Assess your environment: (1) Docker Compose for single-node dev/small prod, (2) Docker Swarm for multi-node clusters, (3) Kubernetes for K8s clusters, (4) Standalone binary for non-containerized servers",
"verify": "Deployment method chosen and noted",
"comments": [
"All methods use the same publog binary from binary.dixt.io",
"Standalone binary is simplest - just download and run",
"Container methods provide isolation and orchestration"
]
},
{
"order": 2,
"what": "Ensure Redis with RediSearch is available",
"why": "Publog requires Redis Stack (Redis + RediSearch) for full-text log search",
"when": "Before deploying publog service",
"skip_if": "Redis with RediSearch already running and accessible",
"how": "Deploy Redis Stack: (Docker) docker run -d --name redis-stack redis/redis-stack:latest, (K8s) use redis-stack helm chart, (Standalone) install redis-stack-server package",
"verify": "redis-cli PING returns PONG, and FT._LIST works (RediSearch loaded)",
"comments": [
"Standard Redis without RediSearch will NOT work - search features require RediSearch",
"Redis Stack includes Redis + RediSearch + RedisJSON",
"For production: configure persistence and memory limits"
]
},
{
"order": 3,
"what": "Download publog binary",
"why": "Publog is distributed as a static Go binary via pubbin",
"when": "When deploying new or updating existing installation",
"skip_if": "Current publog version matches target version",
"how": "Download from https://binary.dixt.io/download/publog/{version}/{platform} where platform is linux-amd64, linux-arm64, darwin-amd64, or darwin-arm64",
"verify": "./publog --version shows expected version",
"comments": [
"Binary is ~15-20MB, statically compiled (CGO_ENABLED=0)",
"For containers: mount binary into Alpine container",
"Auto-update available if BINARY_REPO_KEY is configured"
]
},
{
"order": 4,
"what": "Configure environment variables",
"why": "Publog needs Redis connection and optional settings",
"when": "Before starting the service",
"how": "Set environment variables: REDIS_HOST (required), REDIS_PORT (default 6379), PORT (HTTP port, default 8080), BINARY_REPO_KEY (optional, for auto-updates)",
"verify": "Environment variables are set and accessible to the service",
"comments": [
"For Docker: use -e flags or env_file",
"For K8s: use ConfigMap/Secret",
"For systemd: use Environment= in unit file",
"For standalone: export in shell or .env file"
]
},
{
"order": 5,
"what": "Deploy the service",
"why": "Start publog using your chosen deployment method",
"when": "After configuration is ready",
"how": "Choose method: (Docker Compose) docker compose up -d, (Docker Swarm) docker stack deploy -c compose.yml publog, (Kubernetes) kubectl apply -f publog-deployment.yaml, (Standalone) ./publog or use systemd service",
"verify": "curl http://localhost:8080/health returns {\"status\":\"ok\"}",
"comments": [
"For production: place behind reverse proxy (Traefik, nginx, Ingress)",
"Health endpoint doesn't require authentication",
"Logs available at stdout (Docker) or via journalctl (systemd)"
]
},
{
"order": 6,
"what": "Verify log ingestion",
"why": "Confirm services can send logs to publog",
"when": "After service is running",
"how": "Send a test log via API or configure Publifye Logger in your services to point to this publog instance",
"verify": "Query logs via API or MCP - logs should appear within seconds"
}
],
"step_count": 6
}
Prerequisites
Redis 7+ with RediSearch module (Redis Stack recommended)One of: Docker, Docker Swarm, Kubernetes, or a Linux server for standalone deploymentNetwork access to log.dixt.io for MCP client, or self-hosted instance
Steps
1 Determine deployment method
- Why
- Publog can run in multiple environments - choose what fits your infrastructure
- When
- Before starting deployment
- How
Assess your environment: (1) Docker Compose for single-node dev/small prod, (2) Docker Swarm for multi-node clusters, (3) Kubernetes for K8s clusters, (4) Standalone binary for non-containerized servers- Verify
- Deployment method chosen and noted
- Comments
- All methods use the same publog binary from binary.dixt.io
- Standalone binary is simplest - just download and run
- Container methods provide isolation and orchestration
2 Ensure Redis with RediSearch is available
- Why
- Publog requires Redis Stack (Redis + RediSearch) for full-text log search
- When
- Before deploying publog service
- Skip If
- Redis with RediSearch already running and accessible
- How
Deploy Redis Stack: (Docker) docker run -d --name redis-stack redis/redis-stack:latest, (K8s) use redis-stack helm chart, (Standalone) install redis-stack-server package- Verify
- redis-cli PING returns PONG, and FT._LIST works (RediSearch loaded)
- Comments
- Standard Redis without RediSearch will NOT work - search features require RediSearch
- Redis Stack includes Redis + RediSearch + RedisJSON
- For production: configure persistence and memory limits
3 Download publog binary
- Why
- Publog is distributed as a static Go binary via pubbin
- When
- When deploying new or updating existing installation
- Skip If
- Current publog version matches target version
- How
Download from https://binary.dixt.io/download/publog/{version}/{platform} where platform is linux-amd64, linux-arm64, darwin-amd64, or darwin-arm64- Verify
- ./publog --version shows expected version
- Comments
- Binary is ~15-20MB, statically compiled (CGO_ENABLED=0)
- For containers: mount binary into Alpine container
- Auto-update available if BINARY_REPO_KEY is configured
4 Configure environment variables
- Why
- Publog needs Redis connection and optional settings
- When
- Before starting the service
- How
Set environment variables: REDIS_HOST (required), REDIS_PORT (default 6379), PORT (HTTP port, default 8080), BINARY_REPO_KEY (optional, for auto-updates)- Verify
- Environment variables are set and accessible to the service
- Comments
- For Docker: use -e flags or env_file
- For K8s: use ConfigMap/Secret
- For systemd: use Environment= in unit file
- For standalone: export in shell or .env file
5 Deploy the service
- Why
- Start publog using your chosen deployment method
- When
- After configuration is ready
- How
Choose method: (Docker Compose) docker compose up -d, (Docker Swarm) docker stack deploy -c compose.yml publog, (Kubernetes) kubectl apply -f publog-deployment.yaml, (Standalone) ./publog or use systemd service- Verify
- curl http://localhost:8080/health returns {"status":"ok"}
- Comments
- For production: place behind reverse proxy (Traefik, nginx, Ingress)
- Health endpoint doesn't require authentication
- Logs available at stdout (Docker) or via journalctl (systemd)
6 Verify log ingestion
- Why
- Confirm services can send logs to publog
- When
- After service is running
- How
Send a test log via API or configure Publifye Logger in your services to point to this publog instance- Verify
- Query logs via API or MCP - logs should appear within seconds
Prodaie - Execution Record
What happened when an AI executed this recipe in different environments.
Raw JSON
{
"$schema": "https://recipaie.com/schemas/prodaie.schema.json",
"name": "publog",
"description": "Deployment record of Publog to production (Docker Swarm) and staging (Kubernetes) environments",
"locations": [
{
"path": "prod-server-01 (Docker Swarm)",
"description": "Production deployment on Docker Swarm cluster",
"status": "complete",
"step_count": 6,
"steps": [
{
"order": 1,
"what": "Determine deployment method",
"why": "Publog can run in multiple environments - choose what fits your infrastructure",
"when": "Before starting deployment",
"how": "Assess your environment",
"verify": "Deployment method chosen and noted",
"success": true,
"details": "chose Docker Swarm for multi-node HA deployment"
},
{
"order": 2,
"what": "Ensure Redis with RediSearch is available",
"why": "Publog requires Redis Stack for full-text log search",
"when": "Before deploying publog service",
"skip_if": "Redis with RediSearch already running",
"how": "Deploy Redis Stack",
"verify": "redis-cli PING returns PONG",
"success": true,
"details": "Redis Stack already running at redis.internal:6379"
},
{
"order": 3,
"what": "Download publog binary",
"why": "Publog is distributed as a static Go binary via pubbin",
"when": "When deploying new or updating existing installation",
"skip_if": "Current publog version matches target version",
"how": "Download from binary.dixt.io",
"verify": "./publog --version shows expected version",
"success": true,
"details": "downloaded v0.3.2 for linux-amd64"
},
{
"order": 4,
"what": "Configure environment variables",
"why": "Publog needs Redis connection and optional settings",
"when": "Before starting the service",
"how": "Set environment variables in compose.yml",
"verify": "Environment variables are set",
"success": true,
"details": "configured REDIS_HOST, PORT, BINARY_REPO_KEY in compose.yml"
},
{
"order": 5,
"what": "Deploy the service",
"why": "Start publog using Docker Swarm",
"when": "After configuration is ready",
"how": "docker stack deploy -c compose.yml publog",
"verify": "curl http://localhost:8080/health returns ok",
"success": true,
"details": "service deployed, health check passing"
},
{
"order": 6,
"what": "Verify log ingestion",
"why": "Confirm services can send logs to publog",
"when": "After service is running",
"how": "Check logs via MCP",
"verify": "Query logs via API or MCP",
"success": true,
"details": "logs from 12 services visible within seconds"
}
]
},
{
"path": "staging-k8s (Kubernetes)",
"description": "Staging deployment on Kubernetes cluster",
"status": "complete",
"step_count": 6,
"steps": [
{
"order": 1,
"what": "Determine deployment method",
"why": "Publog can run in multiple environments",
"when": "Before starting deployment",
"how": "Assess your environment",
"verify": "Deployment method chosen",
"success": true,
"details": "chose Kubernetes for integration with existing K8s cluster"
},
{
"order": 2,
"what": "Ensure Redis with RediSearch is available",
"why": "Publog requires Redis Stack for full-text log search",
"when": "Before deploying publog service",
"skip_if": "Redis with RediSearch already running",
"how": "Deploy Redis Stack via Helm",
"verify": "redis-cli PING returns PONG",
"success": true,
"details": "deployed Bitnami Redis Stack helm chart to redis namespace"
},
{
"order": 3,
"what": "Download publog binary",
"why": "Publog is distributed as a static Go binary",
"when": "When deploying new or updating",
"skip_if": "Current version matches target",
"how": "Build container image with binary",
"verify": "Container image built successfully",
"success": true,
"details": "built publog:0.3.2 image with alpine base"
},
{
"order": 4,
"what": "Configure environment variables",
"why": "Publog needs Redis connection",
"when": "Before starting the service",
"how": "Create ConfigMap and Secret",
"verify": "kubectl get configmap publog-config",
"success": true,
"details": "created ConfigMap with REDIS_HOST pointing to redis-stack.redis.svc"
},
{
"order": 5,
"what": "Deploy the service",
"why": "Start publog using Kubernetes",
"when": "After configuration is ready",
"how": "kubectl apply -f publog-deployment.yaml",
"verify": "kubectl get pods -l app=publog shows Running",
"success": true,
"details": "2 replicas running behind ClusterIP service"
},
{
"order": 6,
"what": "Verify log ingestion",
"why": "Confirm services can send logs",
"when": "After service is running",
"how": "Port-forward and check",
"verify": "Logs visible via API",
"success": true,
"details": "ingress configured, logs flowing from staging apps"
}
]
}
]
}
Locations
prod-server-01 (Docker Swarm) complete
Production deployment on Docker Swarm cluster
1 Determine deployment method ✓
- Why
- Publog can run in multiple environments - choose what fits your infrastructure
- When
- Before starting deployment
- How
Assess your environment- Verify
- Deployment method chosen and noted
- Result
- ✓ chose Docker Swarm for multi-node HA deployment
2 Ensure Redis with RediSearch is available ✓
- Why
- Publog requires Redis Stack for full-text log search
- When
- Before deploying publog service
- Skip If
- Redis with RediSearch already running
- How
Deploy Redis Stack- Verify
- redis-cli PING returns PONG
- Result
- ✓ Redis Stack already running at redis.internal:6379
3 Download publog binary ✓
- Why
- Publog is distributed as a static Go binary via pubbin
- When
- When deploying new or updating existing installation
- Skip If
- Current publog version matches target version
- How
Download from binary.dixt.io- Verify
- ./publog --version shows expected version
- Result
- ✓ downloaded v0.3.2 for linux-amd64
4 Configure environment variables ✓
- Why
- Publog needs Redis connection and optional settings
- When
- Before starting the service
- How
Set environment variables in compose.yml- Verify
- Environment variables are set
- Result
- ✓ configured REDIS_HOST, PORT, BINARY_REPO_KEY in compose.yml
5 Deploy the service ✓
- Why
- Start publog using Docker Swarm
- When
- After configuration is ready
- How
docker stack deploy -c compose.yml publog- Verify
- curl http://localhost:8080/health returns ok
- Result
- ✓ service deployed, health check passing
6 Verify log ingestion ✓
- Why
- Confirm services can send logs to publog
- When
- After service is running
- How
Check logs via MCP- Verify
- Query logs via API or MCP
- Result
- ✓ logs from 12 services visible within seconds
staging-k8s (Kubernetes) complete
Staging deployment on Kubernetes cluster
1 Determine deployment method ✓
- Why
- Publog can run in multiple environments
- When
- Before starting deployment
- How
Assess your environment- Verify
- Deployment method chosen
- Result
- ✓ chose Kubernetes for integration with existing K8s cluster
2 Ensure Redis with RediSearch is available ✓
- Why
- Publog requires Redis Stack for full-text log search
- When
- Before deploying publog service
- Skip If
- Redis with RediSearch already running
- How
Deploy Redis Stack via Helm- Verify
- redis-cli PING returns PONG
- Result
- ✓ deployed Bitnami Redis Stack helm chart to redis namespace
3 Download publog binary ✓
- Why
- Publog is distributed as a static Go binary
- When
- When deploying new or updating
- Skip If
- Current version matches target
- How
Build container image with binary- Verify
- Container image built successfully
- Result
- ✓ built publog:0.3.2 image with alpine base
4 Configure environment variables ✓
- Why
- Publog needs Redis connection
- When
- Before starting the service
- How
Create ConfigMap and Secret- Verify
- kubectl get configmap publog-config
- Result
- ✓ created ConfigMap with REDIS_HOST pointing to redis-stack.redis.svc
5 Deploy the service ✓
- Why
- Start publog using Kubernetes
- When
- After configuration is ready
- How
kubectl apply -f publog-deployment.yaml- Verify
- kubectl get pods -l app=publog shows Running
- Result
- ✓ 2 replicas running behind ClusterIP service
6 Verify log ingestion ✓
- Why
- Confirm services can send logs
- When
- After service is running
- How
Port-forward and check- Verify
- Logs visible via API
- Result
- ✓ ingress configured, logs flowing from staging apps