Haru Utils

LOG OBSERVABILITY

Loki·Grafana Alloy 로그 수집 구성

소규모 내부·PoC 단일 노드 Loki에 TSDB·filesystem 보존을 구성하고 Grafana Alloy로 journal·파일 로그를 최소 권한 수집해 Grafana Explore까지 검증합니다.
Loki 설치Grafana Alloy 로그Promtail 대체로그 수집Loki retentionGrafana Loki datasource
지원 환경Ubuntu Server 24.04 LTS · systemd
예상 시간70
난이도고급
검토일2026-09-04

BEFORE YOU START

시작 전에 준비하세요

01

Grafana 공식 stable APT repository와 signed-by keyring을 사전 구성하고 공식 fingerprint를 사람이 검증한 기록

02

승인된 Loki·Alloy·Grafana 정확한 버전과 별도 로그 disk의 용량·IOPS·backup·복구 기준

03

filesystem은 소규모 내부·PoC 단일 노드에만 사용하며 HA·지원 운영은 object storage와 공식 deployment로 전환하는 승인

04

수집 허용 로그 경로와 개인정보·secret redaction 정책

05

Loki 3100을 외부 공개하지 않는 사설망 또는 인증 TLS reverse proxy 설계

권장 대상 서버 로그를 사설 Loki에 수집하며 민감정보·보존·디스크·접근 통제를 책임지는 운영자

FOLLOW THE RECIPE

8단계 구성·점검 레시피

1
확인시스템을 변경하지 않는 점검 단계

로그량·disk·기존 agent 확인

일일 ingest·보존 기간·label cardinality와 기존 Promtail/agent 충돌을 확인합니다.

OS·자원
cat /etc/os-release
uname -m
free -h
df -hT / /var/lib/loki /var/lib/alloy 2>/dev/null
기존 service
systemctl status loki.service alloy.service grafana-server.service --no-pager -l || true
port
sudo ss -lntp | grep -E ':(3100|12345|3000)\b' || true
로그 경로
sudo find <APPROVED_LOG_ROOT> -maxdepth 2 -type f -printf '%m %u:%g %s %p
' | head -100
  • 일일 ingest×보존과 compaction 여유 disk를 산정했습니다.
  • 수집 대상과 제외할 secret·개인정보를 승인했습니다.
  • 기존 agent의 positions 소유권을 확인했습니다.
결과 읽기

filesystem backend는 disk-full에 따라 자동 삭제하지 않으므로 용량 계획이 없으면 중단합니다.

다음 판단

공급망·backup·노출을 사전 점검합니다.

2
확인시스템을 변경하지 않는 점검 단계

공급망·backup·노출·이전 service 상태 점검

설치·설정·시작 전에 Grafana 공식 repository, Loki checksum, 기존 rollback 대상과 세 service의 이전 상태를 0600 증거로 보존합니다.

기존 rollback 대상
sudo stat -Lc '%a %U:%G %n' /etc/loki/config.yaml /etc/systemd/system/loki.service /etc/alloy/config.alloy /etc/default/alloy /etc/grafana/grafana.ini /etc/grafana/provisioning/datasources/loki.yaml 2>/dev/null || true
변경 전 service 상태 0600 snapshot
sudo install -d -o root -g root -m 0700 <APPROVED_BACKUP_DIR>
{ printf 'loki.enabled='; systemctl is-enabled loki.service || true; printf 'loki.active='; systemctl is-active loki.service || true; printf 'alloy.enabled='; systemctl is-enabled alloy.service || true; printf 'alloy.active='; systemctl is-active alloy.service || true; printf 'grafana.enabled='; systemctl is-enabled grafana-server.service || true; printf 'grafana.active='; systemctl is-active grafana-server.service || true; } | sudo tee <APPROVED_BACKUP_DIR>/service-state.before >/dev/null
sudo chmod 0600 <APPROVED_BACKUP_DIR>/service-state.before
sudo cat <APPROVED_BACKUP_DIR>/service-state.before
이 명령은 변경 전 한 번만 실행합니다. rollback에서는 파일을 읽기만 하며 덮어쓰지 않습니다.
기존 data
sudo du -sh /var/lib/loki /var/lib/alloy /var/lib/grafana 2>/dev/null || true
방화벽
sudo ufw status verbose
  • service-state.before가 config·package 변경 전에 생성됐고 0600입니다.
  • 공식 checksum·repository key를 변경 기록에 남겼습니다.
  • 기존 Loki data·Grafana DB의 일관된 backup 소유자를 확인했습니다.
  • 3100·12345·3000은 인터넷에 직접 공개하지 않습니다.
