2026-05-09 16:26:06 +03:00

2.1 KiB
Raw Blame History

01 — Docker Swarm Init (Test)

Context

  • Repo: iklim.co root
  • Environment: test
  • Server: single node — same machine is both Swarm manager and worker
  • Pipeline trigger: push to test-env branch → Gitea runner executes directly on the test server
  • init/swarm-init.sh already exists in the repo and is called by the pipeline

Prerequisites

  • Docker Engine installed on test server
  • User running the pipeline has Docker access (group docker or root)

Step 1 — Verify / update init/swarm-init.sh

Check that the script handles idempotent init:

grep -n "swarm init" init/swarm-init.sh

The script must contain logic similar to:

if ! docker info --format '{{.Swarm.LocalNodeState}}' | grep -q "active"; then
  docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')
  echo "✅ Swarm initialized"
else
  echo "  Swarm already active, skipping init"
fi

If this guard is missing, add it. Without it, the step fails on second deploy.

Step 2 — Run via pipeline

The pipeline step Initialize Docker Swarm in .gitea/workflows/deploy-test.yml already calls:

/bin/bash init/swarm-init.sh

No manual action needed after the script is correct.

Step 3 — Apply node label

The type=service label is required for placement constraints in docker-stack-infra.yml. Run once after Swarm init (Ansible handles this in automated setup):

docker node update --label-add type=service $(docker node ls -q)

Step 4 — Verify

SSH into the test server and run:

docker node ls

Expected: one node, STATUS=Ready, AVAILABILITY=Active, MANAGER STATUS=Leader.

docker node inspect self --format '{{.Spec.Labels}}'

Expected: map[type:service].

Notes

  • Single-node Swarm: node is simultaneously manager and worker (AVAILABILITY=Active, not drained).
  • Placement constraints node.role == manager and node.labels.type == service both resolve to this machine.
  • No worker-join or manager-join steps needed for test.
  • Docker Swarm overlay network iklimco-net is created automatically on first docker stack deploy.