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
}
Version: 1.0.0
Steps: 6

Prerequisite

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.

Key difference: Each step adds

success

(bool) and

details

(string) fields to record what actually happened.

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: 2

Locations

prod-server-01 (Docker Swarm) complete

Production deployment on Docker Swarm cluster

Steps: 6
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

Steps: 6
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