결과 읽기

backup이나 disk 여유가 없거나 로그 민감도 분류가 끝나지 않았으면 설치하지 않습니다.

다음 판단

0700 작업공간에서 package를 검증합니다.

3
변경패키지·설정·서비스 상태가 달라지는 단계

고정 Loki·Alloy package 설치

공식 자산과 서명 repository만 사용하고 버전을 정확히 고정합니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
0700 작업공간
umask 077
mktemp -d -p /var/tmp haru-loki.XXXXXXXX
출력 경로를 <LOKI_WORK_DIR>에 그대로 대입합니다.
Loki download·checksum
stat -Lc '%a %U:%G %n' <LOKI_WORK_DIR>
curl -fL -o <LOKI_WORK_DIR>/loki.zip https://github.com/grafana/loki/releases/download/v<APPROVED_LOKI_VERSION>/loki-linux-<LOKI_ARCH>.zip
printf '%s  %s
' '<APPROVED_LOKI_SHA256>' '<LOKI_WORK_DIR>/loki.zip' | sha256sum --check --strict
Loki binary
unzip -q <LOKI_WORK_DIR>/loki.zip -d <LOKI_WORK_DIR>/loki
sudo install -o root -g root -m 0755 <LOKI_WORK_DIR>/loki/loki-linux-<LOKI_ARCH> /usr/local/bin/loki
/usr/local/bin/loki --version
Alloy·Grafana package
sudo apt update
apt-cache policy alloy grafana
sudo apt install alloy=<APPROVED_ALLOY_PACKAGE_VERSION> grafana=<APPROVED_GRAFANA_PACKAGE_VERSION>
  • Loki SHA-256·version·architecture가 승인값입니다.
  • Alloy·Grafana는 공식 signed-by repository의 고정 package입니다.
  • Promtail 신규 설치 대신 Alloy를 사용합니다.
결과 읽기

Grafana 공식 stable APT repository와 signed-by key fingerprint를 사전 검증하지 않았거나 checksum·candidate가 승인값과 다르면 설치를 중단합니다.

다음 판단

기존 config를 조건부 백업하고 최소 권한으로 편집합니다.

4
변경패키지·설정·서비스 상태가 달라지는 단계

Loki·Alloy·Grafana 설정 백업·편집

