Cloudflare Tunnel을 활용한 Mac 원격 HTTPS 접근 (제2편) - Obsidian 외부 접근
제1편에서 Cloudflare Tunnel의 기본 설정과 보안 강화 방법을 알아보았다면, 이번 편에서는 실전 활용 사례를 다룹니다. Obsidian Local REST API 플러그인을 활용하여 개인 노트를 외부에서 안전하게 접근하는 방법, n8n과 PostgreSQL 같은 여러 Docker 서비스를 하나의 터널로 효율적으로 관리하는 방법, 그리고 모바일 환경에서의 활용법까지 모두 살펴보겠습니다. 실무에서 바로 적용할 수 있는 구체적인 설정과 문제 해결 팁도 함께 제공합니다.

1. Obsidian 외부 접근이 필요한 이유
Obsidian은 강력한 로컬 기반 노트 애플리케이션으로, 마크다운 파일을 사용하여 개인 지식 베이스를 구축할 수 있습니다.
하지만 기본적으로 로컬 파일 시스템에만 접근하기 때문에, 외부에서 노트를 확인하거나 수정하려면 별도의 방법이 필요합니다. Obsidian 공식 동기화 서비스인 Obsidian Sync는 월 $10의 비용이 발생하며, 이는 연간 $120로 부담스러울 수 있습니다.
Cloudflare Tunnel과 Local REST API 플러그인을 활용하면 무료로 외부 접근이 가능합니다.
출퇴근 중 스마트폰으로 메모를 확인하고 수정할 수 있으며, 회사 컴퓨터에서 집에 있는 Obsidian Vault에 접근하여 작업을 이어갈 수 있습니다. 또한 n8n 같은 자동화 도구와 연동하여 이메일이나 RSS 피드를 자동으로 Obsidian에 저장하는 워크플로우도 구축할 수 있습니다.
데이터 주권 측면에서도 장점이 있습니다. Obsidian Sync는 Cloudflare에 데이터를 저장하지만, Local REST API 방식은 모든 데이터가 본인의 Mac에만 존재합니다. 민감한 개인 정보나 업무 관련 노트를 관리할 때 더 안심할 수 있으며, 인터넷이 연결되지 않은 환경에서도 로컬에서는 정상적으로 사용할 수 있습니다. HTTPS 암호화와 Zero Trust 인증을 결합하면 공용 와이파이에서도 안전하게 노트에 접근할 수 있습니다.
2. Obsidian Local REST API 플러그인 소개
Obsidian Local REST API는 커뮤니티 플러그인으로, Obsidian Vault를 HTTP API로 노출시켜주는 도구입니다.
개발자 coddingtonbear가 만든 이 플러그인은 RESTful API 방식으로 노트를 읽고, 생성하고, 수정하고, 삭제할 수 있는 기능을 제공합니다. 기본적으로 localhost의 27123 포트에서 실행되며, 이를 Cloudflare Tunnel과 연결하면 외부에서도 안전하게 접근할 수 있습니다.
플러그인이 제공하는 주요 기능은 다음과 같습니다.
- 첫째, Vault 내 모든 파일과 폴더 구조를 API로 조회할 수 있습니다.
- 둘째, 특정 파일의 내용을 읽거나 수정할 수 있으며, 새로운 파일을 생성하거나 기존 파일을 삭제하는 것도 가능합니다.
- 셋째, 전체 텍스트 검색 기능을 제공하여 특정 키워드를 포함한 모든 노트를 찾을 수 있습니다.
- 넷째, API Key 기반 인증을 지원하여 무단 접근을 방지할 수 있습니다.
API 엔드포인트는 직관적으로 설계되어 있습니다. 예를 들어 GET /vault/ 요청으로 Vault 정보를 조회하고, GET /vault/Daily/2024-01-20.md로 특정 일일 노트를 읽을 수 있습니다. PUT 메서드로 파일을 생성하거나 수정하고, DELETE로 삭제할 수 있습니다. PATCH 메서드를 사용하면 파일의 일부분만 수정하는 것도 가능합니다. 모든 요청에는 Authorization 헤더에 API Key를 포함해야 하므로 보안이 유지됩니다.
[!] RESTful API란?
HTTP 프로토콜을 사용하여 자원(Resource)을 URI로 표현하고, HTTP 메서드(GET, POST, PUT, DELETE)로 작업을 정의하는 아키텍처 스타일입니다. 웹 API의 표준적인 설계 방식입니다.
3. 플러그인 설치 및 기본 설정
Obsidian Local REST API 플러그인을 설치하는 과정은 간단합니다.
- Obsidian 앱을 열고 Settings(설정) → Community plugins(커뮤니티 플러그인)로 이동합니다.
- "Turn on community plugins" 버튼을 눌러 커뮤니티 플러그인을 활성화한 후, "Browse" 버튼을 클릭합니다.
- 검색창에 "Local REST API"를 입력하면 플러그인이 나타나며, "Install" 버튼을 눌러 설치합니다. 설치가 완료되면 "Enable" 버튼을 눌러 플러그인을 활성화합니다.
- 플러그인이 활성화되면 Settings → Local REST API 메뉴가 생성됩니다. 여기서 기본 설정을 진행합니다.
- Server Settings 섹션에서 Port는 기본값인 27123을 유지하는 것이 좋습니다. Host는 보안을 위해 반드시 localhost로 설정해야 합니다. 외부 접근은 Cloudflare Tunnel을 통해서만 이루어지도록 하기 위함입니다.
- Enable HTTPS 옵션은 비활성화합니다. Cloudflare가 HTTPS를 처리하므로 로컬에서는 HTTP로 충분합니다. 일반적으로는 그냥 나둬셔도 관계없습니다.
- 가장 중요한 설정은 API Key 생성입니다. API Keys 섹션에서 "Generate new API key" 버튼을 클릭하면 sk_로 시작하는 긴 문자열이 생성됩니다. 이 키는 비밀번호와 같으므로 안전하게 보관해야 합니다. 1Password, Bitwarden 같은 비밀번호 관리자를 사용하거나, Mac의 Keychain에 저장하는 것을 추천합니다. API Key는 모든 API 요청에 필요하므로 복사해두어야 합니다.
# 로컬에서 API 테스트
curl http://localhost:27123/
# API Key 인증 테스트
curl -H "Authorization: Bearer sk_YOUR_API_KEY" \
http://localhost:27123/vault/
위 명령으로 API가 정상적으로 작동하는지 확인할 수 있습니다. 성공하면 Vault 이름과 경로가 JSON 형식으로 반환됩니다.
4. Cloudflare Tunnel과 Obsidian 연동
Obsidian API를 외부에서 접근하려면 Cloudflare Tunnel 설정 파일에 새로운 ingress 규칙을 추가해야 합니다. 제1편에서 생성한 ~/.cloudflared/config.yml 파일을 편집기로 엽니다. 기존 설정을 유지하면서 Obsidian API용 호스트네임과 서비스를 추가합니다.
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
# Obsidian API
- hostname: obsidian.yourdomain.com
service: http://localhost:27123
originRequest:
connectTimeout: 30s
httpHostHeader: localhost
# 기존 n8n 서비스 (예시)
- hostname: n8n.yourdomain.com
service: http://localhost:5678
# 기본 규칙 (필수)
- service: http_status:404
- originRequest 섹션의 connectTimeout은 API 응답이 느릴 때를 대비한 타임아웃 설정입니다. 대용량 Vault를 다룰 때는 이 값을 늘릴 수 있습니다.
- httpHostHeader는 Obsidian API가 localhost 주소로 요청을 받을 수 있도록 하는 설정입니다.
DNS 레코드를 생성해야 합니다.
제1편에서 소개한 방법대로 커스텀 도메인을 사용하는 경우 CLI로 간단하게 추가할 수 있습니다.
# DNS 레코드 자동 생성
cloudflared tunnel route dns mac-home obsidian.yourdomain.com
또는 Cloudflare 대시보드에서 수동으로 CNAME 레코드를 추가할 수도 있습니다. DNS 설정 탭에서 다음과 같이 입력합니다.
| 항목 | 값 |
| Type | CNAME |
| Name | obsidian |
| Target | abc123def-456-789.cfargotunnel.com |
| Proxy status | Proxied (주황색) |
| TTL | Auto |
설정 파일을 저장한 후 cloudflared 서비스를 재시작합니다.
# 서비스 재시작
sudo launchctl stop com.cloudflare.cloudflared
sudo launchctl start com.cloudflare.cloudflared
# 로그 확인
sudo tail -f /Library/Logs/com.cloudflare.cloudflared.err.log
# Docker기반 cloudflared 서비스인 경우
sudo docker compose restart cloudflared
외부에서 접근을 테스트합니다. 다른 네트워크(모바일 핫스팟, 회사 와이파이 등)에서 다음 명령을 실행합니다.
# 외부에서 API 테스트
curl -H "Authorization: Bearer sk_YOUR_API_KEY" \
https://obsidian.yourdomain.com/vault/
정상적으로 Vault 정보가 반환되면 성공입니다.
5. 외부에서 Obsidian API 사용하기
이제 외부에서 Obsidian API를 사용하는 실제 예시를 살펴보겠습니다. API의 주요 엔드포인트와 사용 방법을 이해하면 다양한 자동화 시나리오를 구현할 수 있습니다.
Vault 정보 조회
가장 기본적인 작업은 Vault의 전체 구조와 파일 목록을 조회하는 것입니다.
# Vault 기본 정보
curl -H "Authorization: Bearer sk_YOUR_API_KEY" \
https://obsidian.yourdomain.com/vault/
# 응답 예시
{
"name": "My Vault",
"path": "/Users/denny/Documents/ObsidianVault",
"files": [
"Daily/2024-01-20.md",
"Projects/Cloudflare.md",
"Inbox/Quick Notes.md"
]
}

