AnyLog enables real-time visibility and management of distributed edge data, applications, and infrastructure. It transforms edge environments into scalable data tiers optimized for IoT, allowing organizations to extract insights across industries like manufacturing, utilities, oil & gas, smart cities, retail, robotics, and more.
- Documentation
- Support services — Grafana, PostgreSQL, MongoDB, Remote-GUI
docker-compose/
├── Makefile # Thin wrapper around deploy.sh
├── deploy.sh # Node lifecycle manager — works without make
├── README.md # This file
├── Deploy_PLC.md # PLC deployment guide
├── docker-makefiles/
│ ├── anylog-generic/
│ │ └── node_configs.env # Config template — copy and customise per node
│ ├── anylog-master/
│ ├── anylog-operator/
│ ├── anylog-publisher/
│ ├── anylog-query/
│ ├── anylog-standalone-operator/
│ ├── anylog-standalone-publisher/
│ ├── build_docker_compose.sh # Generates docker-compose.yaml from configs
│ ├── prep_configs.sh # Pre-flight config validation
│ ├── docker-compose-template-base.yaml # Linux template (host networking)
│ └── docker-compose-template-ports-base.yaml # Mac/Windows template (port mapping)
├── license-generator # code base for licnese verification + storage (Docker)
│ ├── Dockerfile
│ ├── README.md
│ ├── deploy.sh
│ ├── docker-compose.yml
│ ├── license_key.sh
│ ├── requirements.txt
│ └── src
│ ├── __init__.py
│ └── license-server.py
└── support/ # External services (Grafana, Postgres, MongoDB, etc.)
└── README.md
Generated compose files land in docker-makefiles/docker-compose-files/ and are not committed to the repo.
Note: The
Makefileis a thin wrapper — every target delegates todeploy.sh. Ifmakeis not available on your system (e.g. certain ARM/Qualcomm hardware), usebash deploy.shdirectly with identical behaviour.
# Install Docker on Ubuntu
sudo apt-get -y update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get -y update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin make git
# Grant non-root user permissions to use Docker
USER=`whoami`
sudo groupadd docker
sudo usermod -aG docker ${USER}
newgrp docker- Clone the deployment repository
git clone https://github.com/AnyLog-co/docker-compose
cd docker-compose- AnyLog is a private repository — request credentials for Docker login and your license key.
docker login -u anyloguser -p [Docker Login Passkey]All AnyLog containers run the same image — configurations determine which services are enabled.
| Node Type | Description | Server Port | REST Port |
|---|---|---|---|
generic |
Sandbox with only network configured | 32548 | 32549 |
master |
Blockchain emulator ("Oracle" alternative) | 32048 | 32049 |
operator |
Stores data from edge devices | 32148 | 32149 |
query |
Dedicated query node (enables system_query database) |
32348 | 32349 |
publisher |
Distributes data among operator nodes | 32248 | 32249 |
standalone-operator |
Combined master and operator on a single agent | 32148 | 32149 |
standalone-publisher |
Combined master and publisher on a single agent | 32248 | 32249 |
Both the short form (operator) and the full directory name (anylog-operator) are accepted — both tools resolve
the alias automatically.
All commands are available via make or bash deploy.sh — choose whichever is available on your system.
Commands:
login Log into Docker Hub
pull Pull image from Docker Hub
dry-run Generate docker-compose.yaml (prints docker run command in manual mode)
up Start AnyLog instance
down Stop AnyLog instance
clean Stop and remove volumes
clean-all Stop, remove volumes and image
logs View container logs
logs-f Follow container logs
attach Attach to container (ctrl-d to detach)
exec Shell into container (anylog user)
exec-root Shell into container (root)
full-test Run test-status + test-node + test-network
test-status GET status from node
test-node Test node configuration
test-network Test network connectivity
check-processes List active/inactive services
check-vars Show resolved variable values
Variables (make) / Options (deploy.sh):
IS_MANUAL / --manual Use docker run instead of docker compose (default: false)
ANYLOG_TYPE / --type Node type to deploy
TAG / --tag Image tag (default: pre-develop)
IMAGE / --image Image repository
NODE_NAME / --node-name Override container name
TEST_CONN / --test-conn ip:port for test commands (default: auto-resolved)
LICENSE_KEY / --license-key License key (skips acceptance form if set in config file; runs form if passed manually)
PROMPT_LICENSE / --prompt-license Force the acceptance form even when a key is already saved (default: true)
- Unique ports: No two containers on the same machine can share ports. Set unique
ANYLOG_SERVER_PORTandANYLOG_REST_PORTper container. - Unique node names: Each node must have a distinct
NODE_NAME. - Clusters:
CLUSTER_NAMEshould be unique per operator unless HA is configured. - License key: A valid
LICENSE_KEYis required. Request one here.
Every up command validates a license before starting the node. The behavior depends on where the key comes from.
Resolution order
--license-key <key>flag (orLICENSE_KEY=<key>env var / make variable)LICENSE_KEY=line indocker-makefiles/<type>/.envornode_configs.env- Interactive prompt (if a TTY is available)
If the key is found in the config file — deployment proceeds immediately. No prompts, no registration form, no network call to the license server.
If the key comes from manual input (flag or interactive prompt) — the full acceptance flow runs:
- Displays
LICENSE.txtfor review - Prompts for name, email, and project
- Asks for explicit
yes/noacceptance of the license agreement - POSTs the registration to the AnyLog license server
- Writes the accepted key back into the config file (
LICENSE_KEY="<key>") so future deployments skip the form
Passing the key explicitly
# deploy.sh
bash deploy.sh up --type operator --license-key "<key>"
# make
make up ANYLOG_TYPE=operator LICENSE_KEY="<key>"Setting the key in the config file (skips the form on all future runs)
# docker-makefiles/my-operator/node_configs.env
LICENSE_KEY="<key>"--prompt-license / PROMPT_LICENSE
Forces the acceptance form even when a key is already saved, useful for re-registering under a new name or project:
bash deploy.sh up --type operator --prompt-license
make up ANYLOG_TYPE=operator PROMPT_LICENSE=trueFor full control over node behavior, use a node_configs.env file.
- Copy the config template
cp -r docker-makefiles/anylog-generic docker-makefiles/my-operator-
Edit
docker-makefiles/my-operator/node_configs.env— at minimum, update these:NODE_TYPE— set to your desired node typeNODE_NAME— must be unique per nodeCOMPANY_NAMEANYLOG_SERVER_PORT,ANYLOG_REST_PORT— must be unique per machineLEDGER_CONN— IP:port of the master nodeCLUSTER_NAME— unique per operator unless HA is enabledLICENSE_KEYDB_USER/DB_PASSWD(if using PostgreSQL)
-
Deploy
# via make
make up ANYLOG_TYPE=my-operator
# via deploy.sh (no make required)
bash deploy.sh up --type my-operator- Check status
make logs ANYLOG_TYPE=my-operator
bash deploy.sh logs --type my-operator- Attach to the node — press Enter twice once attached,
ctrl-dto detach
make attach ANYLOG_TYPE=my-operator
bash deploy.sh attach --type my-operatorcp -r docker-makefiles/my-operator docker-makefiles/my-operator2
# Edit node_configs.env — update NODE_NAME, ports, CLUSTER_NAME
make up ANYLOG_TYPE=my-operator2
bash deploy.sh up --type my-operator2When IS_MANUAL=true / --manual, the node is started with docker run --env-file rather than docker compose.
This is useful on systems where docker compose is unavailable. The same node_configs.env file is used.
Running dry-run in manual mode prints the exact docker run command that will be executed — useful for
inspection before committing:
make dry-run IS_MANUAL=true ANYLOG_TYPE=operator
bash deploy.sh dry-run --type operator --manualTo start:
# Generic
make up IS_MANUAL=true ANYLOG_TYPE=generic
bash deploy.sh up --type generic --manual
# Operator
make up IS_MANUAL=true ANYLOG_TYPE=operator
bash deploy.sh up --type operator --manual
# Master
make up IS_MANUAL=true ANYLOG_TYPE=master
bash deploy.sh up --type master --manualNote: In manual mode the init container that pre-sets volume ownership does not run. Volume directories will be owned by root until AnyLog corrects permissions internally.
Debug mode starts a lightweight sidecar container alongside the AnyLog node. It shares the node's network stack,
PID namespace, and data volumes, making it useful for diagnosing connectivity or inspecting files without touching
the running node. Common network tools (ping, nc, curl, net-tools) are pre-installed.
make up-debug ANYLOG_TYPE=my-operator
bash deploy.sh up --type my-operator # sidecar activated via --profile debug
# Shell into the sidecar
docker exec -it my-operator-debugger /bin/bash
make down-debug ANYLOG_TYPE=my-operatorThe AnyLog container runs as the anylog user. To install tools or inspect system state without restarting:
make exec-root ANYLOG_TYPE=my-operator
bash deploy.sh exec-root --type my-operator
# node process keeps running — changes do not persist across restarts
apt-get update && apt-get install -y net-tools iputils-ping netcat-traditionalTest targets work independently of ANYLOG_TYPE — point them at any reachable node via TEST_CONN.
# Default (127.0.0.1 + REST port from config)
make test-status ANYLOG_TYPE=my-operator
bash deploy.sh test-status --type my-operator
# Target any node explicitly
make full-test TEST_CONN=192.168.1.10:32149
bash deploy.sh full-test --test-conn 192.168.1.10:32149| Target / Command | AnyLog command sent | Description |
|---|---|---|
full-test |
— | Runs test-status, test-node, test-network in sequence |
test-status |
get status |
Confirms the node process is running |
test-node |
test node |
Validates node configuration and connectivity |
test-network |
test network |
Checks communication with other network members |
check-processes |
get processes |
Lists all active and inactive services on the node |
Port reference:
| Node type | REST port |
|---|---|
| generic | 32549 |
| master | 32049 |
| operator | 32149 |
| query | 32349 |
| publisher | 32249 |
Docker Desktop uses port-based networking instead of network_mode: host, which may cause containers to advertise
the Docker internal IP rather than the machine IP.
-
Enable host networking in Docker Desktop preferences.
-
Find your machine's local IP:
# Mac
ifconfig en0 | grep "inet "
# Windows
ipconfig- In
node_configs.env, setOVERLAY_IPunder the advanced section:
OVERLAY_IP=192.168.86.28-
Optionally set
TCP_BIND=trueunder advanced networking for stricter port binding. -
Deploy:
make up ANYLOG_TYPE=my-operator
bash deploy.sh up --type my-operatorDocker restarts containers using in-memory state, not updated env files. To apply config changes on reboot:
Option 1 — Rebuild the container after updating configs:
make up ANYLOG_TYPE=my-operator
bash deploy.sh up --type my-operatorOption 2 — Use systemd to rebuild on boot:
# /etc/systemd/system/anylog-operator-redeploy.service
[Unit]
Description=Redeploy AnyLog Node After Reboot
After=network.target docker.service
Requires=docker.service
[Service]
WorkingDirectory=%h/docker-compose
ExecStart=/usr/bin/bash deploy.sh up --type my-operator
Restart=on-failure
User=%u
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable anylog-operator-redeploy.serviceNote: Each node requires its own systemd service.
External services that work alongside AnyLog nodes are managed separately under support/.
| Service | Default Port | Notes |
|---|---|---|
| Grafana | 3000 | Dashboards and visualization |
| PostgreSQL | 5432 | Persistent storage backend |
| MongoDB | 27017 | Document store backend |
| Remote-GUI | 8080, 31800 | AnyLog web interface |
cd support/
make up SERVICE=grafana
make list # show all discovered servicesSee support/README.md for full documentation.