기존 파일만 no-clobber 백업하고 신규 파일은 변경 기록에 남깁니다. data와 component state는 지속 경로를 사용합니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
계정·경로 hardening
getent passwd loki >/dev/null || sudo useradd --system --home /var/lib/loki --shell /usr/sbin/nologin loki
sudo install -d -o root -g loki -m 0750 /etc/loki
sudo install -d -o loki -g loki -m 0750 /var/lib/loki
sudo chown root:alloy /etc/alloy
sudo chmod 0750 /etc/alloy
sudo chown alloy:alloy /var/lib/alloy
sudo chmod 0750 /var/lib/alloy
id alloy
조건부 백업
if sudo test -f /etc/loki/config.yaml; then sudo cp --archive --no-clobber /etc/loki/config.yaml /etc/loki/config.yaml.<BACKUP_SUFFIX>; fi
if sudo test -f /etc/systemd/system/loki.service; then sudo cp --archive --no-clobber /etc/systemd/system/loki.service /etc/systemd/system/loki.service.<BACKUP_SUFFIX>; fi
if sudo test -f /etc/alloy/config.alloy; then sudo cp --archive --no-clobber /etc/alloy/config.alloy /etc/alloy/config.alloy.<BACKUP_SUFFIX>; fi
if sudo test -f /etc/default/alloy; then sudo cp --archive --no-clobber /etc/default/alloy /etc/default/alloy.<BACKUP_SUFFIX>; fi
if sudo test -f /etc/grafana/grafana.ini; then sudo cp --archive --no-clobber /etc/grafana/grafana.ini /etc/grafana/grafana.ini.<BACKUP_SUFFIX>; fi
if sudo test -f /etc/grafana/provisioning/datasources/loki.yaml; then sudo cp --archive --no-clobber /etc/grafana/provisioning/datasources/loki.yaml /etc/grafana/provisioning/datasources/loki.yaml.<BACKUP_SUFFIX>; fi
편집·권한
sudoedit /etc/loki/config.yaml
sudoedit /etc/systemd/system/loki.service
sudoedit /etc/alloy/config.alloy
sudoedit /etc/default/alloy
sudoedit /etc/grafana/grafana.ini
sudoedit /etc/grafana/provisioning/datasources/loki.yaml
sudo chown root:loki /etc/loki/config.yaml
sudo chmod 0640 /etc/loki/config.yaml
sudo chown root:alloy /etc/alloy/config.alloy
sudo chmod 0640 /etc/alloy/config.alloy
sudo chown root:root /etc/default/alloy
sudo chmod 0644 /etc/default/alloy
설정 예시 · /etc/loki/config.yaml
단일 노드 TSDB·filesystem·보존 예시
auth_enabled: false
server:
  http_listen_address: 127.0.0.1
  http_listen_port: 3100
common:
  path_prefix: /var/lib/loki
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory
  storage:
    filesystem:
      chunks_directory: /var/lib/loki/chunks
      rules_directory: /var/lib/loki/rules
schema_config:
  configs:
    - from: <SCHEMA_START_DATE>
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h
limits_config:
  retention_period: <APPROVED_RETENTION>
compactor:
  working_directory: /var/lib/loki/compactor
  retention_enabled: true
  delete_request_store: filesystem
단일 tenant·loopback 예시입니다. 다중 사용자 또는 네트워크 접근은 auth_enabled와 인증 reverse proxy를 별도로 설계합니다.
설정 예시 · /etc/systemd/system/loki.service
비 root·최소 권한 Loki unit
[Unit]
Description=Grafana Loki
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=loki
Group=loki
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yaml
Restart=on-failure
RestartSec=10s
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/loki
UMask=0027

[Install]
WantedBy=multi-user.target
Loki HTTP listen은 config.yaml에서 127.0.0.1:3100으로 고정합니다.
설정 예시 · /etc/alloy/config.alloy
journal·파일 → Loki Alloy 흐름
loki.source.journal "system" {
  max_age = "24h"
  forward_to = [loki.write.local.receiver]
}

local.file_match "approved" {
  path_targets = [{ __path__ = "<APPROVED_LOG_GLOB>", job = "<APP_LABEL>" }]
}

loki.source.file "approved" {
  targets = local.file_match.approved.targets
  forward_to = [loki.write.local.receiver]
}

loki.write "local" {
  endpoint { url = "http://127.0.0.1:3100/loki/api/v1/push" }
}
수집 전에 secret·개인정보를 application에서 redaction하며 파일 접근은 광범위한 group 대신 ACL로 제한합니다.
설정 예시 · /etc/default/alloy
Alloy package 환경 파일
CONFIG_FILE="/etc/alloy/config.alloy"
CUSTOM_ARGS="--server.http.listen-addr=127.0.0.1:12345"
RESTART_ON_UPGRADE=true
Debian·Ubuntu 공식 package는 /etc/default/alloy의 CUSTOM_ARGS를 service run 명령에 전달합니다.
설정 예시 · /etc/grafana/grafana.ini
loopback·anonymous 차단 Grafana 설정
[server]
protocol = http
http_addr = 127.0.0.1
http_port = 3000