파일 내용 읽기
특정 노트의 내용을 읽어올 수 있습니다. 파일 경로는 Vault 루트를 기준으로 상대 경로를 사용합니다.
# 특정 파일 읽기
curl -H "Authorization: Bearer sk_YOUR_API_KEY" \
https://obsidian.yourdomain.com/vault/Daily/2024-01-20.md
# 응답은 마크다운 텍스트
## 2024-01-20
- Cloudflare Tunnel 제2편 작성 중
- Obsidian API 테스트 완료
파일 생성 및 수정
PUT 메서드로 새로운 노트를 생성하거나 기존 노트를 수정할 수 있습니다.
# 새 파일 생성
curl -X PUT \
-H "Authorization: Bearer sk_YOUR_API_KEY" \
-H "Content-Type: text/markdown" \
-d "# Quick Note
이것은 외부에서 생성한 메모입니다." \
https://obsidian.yourdomain.com/vault/Inbox/New Note.md
# 기존 파일 수정 (전체 내용 교체)
curl -X PUT \
-H "Authorization: Bearer sk_YOUR_API_KEY" \
-H "Content-Type: text/markdown" \
-d "# Updated Content
내용이 업데이트되었습니다." \
https://obsidian.yourdomain.com/vault/Inbox/New Note.md
파일 일부 수정
PATCH 메서드를 사용하면 파일 전체를 교체하지 않고 내용을 추가할 수 있습니다.
# 파일 끝에 내용 추가
curl -X PATCH \
-H "Authorization: Bearer sk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "append",
"content": "\n\n## 추가 섹션\n\n외부에서 추가한 내용입니다."
}' \
https://obsidian.yourdomain.com/vault/Projects/Cloudflare.md
파일 삭제
DELETE 메서드로 노트를 삭제할 수 있습니다. 삭제는 되돌릴 수 없으므로 주의해야 합니다.
# 파일 삭제
curl -X DELETE \
-H "Authorization: Bearer sk_YOUR_API_KEY" \
https://obsidian.yourdomain.com/vault/Inbox/Temp.md
전체 검색
POST 메서드로 Vault 전체에서 특정 키워드를 검색할 수 있습니다.
# 키워드 검색
curl -X POST \
-H "Authorization: Bearer sk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "Cloudflare"}' \
https://obsidian.yourdomain.com/search/simple/
# 응답 예시
[
{
"filename": "Projects/Cloudflare.md",
"score": 0.95
},
{
"filename": "Daily/2024-01-20.md",
"score": 0.82
}
]
6. 모바일 환경에서 Obsidian 활용
스마트폰에서 Obsidian API를 활용하면 이동 중에도 메모를 작성하고 확인할 수 있습니다. iOS와 Android 모두 자동화 도구를 제공하므로 이를 활용할 수 있습니다.
iOS 단축어(Shortcuts) 활용
iOS의 단축어 앱을 사용하면 버튼 하나로 Obsidian에 메모를 추가할 수 있습니다. 단축어 앱을 열고 새로운 단축어를 생성합니다.
빠른 메모 추가 단축어:
- "텍스트 입력" 액션 추가 - 프롬프트: "메모 내용"
- "URL 내용 가져오기" 액션 추가
- URL: https://obsidian.yourdomain.com/vault/Inbox/Mobile.md
- 방법: PATCH
- 헤더:
- Authorization: Bearer sk_YOUR_API_KEY
- Content-Type: application/json
- 본문 요청:
{
"mode": "append",
"content": "\n- [시간] [텍스트 입력]"
}
- "알림 표시" 액션 - "메모가 저장되었습니다"
이 단축어를 홈 화면에 추가하면 위젯처럼 빠르게 접근할 수 있습니다.
오늘의 일일 노트 읽기 단축어:
- "현재 날짜" 액션 - 형식: YYYY-MM-DD
- "URL 내용 가져오기"
- URL: https://obsidian.yourdomain.com/vault/Daily/[현재 날짜].md
- 방법: GET
- 헤더: Authorization: Bearer sk_YOUR_API_KEY
- "텍스트 표시" - URL 내용을 화면에 표시
Android Tasker 활용
Android의 Tasker 앱을 사용하면 위치 기반이나 시간 기반으로 자동 메모를 작성할 수 있습니다.
출근 시 자동 기록:
Profile: 출근 (위치 조건: 회사 주소)
Task: 출근 기록
1. HTTP Request
- Server:Port: obsidian.yourdomain.com:443
- Path: /vault/Work Log.md
- Method: PATCH
- Headers:
- Authorization: Bearer sk_YOUR_API_KEY
- Content-Type: application/json
- Body: {"mode":"append","content":"\n- %DATE %TIME 출근"}
- Trust Any Certificate: No
정기 백업 알림:
매일 저녁 9시에 오늘 작성한 노트를 알림으로 요약하는 작업도 가능합니다.
Profile: 일일 요약 (시간: 21:00)
Task:
1. HTTP Request - Daily 노트 읽기
2. 알림 표시 - 읽어온 내용 요약
웹 인터페이스 만들기
간단한 HTML 페이지를 만들어 웹 브라우저에서 Obsidian에 접근할 수도 있습니다.
Quick Note
저장
const API_URL = '<a href=https://obsidian.yourdomain.com';>https://obsidian.yourdomain.com';</a>
const API_KEY = 'sk_YOUR_API_KEY';
async function saveNote() {
const content = document.getElementById('content').value;
const date = new Date().toISOString().split('T')[0];
try {
const response = await fetch(`${API_URL}/vault/Quick/${date}.md`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'text/markdown'
},
body: content
});
if (response.ok) {
document.getElementById('status').textContent = '저장 완료!';
document.getElementById('content').value = '';
} else {
document.getElementById('status').textContent = '저장 실패';
}
} catch (error) {
document.getElementById('status').textContent = '오류: ' + error.message;
}
}
이 HTML 파일을 저장하고 브라우저에서 열면 간단한 메모 인터페이스가 표시됩니다. API Key는 클라이언트 코드에 하드코딩되므로 개인용으로만 사용해야 합니다.
7. 여러 Docker 서비스 통합 관리
Cloudflare Tunnel의 진정한 강점은 여러 서비스를 하나의 터널로 통합 관리할 수 있다는 점입니다. Mac에서 실행 중인 n8n, PostgreSQL, Grafana, Portainer 등 다양한 Docker 컨테이너를 각각 다른 서브도메인으로 노출할 수 있습니다.
통합 config.yml 구조
여러 서비스를 관리하는 설정 파일 예시입니다.
# ~/.cloudflared/config.yml
tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /Users/사용자명/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
ingress:
# Obsidian API
- hostname: obsidian.yourdomain.com
service: http://localhost:27123
# n8n 자동화 플랫폼
- hostname: n8n.yourdomain.com
service: http://localhost:5678
originRequest:
noTLSVerify: true
# PostgreSQL 관리 도구 (pgAdmin)
- hostname: pgadmin.yourdomain.com
service: http://localhost:5050
# Grafana 모니터링
- hostname: grafana.yourdomain.com
service: http://localhost:3000
# Portainer (Docker 관리)
- hostname: portainer.yourdomain.com
service: https://localhost:9443
originRequest:
noTLSVerify: true
# 기본 규칙
- service: http_status:404
각 서비스마다 별도의 서브도메인을 사용하므로 관리가 명확합니다. 서비스별로 다른 접근 권한을 Zero Trust로 설정할 수도 있습니다.
DNS 레코드 일괄 생성
여러 서브도메인을 한 번에 생성하는 스크립트입니다.
#!/bin/bash
# create-dns-records.sh
TUNNEL_NAME="mac-home"
DOMAINS=(
"obsidian"
"n8n"
"pgadmin"
"grafana"
"portainer"
)
for domain in "${DOMAINS[@]}"; do
echo "Creating DNS record for $domain.yourdomain.com"
cloudflared tunnel route dns $TUNNEL_NAME $domain.yourdomain.com
done
스크립트를 실행하면 모든 서브도메인이 자동으로 생성됩니다.
chmod +x create-dns-records.sh
./create-dns-records.sh
Docker Compose로 서비스 관리
여러 서비스를 Docker Compose로 통합 관리하면 편리합니다.
# ~/docker/docker-compose.yml
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.yourdomain.com/
volumes:
- ./n8n:/home/node/.n8n
postgres:
image: postgres:16
container_name: postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=your_password
volumes:
- ./postgres:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4:latest
container_name: pgadmin
restart: unless-stopped
ports:
- "5050:80"
environment:
- PGADMIN_DEFAULT_EMAIL=admin@example.com
- PGADMIN_DEFAULT_PASSWORD=admin_password
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./grafana:/var/lib/grafana
Docker Compose로 모든 서비스를 한 번에 시작하고 중지할 수 있습니다.
# 모든 서비스 시작
cd ~/docker
docker compose up -d
# 로그 확인
docker compose logs -f
# 특정 서비스만 재시작
docker compose restart n8n
# 모든 서비스 중지
docker compose down
8. n8n 자동화 플랫폼 외부 접근
n8n은 노코드/로우코드 자동화 플랫폼으로, 다양한 서비스를 연결하여 워크플로우를 만들 수 있습니다. Cloudflare Tunnel을 통해 외부에서 접근하면 어디서나 워크플로우를 관리하고 실행할 수 있습니다.
n8n 전용 설정
n8n은 Webhook URL을 올바르게 설정해야 외부 서비스와 연동할 수 있습니다.
# config.yml의 n8n 섹션
ingress:
- hostname: n8n.yourdomain.com
service: http://localhost:5678
originRequest:
noTLSVerify: true
n8n 컨테이너의 환경 변수도 중요합니다.
# docker-compose.yml
services:
n8n:
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.yourdomain.com/
- N8N_ENCRYPTION_KEY=your_encryption_key
WEBHOOK_URL을 Cloudflare 도메인으로 설정해야 외부 서비스(Telegram, Stripe, GitHub 등)에서 올바른 Webhook URL을 받을 수 있습니다.
Obsidian과 n8n 연동 예시
n8n에서 Obsidian API를 호출하여 자동화할 수 있습니다.
이메일을 Obsidian에 자동 저장:
1. Gmail Trigger - 새 이메일 수신
2. Filter - Subject에 [Note] 포함
3. HTTP Request
- Method: PUT
- URL: https://obsidian.yourdomain.com/vault/Inbox/{{$now.format('YYYY-MM-DD')}}-{{$json.subject}}.md
- Headers:
- Authorization: Bearer {{$credentials.obsidianApi}}
- Content-Type: text/markdown
- Body:
## {{$json.subject}}
From: {{$json.from}}
Date: {{$json.date}}
{{$json.body}}
RSS 피드를 Daily Note에 추가:
1. RSS Trigger - 새 아이템 감지
2. HTTP Request (PATCH)
- URL: https://obsidian.yourdomain.com/vault/Daily/{{$now.format('YYYY-MM-DD')}}.md
- Body:
{
"mode": "append",
"content": "\n## [{{$json.title}}]({{$json.link}})\n{{$json.description}}\n"
}
9. PostgreSQL 데이터베이스 안전하게 노출하기
PostgreSQL 같은 데이터베이스를 외부에 노출할 때는 특별한 주의가 필요합니다. 직접 5432 포트를 노출하는 것은 보안상 매우 위험하므로, pgAdmin 같은 웹 기반 관리 도구를 함께 사용하는 것을 권장합니다.
pgAdmin으로 안전한 관리
pgAdmin은 PostgreSQL을 웹 브라우저에서 관리할 수 있는 도구입니다.
# docker-compose.yml
services:
postgres:
image: postgres:16
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432" # localhost에서만 접근
environment:
- POSTGRES_PASSWORD=strong_password
volumes:
- ./postgres:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4:latest
restart: unless-stopped
ports:
- "127.0.0.1:5050:80" # localhost에서만 접근
environment:
- PGADMIN_DEFAULT_EMAIL=admin@example.com
- PGADMIN_DEFAULT_PASSWORD=admin_password
depends_on:
- postgres
ports 설정에서 127.0.0.1:을 추가하면 localhost에서만 접근할 수 있어 보안이 강화됩니다.
PostgreSQL TCP 직접 연결 (고급)
특수한 경우 PostgreSQL에 직접 연결해야 한다면 Cloudflare Tunnel의 TCP 지원을 사용할 수 있습니다.
# config.yml
ingress:
- hostname: postgres.yourdomain.com
service: tcp://localhost:5432
하지만 이 방식은 보안 위험이 크므로 Zero Trust Access를 반드시 적용해야 합니다. 또한 클라이언트에서는 특수한 설정이 필요합니다.
# cloudflared access를 통한 연결
cloudflared access tcp --hostname postgres.yourdomain.com --url localhost:5432
# 다른 터미널에서
psql -h localhost -p 5432 -U postgres
일반 사용자에게는 pgAdmin을 통한 웹 기반 접근을 권장합니다.
10 서비스별 보안 설정 최적화
각 서비스마다 민감도가 다르므로 차별화된 보안 설정이 필요합니다.
보안 레벨 분류
| 서비스 | 보안 레벨 | 권장 설정 |
| Obsidian API | 높음 | Zero Trust + API Key + IP 제한 |
| n8n | 높음 | Zero Trust + 계정 인증 |
| PostgreSQL | 매우 높음 | pgAdmin 경유 + Zero Trust |
| Grafana | 중간 | Grafana 자체 인증 + Zero Trust(선택) |
| 정적 웹사이트 | 낮음 | 공개 또는 간단한 Access |
Obsidian API 보안 강화
Obsidian API는 개인 노트를 다루므로 가장 엄격한 보안이 필요합니다.
# config.yml
ingress:
- hostname: obsidian.yourdomain.com
service: http://localhost:27123
originRequest:
access:
required: true
teamName: my-team
audTag: your-aud-tag
Zero Trust Application 설정:
Application Name: Obsidian API
Domain: obsidian.yourdomain.com
Session Duration: 24 hours
Policy:
Action: Allow
Include:
- Emails: your-personal-email@gmail.com
Require:
- IP ranges: 1.2.3.4/32 (집 IP)
- IP ranges: 5.6.7.8/32 (회사 IP)
n8n 보안 설정
n8n은 자체 계정 인증 시스템이 있지만, Zero Trust로 추가 보호할 수 있습니다.
# docker-compose.yml
services:
n8n:
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=strong_password
또는 Zero Trust만 사용:
# config.yml
ingress:
- hostname: n8n.yourdomain.com
service: http://localhost:5678
originRequest:
access:
required: true
Rate Limiting 설정
무차별 대입 공격을 방지하기 위해 Cloudflare WAF에서 Rate Limiting을 설정합니다.
Cloudflare 대시보드 → Security → WAF → Rate limiting rules:
Rule Name: API Rate Limit
If incoming requests match:
- Hostname equals obsidian.yourdomain.com
- Path contains /vault/
Then:
- Rate: 60 requests per 1 minute
- Action: Block
11. 문제 해결 및 트러블슈팅
실제 운영 중 발생할 수 있는 문제와 해결 방법을 정리했습니다.
Obsidian API 접근 시 401 Unauthorized
증상: API 호출 시 401 에러 발생
원인:
- API Key가 잘못되었거나 만료됨
- Authorization 헤더 형식 오류
해결방법:
# API Key 재확인
# Obsidian Settings → Local REST API → API Keys
# 올바른 헤더 형식 확인
curl -v -H "Authorization: Bearer sk_YOUR_ACTUAL_KEY" \
https://obsidian.yourdomain.com/vault/
# Bearer 앞뒤 공백 확인
# 올바른 형식: "Bearer sk_abc123"
# 잘못된 형식: "Bearersk_abc123" 또는 "Bearer sk_abc123"
CORS 오류
증상: 웹 브라우저 콘솔에 CORS 에러 표시
Access to fetch at 'https://obsidian.yourdomain.com' from origin 'null'
has been blocked by CORS policy
해결방법:
Obsidian Settings → Local REST API:
- Allow CORS: [v] 활성화
- Allowed Origins: * 또는 https://yourdomain.com
502 Bad Gateway
증상: 502 에러 페이지 표시
원인:
- Obsidian 앱이 실행되지 않음
- Local REST API 플러그인이 비활성화됨
- Mac이 절전 모드
해결방법:
# Obsidian 실행 확인
ps aux | grep Obsidian
# 포트 확인
lsof -i:27123
# Mac 절전 방지
caffeinate -d &
Docker 컨테이너 접근 불가
증상: n8n, PostgreSQL 등 Docker 서비스 접근 안됨
원인:
- 컨테이너가 중지됨
- 포트 충돌
해결방법:
# 컨테이너 상태 확인
docker ps -a
# 컨테이너 로그 확인
docker logs n8n
# 포트 충돌 확인
lsof -i:5678
# 컨테이너 재시작
docker restart n8n
성능 저하 및 타임아웃
증상: API 응답이 느리거나 타임아웃
해결방법:
config.yml 타임아웃 연장:
ingress:
- hostname: obsidian.yourdomain.com
service: http://localhost:27123
originRequest:
connectTimeout: 60s
tlsTimeout: 60s
keepAliveConnections: 100
keepAliveTimeout: 90s
Zero Trust 인증 루프
증상: 로그인 후 계속 다시 로그인 요구
원인:
- 브라우저 쿠키 차단
- Session Duration 만료
해결방법:
- 브라우저 쿠키 허용 확인
- Zero Trust Application에서 Session Duration 늘리기 (24시간 → 1주)
- 시크릿 모드에서는 매번 인증 필요
마무리
이번 글에서는 Cloudflare Tunnel을 활용한 실전 사례를 살펴보았습니다. Obsidian Local REST API 플러그인을 통해 개인 노트를 외부에서 안전하게 접근하는 방법, 모바일 환경에서 단축어와 Tasker로 자동화하는 방법, 그리고 여러 Docker 서비스를 하나의 터널로 통합 관리하는 방법을 다루었습니다.
n8n, PostgreSQL, Grafana 같은 다양한 서비스를 각각 다른 서브도메인으로 노출하면서도 하나의 터널로 관리할 수 있다는 것이 Cloudflare Tunnel의 강력한 장점입니다. Zero Trust Access를 서비스별로 차별화하여 적용하면 보안과 편의성을 모두 확보할 수 있습니다. API Key와 인증을 조합하면 공용 와이파이에서도 안심하고 민감한 데이터에 접근할 수 있습니다.
다음 제3편에서는 Synology NAS에서 Cloudflare Tunnel을 Docker로 운영하는 방법을 다룰 예정입니다. Mac은 필요할 때만 켜지만 NAS는 24시간 가동되므로 더욱 안정적인 홈 서버를 구축할 수 있습니다. DSM 웹 인터페이스 외부 접근, Container Manager를 통한 Docker 관리, 자동 백업 및 모니터링 설정까지 실무에 바로 적용할 수 있는 완전한 가이드를 제공하겠습니다.
참고 자료
'AI 코딩' 카테고리의 다른 글
| [라즈베리파이] 4K모니터에서 CLI폰트 키우기 (0) | 2026.02.01 |
|---|---|
| Cloudflare Zero Trust VPN을 사용해 봅시다 (0) | 2026.01.25 |
| Cloudflare Tunnel을 활용한 HTTPS 연결하기(2) - Synology NAS (0) | 2026.01.23 |
| Cloudflare Tunnel을 활용한 HTTPS 연결하기(1) - 기본편 (1) | 2026.01.22 |
| Claude Code Workflow Studio로 만드는 AI 워크플로우 (0) | 2026.01.01 |