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

Prerequisites

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