[auth.anonymous]
enabled = false
외부 제공 시에는 인증된 HTTPS reverse proxy를 별도로 구성합니다. admin credential을 이 파일에 넣지 않습니다.
설정 예시 · /etc/grafana/provisioning/datasources/loki.yaml
Grafana 내장 Loki datasource
apiVersion: 1
datasources:
  - name: Loki
    type: loki
    access: proxy
    url: http://127.0.0.1:3100
    editable: false
Grafana와 Loki가 같은 host일 때의 loopback 예시이며 query API path를 URL 뒤에 붙이지 않습니다.
  • 기존 파일은 백업했고 원본이 없던 파일은 신규 생성으로 기록했습니다.
  • <SCHEMA_START_DATE>는 오늘 또는 이전 과거 날짜여서 active period가 됩니다.
  • Loki data·Compactor marker와 Alloy component state는 지속 disk입니다.
  • Alloy CUSTOM_ARGS는 127.0.0.1:12345를 명시합니다.
  • Alloy는 adm·systemd-journal membership 또는 정확한 파일 ACL만 사용합니다.
  • 로그 label에 사용자 ID·request ID 같은 무제한 값을 넣지 않습니다.
결과 읽기

비밀이 config literal에 있거나 world-readable이면 시작하지 않습니다.

다음 판단

config 예시를 검증하고 services를 순차 시작합니다.

5
변경패키지·설정·서비스 상태가 달라지는 단계

문법 검증 후 순차 시작

Loki config, Alloy component graph, Grafana provisioning을 검증한 뒤 backend부터 시작합니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
Loki unit
sudo systemd-analyze verify /etc/systemd/system/loki.service
Loki config
/usr/local/bin/loki -config.file=/etc/loki/config.yaml -verify-config
Alloy·Grafana loopback config
sudo -u alloy /usr/bin/alloy validate /etc/alloy/config.alloy
grep -Fx 'CUSTOM_ARGS="--server.http.listen-addr=127.0.0.1:12345"' /etc/default/alloy
grep -Eq '^http_addr[[:space:]]*=[[:space:]]*127\.0\.0\.1$' /etc/grafana/grafana.ini
grep -A2 '^\[auth.anonymous\]' /etc/grafana/grafana.ini | grep -Eq 'enabled[[:space:]]*=[[:space:]]*false'
systemctl cat alloy.service | grep -F 'EnvironmentFile'
서비스
sudo systemctl daemon-reload
sudo systemctl enable --now loki.service
curl -fsS http://127.0.0.1:3100/ready
sudo systemctl enable --now alloy.service grafana-server.service
Grafana 최초 로그인
ssh -N -L 33000:127.0.0.1:3000 <ADMIN_USER>@<SERVER_HOST>
관리자 workstation에서 실행해 https가 아닌 local tunnel http://127.0.0.1:33000으로 접속하고 UI에서 즉시 admin 암호를 변경합니다. 완료 전 외부 reverse proxy와 공개 ingress를 연결하지 않습니다.
상태·listener
systemctl status loki.service alloy.service grafana-server.service --no-pager -l
sudo ss -lntp | grep -E '127.0.0.1:(3100|12345|3000)\b'
  • Loki /ready가 성공한 뒤 Alloy를 시작했습니다.
  • 세 service가 비 root 계정으로 active입니다.
  • 3100·12345·3000은 명시적으로 loopback입니다.
  • Grafana anonymous access가 disabled이고 SSH local port-forward UI에서 초기 admin 암호를 변경했습니다.
결과 읽기

검증 실패나 permission denied면 권한을 넓히지 말고 정확한 파일 ACL과 service User를 확인합니다.

다음 판단

canary 로그·query·보존·disk를 검증합니다.

6
변경패키지·설정·서비스 상태가 달라지는 단계

수집·query·보존·disk 검증

