WSL2에서 Spotfire Server를 두 가지 방식으로 구성해 본 기록
작성 기준: 2026-09-23
환경: Windows + WSL2, Ubuntu 24.04/22.04, Spotfire Server 14.6.3
이번 실습의 목표는 이미 동작 중인 Spotfire Server를 건드리지 않으면서, Docker와 Kubernetes를 이용한 별도의 Spotfire 환경을 만들어 보는 것이었다.
결과부터 말하면 다음 두 환경을 분리해 구성했다.
- Ubuntu 24.04: 바이너리로 직접 설치한 기존 Spotfire Server
- Ubuntu 22.04: Docker, k3d, Helm으로 구성한 Kubernetes 실습 환경
전자는 지금도 WSL을 시작하면 정상 동작한다. 후자는 배포와 접속까지 성공했지만, 현재는 Docker Desktop이 종료되어 클러스터도 함께 멈춰 있다.
1. 최종 구성
네이티브 설치 환경
| 항목 | 구성 |
|---|---|
| WSL 배포판 | Ubuntu 24.04.5 LTS |
| Spotfire Server | 14.6.3 |
| 데이터베이스 | PostgreSQL 16 |
| Spotfire 포트 | 8081 |
| PostgreSQL 포트 | 127.0.0.1:5432 |
| 서비스 관리 | systemd |
Spotfire Server는 다음 서비스로 등록했다.
systemctl status spotfireserver-14.6.3
systemctl status postgresql
2026-09-23 현재 두 서비스 모두 정상적으로 시작되었다.
spotfireserver-14.6.3.service: active (running)
postgresql.service: active
PostgreSQL 16 main cluster: online
Spotfire는 8081, PostgreSQL은 로컬 인터페이스의 5432 포트에서 대기하고 있다.
컨테이너·Kubernetes 실습 환경
| 항목 | 구성 |
|---|---|
| WSL 배포판 | Ubuntu 22.04.5 LTS |
| Docker Engine | 29.8.1 |
| Docker Compose | v5.5.1 |
| Kubernetes | k3d 기반 k3s |
| k3d | v5.9.0 |
| k3s | v1.35.5-k3s1 |
| Helm | v3.22.0 |
| Deployment Kit | Spotfire Cloud Deployment Kit 14.6-v4.3.3 |
| 외부 접속 주소 | http://localhost:18081/spotfire/ |
Docker 이미지와 Kubernetes 리소스의 관계는 다음과 같다.
Windows / WSL2
└─ Ubuntu 22.04
└─ Docker
└─ k3d (k3s cluster: spotfire-lab)
├─ HAProxy
├─ Spotfire Server
├─ Spotfire Config CLI
├─ PostgreSQL
└─ Fluent Bit log forwarder
Docker Desktop에 Spotfire Server 컨테이너 하나만 보이는 형태가 아니라, k3d 노드 컨테이너 안에서 Kubernetes Pod들이 실행되는 구조다. 따라서 실제 애플리케이션 상태는 Docker Desktop 화면보다 kubectl로 확인하는 것이 정확하다.
2. 기존 Spotfire Server 직접 설치
먼저 Ubuntu 24.04에 PostgreSQL을 설치하고 서비스로 활성화했다.
sudo apt install -y postgresql postgresql-client
sudo systemctl enable --now postgresql
psql --version
Spotfire Server 압축 파일은 다음 경로에 풀었다.
/opt/spotfire/spotfireserver/14.6.3
서버 포트는 다음과 같이 구성했다.
cd /opt/spotfire/spotfireserver/14.6.3
sudo ./configure -s 8081 -r 9080 -b 9443
이후 PostgreSQL에 Spotfire용 사용자와 데이터베이스를 만들고 Configuration Tool CLI로 부트스트랩을 진행했다.
cd /opt/spotfire/spotfireserver/14.6.3/tomcat/spotfire-bin
sudo -u spotfire ./config.sh bootstrap \
--driver-class="org.postgresql.Driver" \
--database-url="jdbc:postgresql://127.0.0.1:5432/spotfire_server" \
--username="spotfire" \
--password="<DB_PASSWORD>" \
--tool-password="<CONFIG_TOOL_PASSWORD>"
sudo -u spotfire ./config.sh create-default-config
sudo -u spotfire ./config.sh create-user --username="<ADMIN_USERNAME>"
중간에 PostgreSQL의 비밀번호 인증 오류가 발생했다.
FATAL: password authentication failed for user "spotfire"
이때 Spotfire 설정부터 반복하기보다 먼저 psql로 DB 접속 자체를 검증했다.
psql -h 127.0.0.1 -p 5432 \
-U spotfire \
-d spotfire_server \
-c "select current_user, current_database();"
DB 접속 성공을 확인한 다음 동일한 정보로 부트스트랩하니 정상 진행됐다. 애플리케이션 문제처럼 보여도 먼저 하위 계층인 데이터베이스 연결부터 분리해 확인하는 편이 빠르다는 것을 다시 확인한 부분이다.
마지막으로 systemd 서비스를 활성화했다.
sudo systemctl enable --now spotfireserver-14.6.3
sudo systemctl status spotfireserver-14.6.3 --no-pager
3. Docker와 Kubernetes 실습 환경 준비
기존 네이티브 서버는 그대로 두고 Ubuntu 22.04에서 별도 실습을 진행했다.
Docker 설치 후 기본 동작을 먼저 확인했다.
sudo apt install -y \
docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
docker version
docker compose version
docker run --rm hello-world
이어서 kubectl, Helm, k3d를 설치했다. k3d는 Docker 컨테이너 위에서 경량 k3s 클러스터를 실행하므로 로컬 Kubernetes 학습 환경을 빠르게 만들기에 편했다.
kubectl version --client
helm version --short
k3d version
4. Spotfire 컨테이너 이미지 빌드
Spotfire의 공식 Cloud Deployment Kit를 사용했다.
mkdir -p ~/spotfire-lab
cd ~/spotfire-lab
git clone \
--branch 14.6-v4.3.3 \
--depth 1 \
https://github.com/spotfiresoftware/spotfire-cloud-deployment-kit.git
별도로 받은 Spotfire Server 14.6.3 설치 파일에서 실제 서버 압축 파일을 꺼내 Deployment Kit의 다운로드 디렉터리로 복사했다.
mkdir -p ~/spotfire-lab/source
tar -xf "/mnt/c/<SPOTFIRE_PATH>/SPOT_sfire_server_14.6.3_linux.tar" \
-C ~/spotfire-lab/source \
spotfireserver-14.6.3.x86_64.tar.gz
cp ~/spotfire-lab/source/spotfireserver-14.6.3.x86_64.tar.gz \
~/spotfire-lab/spotfire-cloud-deployment-kit/containers/downloads/
필요한 두 이미지를 빌드했다.
cd ~/spotfire-lab/spotfire-cloud-deployment-kit/containers
make spotfire-server spotfire-config
빌드 결과는 다음과 같았다.
spotfire/spotfire-server:14.6.3-v4.3.3
spotfire/spotfire-config:14.6.3-v4.3.3
이미지의 실제 레이어 크기는 각각 약 490MB, 355MB였으며 Docker 표시상 전체 크기는 더 크게 보였다.
5. k3d 클러스터와 로컬 레지스트리 구성
로컬 이미지 레지스트리를 만들고 외부 접속 포트를 명시해 클러스터를 생성했다.
k3d registry create spotfire-registry --port 5001
k3d cluster create spotfire-lab \
--servers 1 \
--agents 1 \
--api-port 6550 \
--registry-use k3d-spotfire-registry:5000 \
-p "18081:80@loadbalancer" \
-p "18443:443@loadbalancer" \
--k3s-arg "--disable=traefik@server:0"
이미지를 로컬 레지스트리에 올리기 위해 태그를 붙이고 push했다.
docker tag \
spotfire/spotfire-server:14.6.3-v4.3.3 \
localhost:5001/spotfire/spotfire-server:14.6.3-v4.3.3
docker push localhost:5001/spotfire/spotfire-server:14.6.3-v4.3.3
spotfire-config 이미지도 같은 방식으로 태그를 지정하고 레지스트리에 올렸다.
curl http://localhost:5001/v2/_catalog
6. Helm 설정
실습에서는 서버 한 대와 내장 PostgreSQL만 사용하고, Web Player와 각종 분석 서비스는 비활성화했다.
global:
spotfire:
acceptEUA: true
image:
registry: k3d-spotfire-registry:5000
postgresql:
auth:
postgresPassword: "<STRONG_PASSWORD>"
postgresql:
enabled: true
image:
repository: bitnamilegacy/postgresql
primary:
resourcesPreset: small
persistence:
enabled: true
size: 10Gi
spotfire-server:
replicaCount: 1
configuration:
site:
publicAddress: "http://localhost:18081/"
deployment:
enabled: true
defaultDeployment:
enabled: false
ingress:
enabled: false
haproxy:
enabled: true
spotfire-webplayer:
enabled: false
spotfire-automationservices:
enabled: false
spotfire-pythonservice:
enabled: false
spotfire-rservice:
enabled: false
spotfire-terrservice:
enabled: false
처음에는 YAML 들여쓰기가 어긋나 다음 오류가 발생했다.
yaml: line 10: did not find expected key
YAML은 탭이 아닌 공백을 사용하고, 같은 레벨의 키가 정확히 같은 깊이에 있어야 한다. 들여쓰기를 고친 뒤에는 Chart 의존성이 준비되지 않아 템플릿 오류가 발생했다.
no template "spotfire-common.images.image" associated with template "gotpl"
이 문제는 배포 전에 의존성을 갱신해 해결했다.
cd ~/spotfire-lab/spotfire-cloud-deployment-kit/helm/charts/spotfire-platform
helm dependency update .
helm lint . --values lab-values.yaml
즉, helm lint의 템플릿 누락 오류가 반드시 YAML 오류를 의미하는 것은 아니다. 서브 차트 의존성이 내려받아졌는지도 확인해야 한다.
7. Spotfire 배포
차트 패키지를 사용해 spotfire-lab 네임스페이스에 배포했다.
cd ~/spotfire-lab/spotfire-cloud-deployment-kit/helm
helm upgrade --install spotfire-lab \
packages/spotfire-platform-2.3.3.tgz \
--namespace spotfire-lab \
--create-namespace \
--values charts/spotfire-platform/lab-values.yaml \
--wait \
--timeout 20m
배포 결과 다음 워크로드가 정상 동작했다.
spotfire-lab-cli Running
spotfire-lab-config-job-1 Completed
spotfire-lab-haproxy Running
spotfire-lab-log-forwarder Running
spotfire-lab-postgresql-0 Running
spotfire-lab-spotfire-server 2/2 Running
PostgreSQL 데이터용 10Gi PVC도 Bound 상태가 됐다.
kubectl get pods,jobs,svc,pvc -n spotfire-lab
접속 확인 결과 /spotfire/에서 /spotfire/ui/로 이동시키는 정상 응답을 받았다.
curl -v http://localhost:18081/spotfire/
HTTP/1.1 302 Found
location: /spotfire/ui/
브라우저에서는 다음 주소로 접근할 수 있었다.
http://localhost:18081/spotfire/
8. 진행 중 만난 문제와 해결
문제 1: WSL에서 docker 명령을 찾지 못함
Docker Desktop을 설치했더라도 해당 WSL 배포판에 대한 Integration이 꺼져 있으면 다음 메시지가 나온다.
The command 'docker' could not be found in this WSL 2 distro.
Docker Desktop 설정에서 사용할 WSL 배포판의 연동을 활성화해야 한다.
문제 2: Docker 소켓 권한 오류
일반 사용자로 실행했을 때 다음 오류가 발생했다.
permission denied while trying to connect to the docker API
사용자를 docker 그룹에 추가한 뒤 셸을 다시 시작하면 된다.
sudo usermod -aG docker "$USER"
문제 3: Docker 엔진을 두 개 사용함
WSL 내부 Docker Engine과 Docker Desktop Engine을 번갈아 사용하면서 이미지와 k3d 클러스터가 서로 다른 엔진에 생겼다. 이 때문에 WSL에서는 보이지만 Docker Desktop에서는 보이지 않는 현상이 발생했다.
docker info --format 'Name={{.Name}} / OS={{.OperatingSystem}} / Root={{.DockerRootDir}}'
출력이 docker-desktop인지 WSL 배포판 이름인지 확인하면 현재 어느 엔진을 보는지 알 수 있다. 실습 후에는 충돌을 피하려고 WSL 네이티브 Docker 서비스를 껐다.
sudo systemctl disable --now docker.service docker.socket containerd.service
핵심은 한 프로젝트에서는 Docker 엔진을 하나로 통일하는 것이다.
문제 4: Kubernetes API 연결 거부
클러스터를 다시 만든 뒤 이전 kubeconfig의 임시 API 포트를 가리켜 다음 오류가 발생했다.
The connection to the server 0.0.0.0:33783 was refused
처음에는 임의 포트로 생성해 포트가 달라졌고, 서버 로드밸런서 컨테이너에 6443/tcp가 직접 공개되지 않아 확인도 어려웠다.
재생성할 때 API 포트를 6550으로 고정해 해결했다.
k3d cluster create spotfire-lab --api-port 6550 ...
kubectl config set-cluster k3d-spotfire-lab \
--server=https://127.0.0.1:6550
문제 5: Pod는 정상인데 페이지에 접속되지 않음
Pod 상태만 보는 것으로는 부족했다. 서비스와 k3s의 ServiceLB Pod, 호스트 포트 매핑을 함께 확인했다.
kubectl get svc -n spotfire-lab
kubectl get pods -n kube-system | grep svclb
docker ps
curl -v http://localhost:18081/spotfire/
HAProxy 서비스와 svclb Pod가 정상화된 뒤 18081 포트에서 접속할 수 있었다.
9. 현재 상태
2026-09-23 점검 결과는 다음과 같다.
Ubuntu 24.04 네이티브 환경
- Spotfire Server 14.6.3: 정상 실행 중
- PostgreSQL 16: 정상 실행 중
- Spotfire 수신 포트: 8081
- PostgreSQL 수신 포트: 127.0.0.1:5432
Ubuntu 22.04 컨테이너 환경
- 프로젝트와 Helm 설정 파일: 보존됨
- Spotfire 이미지 백업 파일: 보존됨
- WSL 네이티브 Docker 서비스: disabled / inactive
- Docker Desktop: 현재 종료 상태
- k3d Spotfire 클러스터: 현재 실행되지 않음
현재 컨테이너 환경이 멈춰 있는 것은 배포 실패가 아니라 Docker 엔진이 꺼져 있기 때문이다. Docker Desktop과 해당 WSL Integration을 시작한 다음 클러스터를 시작하면 된다.
k3d cluster start spotfire-lab
kubectl get nodes
kubectl get pods -n spotfire-lab
curl -I http://localhost:18081/spotfire/
만약 Docker Desktop 엔진으로 전환하면서 기존 k3d 클러스터가 보이지 않는다면, 이미지 백업을 불러오고 클러스터를 다시 생성한 후 Helm 배포를 반복한다.
docker load -i "/mnt/c/<SPOTFIRE_PATH>/spotfire-docker-images-14.6.3.tar"
10. 정리
이번 실습에서 가장 크게 배운 점은 Spotfire 설치 자체보다 실행 계층을 명확히 구분하는 일이 중요하다는 것이었다.
- 네이티브 Spotfire는 systemd가 관리한다.
- 컨테이너 Spotfire는 Kubernetes가 관리한다.
- k3d의 Kubernetes 노드는 Docker 컨테이너로 실행된다.
- Docker Desktop과 WSL 네이티브 Docker는 서로 다른 이미지·컨테이너 저장소를 가진다.
- Pod가
Running이어도 서비스, 로드밸런서, 포트 매핑까지 정상이어야 실제 접속이 된다. - Helm 오류는 YAML, 차트 의존성, 이미지 레지스트리 문제를 분리해서 확인해야 한다.
처음에는 구성 요소가 많아 복잡해 보였지만, Docker → k3d → Kubernetes → Helm → Spotfire 순서로 계층을 나눠 확인하니 문제 지점이 훨씬 선명해졌다. 네이티브 설치본을 안전망으로 남겨 둔 채 별도의 컨테이너 환경을 구성한 것도 실습 안정성 측면에서 좋은 선택이었다.