민감하지 않은 고유 canary를 승인 로그에 남기고 Grafana Explore와 Loki query에서 한 번만 확인합니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
readiness
curl -fsS http://127.0.0.1:3100/ready
curl -fsS http://127.0.0.1:12345/-/ready
로그·오류
journalctl -u loki.service -u alloy.service --since '-15 min' --no-pager
disk·Alloy state
sudo du -sh /var/lib/loki /var/lib/alloy
sudo stat -Lc '%a %U:%G %n' /etc/alloy /etc/alloy/config.alloy /var/lib/alloy
id alloy
curl -fsS http://127.0.0.1:12345/metrics | grep -E 'loki_source|loki_write' | head -30
Alloy storage.path의 component state는 구현 세부 파일명을 가정하지 않고 UI·metrics·재시작 후 중복 여부로 검증합니다.
Grafana health
curl -fsS http://127.0.0.1:3000/api/health
  • canary가 한 번 수집되고 재시작 뒤 중복 폭증이 없습니다.
  • Compactor가 실행되고 retention·delete request store 오류가 없습니다.
  • Alloy 계정은 adm·systemd-journal membership 또는 승인 로그의 정확한 ACL을 가집니다.
  • disk 증가율과 20% 이상 여유 경보가 있습니다.
  • Grafana Explore query와 datasource health가 성공합니다.
결과 읽기

Alloy component state를 삭제하면 재수집될 수 있고 retention 변경은 기존 로그에 소급되지 않습니다.

다음 판단

인증·TLS·권한·민감 로그를 점검합니다.

7
확인시스템을 변경하지 않는 점검 단계

인증·TLS·권한·민감정보 점검

Loki에는 내장 인증 계층이 없으므로 loopback을 유지하거나 인증 TLS reverse proxy를 둡니다.

listener
sudo ss -lntp | grep -E ':(3100|12345|3000)\b'
sudo ufw status verbose
권한
sudo stat -Lc '%a %U:%G %n' /etc/loki/config.yaml /var/lib/loki /etc/alloy/config.alloy /var/lib/alloy
계정
id loki
id alloy
systemctl show loki.service alloy.service -p User -p Group
  • Loki·Alloy admin endpoint는 loopback 또는 인증 TLS proxy 뒤에 있습니다.
  • TLS 인증서 검증을 끄지 않고 multi-tenant이면 X-Scope-OrgID를 신뢰 proxy가 덮어씁니다.
  • Alloy는 root가 아니며 journal/파일에 최소 ACL만 가집니다.
  • token·cookie·Authorization·개인정보는 ingest 전에 제거합니다.
  • filesystem backend와 Compactor marker를 함께 backup·restore 시험합니다.
  • <...> 자리표시자는 승인된 리터럴 값으로 직접 치환하며 외부 입력으로 shell 명령을 조립하거나 eval하지 않습니다.
결과 읽기

public 3100, 무인증 proxy, world-readable config, 무제한 retention이면 운영 투입을 중단합니다.

다음 판단

config 복원과 신규 설치 격리를 분리합니다.

8
변경패키지·설정·서비스 상태가 달라지는 단계

A 기존 복원 또는 B 신규 격리 중 하나만 선택

precheck에서 저장한 0600 service-state.before를 읽어 A의 이전 상태를 복구합니다. A와 B는 상호배타이며 같은 변경 흐름에서 둘 다 실행하지 않습니다.

변경 단계입니다. 대상 서버, 백업 파일, 서비스 중단 영향과 바로 이전 상태로 돌아가는 방법을 다시 확인하세요.
변경 전 상태 증거 읽기
sudo test -r <APPROVED_BACKUP_DIR>/service-state.before
sudo stat -Lc '%a %U:%G %n' <APPROVED_BACKUP_DIR>/service-state.before
sudo cat <APPROVED_BACKUP_DIR>/service-state.before
sudo sha256sum /etc/loki/config.yaml /etc/systemd/system/loki.service /etc/alloy/config.alloy /etc/default/alloy /etc/grafana/grafana.ini /etc/grafana/provisioning/datasources/loki.yaml
rollback에서는 service-state.before를 덮어쓰거나 다시 생성하지 않습니다.
A. 기존 설치 backup·이전 service 상태 복원
sudo test -r <APPROVED_BACKUP_DIR>/service-state.before || exit 1
sudo systemctl stop alloy.service loki.service grafana-server.service
if sudo test -f /etc/loki/config.yaml.<BACKUP_SUFFIX>; then sudo cp --archive /etc/loki/config.yaml.<BACKUP_SUFFIX> /etc/loki/config.yaml; fi
if sudo test -f /etc/systemd/system/loki.service.<BACKUP_SUFFIX>; then sudo cp --archive /etc/systemd/system/loki.service.<BACKUP_SUFFIX> /etc/systemd/system/loki.service; fi
if sudo test -f /etc/alloy/config.alloy.<BACKUP_SUFFIX>; then sudo cp --archive /etc/alloy/config.alloy.<BACKUP_SUFFIX> /etc/alloy/config.alloy; fi
if sudo test -f /etc/default/alloy.<BACKUP_SUFFIX>; then sudo cp --archive /etc/default/alloy.<BACKUP_SUFFIX> /etc/default/alloy; fi
if sudo test -f /etc/grafana/grafana.ini.<BACKUP_SUFFIX>; then sudo cp --archive /etc/grafana/grafana.ini.<BACKUP_SUFFIX> /etc/grafana/grafana.ini; fi
if sudo test -f /etc/grafana/provisioning/datasources/loki.yaml.<BACKUP_SUFFIX>; then sudo cp --archive /etc/grafana/provisioning/datasources/loki.yaml.<BACKUP_SUFFIX> /etc/grafana/provisioning/datasources/loki.yaml; fi
sudo systemctl daemon-reload
if sudo grep -Fxq 'loki.enabled=enabled' <APPROVED_BACKUP_DIR>/service-state.before; then sudo systemctl enable loki.service; else sudo systemctl disable loki.service; fi
if sudo grep -Fxq 'alloy.enabled=enabled' <APPROVED_BACKUP_DIR>/service-state.before; then sudo systemctl enable alloy.service; else sudo systemctl disable alloy.service; fi
if sudo grep -Fxq 'grafana.enabled=enabled' <APPROVED_BACKUP_DIR>/service-state.before; then sudo systemctl enable grafana-server.service; else sudo systemctl disable grafana-server.service; fi
if sudo grep -Fxq 'loki.active=active' <APPROVED_BACKUP_DIR>/service-state.before; then sudo systemctl start loki.service; else sudo systemctl stop loki.service; fi
if sudo grep -Fxq 'alloy.active=active' <APPROVED_BACKUP_DIR>/service-state.before; then sudo systemctl start alloy.service; else sudo systemctl stop alloy.service; fi
if sudo grep -Fxq 'grafana.active=active' <APPROVED_BACKUP_DIR>/service-state.before; then sudo systemctl start grafana-server.service; else sudo systemctl stop grafana-server.service; fi
고정 문자열만 검사하며 파일 값을 명령으로 실행하거나 eval하지 않습니다. 기존 설치에서만 선택하고 B를 실행하지 않습니다.
B. backup 없는 신규 파일만 격리
sudo systemctl disable --now alloy.service loki.service grafana-server.service
sudo install -d -o root -g root -m 0700 <APPROVED_QUARANTINE_DIR>
if ! sudo test -f /etc/loki/config.yaml.<BACKUP_SUFFIX> && sudo test -f /etc/loki/config.yaml; then sudo mv --no-clobber /etc/loki/config.yaml <APPROVED_QUARANTINE_DIR>/loki-config.yaml.new; fi
if ! sudo test -f /etc/systemd/system/loki.service.<BACKUP_SUFFIX> && sudo test -f /etc/systemd/system/loki.service; then sudo mv --no-clobber /etc/systemd/system/loki.service <APPROVED_QUARANTINE_DIR>/loki.service.new; fi
if ! sudo test -f /etc/alloy/config.alloy.<BACKUP_SUFFIX> && sudo test -f /etc/alloy/config.alloy; then sudo mv --no-clobber /etc/alloy/config.alloy <APPROVED_QUARANTINE_DIR>/alloy-config.alloy.new; fi
if ! sudo test -f /etc/default/alloy.<BACKUP_SUFFIX> && sudo test -f /etc/default/alloy; then sudo mv --no-clobber /etc/default/alloy <APPROVED_QUARANTINE_DIR>/alloy.default.new; fi
if ! sudo test -f /etc/grafana/grafana.ini.<BACKUP_SUFFIX> && sudo test -f /etc/grafana/grafana.ini; then sudo mv --no-clobber /etc/grafana/grafana.ini <APPROVED_QUARANTINE_DIR>/grafana.ini.new; fi
if ! sudo test -f /etc/grafana/provisioning/datasources/loki.yaml.<BACKUP_SUFFIX> && sudo test -f /etc/grafana/provisioning/datasources/loki.yaml; then sudo mv --no-clobber /etc/grafana/provisioning/datasources/loki.yaml <APPROVED_QUARANTINE_DIR>/grafana-loki.yaml.new; fi
sudo systemctl daemon-reload
신규 설치 변경 기록과 대상별 backup 부재가 확인될 때만 선택합니다. A를 실행했다면 B를 실행하지 않으며 package·data를 purge하지 않습니다.
선택 branch 검증
systemctl is-enabled loki.service alloy.service grafana-server.service || true
systemctl is-active loki.service alloy.service grafana-server.service || true
  • A 또는 B 하나만 선택했다고 기록했습니다.
  • A는 precheck snapshot의 이전 enabled·active 상태를 실제 복원했습니다.
  • B는 각 backup 부재가 확인된 신규 파일만 격리했습니다.
  • rollback에서 service-state.before를 덮어쓰지 않았습니다.
결과 읽기

filesystem chunk를 직접 삭제하지 않습니다.

다음 판단

선택 branch·이전/최종 service 상태를 기록합니다.

SECURITY CHECK

운영 전 마지막 보안 점검

  • Loki 3100과 Alloy 12345는 loopback 또는 인증 TLS proxy 뒤에 둡니다.
  • Loki에는 내장 인증 계층이 없다는 전제로 접근을 통제합니다.
  • Alloy 전용 계정에 journal 또는 승인 로그 ACL만 부여합니다.
  • 민감정보는 ingest 전에 redaction하고 label cardinality를 제한합니다.
  • Compactor retention·delete_request_store와 지속 marker disk를 함께 구성합니다.
  • package·config·data rollback을 분리하고 purge하지 않습니다.
  • <...> 자리표시자는 승인된 리터럴 값으로 직접 치환하며 외부 입력으로 shell 명령을 조립하거나 eval하지 않습니다.

COMMON ERRORS

자주 막히는 지점

Alloy permission denied

증상
journal 또는 파일 로그를 읽지 못합니다.
가능한 원인
alloy 계정의 journal group 또는 대상 경로 ACL이 없습니다.
확인 순서
전체 권한을 열지 말고 공식 권한 가이드에 따라 필요한 경로만 ACL로 허용합니다.

Loki disk 급증

증상
filesystem data가 디스크를 채웁니다.
가능한 원인
retention 비활성·Compactor 오류·고카디널리티·ingest 증가일 수 있습니다.
확인 순서
Compactor와 증가율을 확인하고 chunk를 직접 삭제하지 않습니다.
트러블슈팅으로 이어보기

no org id

증상
Loki API가 401 no org id를 반환합니다.
가능한 원인
multi-tenant 모드에서 X-Scope-OrgID가 없거나 신뢰 proxy가 설정하지 않았습니다.
확인 순서
인증 reverse proxy가 인증 주체에서 tenant header를 덮어쓰게 하고 client 입력을 그대로 신뢰하지 않습니다.

PRIMARY REFERENCES

공식 문서

설치 저장소와 지원 버전은 바뀔 수 있습니다. 검토일 이후에는 링크된 공식 문서와 현재 서버의 패키지 후보 버전을 함께 확인하세요.

도구 빠른 검색

최근 사용한 도구를 다시 열거나, 이름과 기능으로 검색하세요.

검색어와 도구의 입력·결과는 저장하지 않습니다.

↑↓ 이동 · Enter 열기 · Esc 닫기