포트 구성
.ironflock/ 디렉토리에 port-template.yml 파일을 생성하여 앱이 원격 접근을 위해 노출하는 서비스를 정의합니다.
기본 예시
ports:
- name: Web Interface
port: 5000
main: true
protocol: https이를 통해 포트 5000이 원격 접근에 사용 가능하게 됩니다. 프로덕션 디바이스에 앱을 설치하면 해당 터널이 켜지며, network 권한이 있는 사용자는 디바이스의 앱 설정에서 터널을 껐다가 다시 켤 수 있습니다.
전체 예시
ports:
- name: Web Interface
port: 1100
main: true
protocol: http
- name: Video Stream
port: 1200
protocol: http
- name: Remote Desktop
port: 5900
protocol: tcp
- name: LoRaWAN Gateway
port: 1700
protocol: udp필드 참조
| 필드 | 필수 | 설명 |
|---|---|---|
name | 예 | 디바이스 앱 설정에 표시되는 레이블 |
port | 예 | 서비스가 수신 대기하는 로컬 포트 번호 |
main | 아니오 | true이면 디바이스 앱 목록의 빠른 접근 아이콘에 이 포트가 사용됨 |
protocol | 아니오 | http(기본값), https, tcp, 또는 udp |
remote_port_environment | 아니오 | TCP 및 UDP 전용: 디바이스 에이전트가 REMOTE_PORT_FOR_<port>와 함께 터널의 원격 포트를 알리는 추가 변수 이름. 0.19.8 이전의 디바이스 에이전트는 이 이름으로만 알립니다 |
주입되는 환경 변수
선언한 모든 포트에 대해 플랫폼이 앱의 컨테이너에 환경 변수를 주입하므로, 주소를 하드코딩하지 않고도 코드에서 서비스가 실제로 접근 가능한 위치를 확인할 수 있습니다:
| 변수 | 설명 |
|---|---|
DEVICE_LAN_IP | 로컬 네트워크에서의 디바이스 IP 주소 |
DEVICE_PORT_FOR_<port> | 선언한 포트가 로컬 네트워크에 게시되는 디바이스의 포트 |
REMOTE_PORT_FOR_<port> | 터널이 활성화된 동안 터널 서버가 할당하는 공개 포트 (TCP 및 UDP, 디바이스 에이전트 0.19.8 이상). 0은 아직 할당되지 않았음을 의미합니다 |
REMOTE_PORT_FOR_<port>_CLOUD | 디바이스가 클라우드를 통해 터널을 전달하는 IronFlock 인스턴스에서 실행될 때의 인터넷 연결 포트 (TCP 및 UDP) |
TUNNEL_DOMAIN | 디바이스의 터널 URL을 구성하는 데 쓰이는 도메인: 클라우드에서는 app.ironflock.com, 온프레미스 어플라이언스에서는 어플라이언스의 도메인, 도메인 없이 설치된 어플라이언스(일반 모드)의 엣지 디바이스에서는 localhost |
INSTANCE_KEY | 온프레미스 어플라이언스(인스턴스)에 속한 디바이스에서만 설정됩니다: 해당 디바이스의 클라우드를 통해 전달되는 터널 URL에 포함되는 키 |
<port>는 port-template.yml에 선언한 포트 번호입니다. 위의 Remote Desktop 예시의 경우, 앱은 DEVICE_PORT_FOR_5900을 받고 터널이 활성화된 동안에는 REMOTE_PORT_FOR_5900도 받게 됩니다. IronFlock SDK는 getRemoteAccessUrlForPort로 이 변수들에서 포트의 원격 접근 URL을 구성합니다. 플랫폼은 CLOUD_TUNNEL_DOMAIN을 설정하지 않습니다: 앱이 이 변수를 직접 설정하지 않는 한, 클라우드를 통해 전달되는 URL은 app.ironflock.com을 사용합니다.
터널은 프로덕션 설치에만 존재합니다. 개발(DEV) 컨테이너에는 자체 터널도 원격 포트도 없습니다 — 대신 디바이스의 로컬 네트워크에서 접근하십시오(DEVICE_LAN_IP, DEVICE_PORT_FOR_<port>).
여러 앱이 동일한 디바이스에서 동시에 실행될 수 있으므로, 선언된 포트는 디바이스의 사용 가능한 포트에 자동으로 매핑됩니다. 선언한 포트가 그대로 사용된다고 가정하지 말고, 항상 주입된 값으로 로컬 네트워크 주소를 구성하세요:
import os
lan_ip = os.environ.get("DEVICE_LAN_IP")
lan_port = os.environ.get("DEVICE_PORT_FOR_5900")
# 서비스는 로컬 네트워크에서 {lan_ip}:{lan_port}로 접근할 수 있습니다이 변수들은 컨테이너가 시작될 때 설정됩니다. 터널 포트는 앱 실행 중에 변경될 수 있으므로(예: 터널 재연결 시), 터널 포트 변수(REMOTE_PORT_FOR_<port>, 이에 대응하는 _CLOUD 변수, 사용자 지정 remote_port_environment 이름)는 /data/env/<VARIABLE_NAME>.txt 파일로도 항상 최신 상태로 유지되며, IronFlock SDK가 이를 자동으로 읽습니다. 그 밖의 변수는 컨테이너가 재시작될 때만 바뀝니다.
클라우드 포트가 사라지면(클라우드 전달이 꺼진 경우) 디바이스 에이전트는 _CLOUD 파일을 제거합니다. 따라서 에이전트의 파일이 있는 동안 _CLOUD 파일이 없거나 비어 있다는 것은 클라우드 포트가 없다는 뜻이며, SDK는 컨테이너가 시작될 때의 오래된 값으로 폴백하지 않습니다.
에이전트는 /data/env를 root만 읽을 수 있게 합니다. 다른 사용자로 실행되는 컨테이너는 이 파일들을 읽을 수 없습니다: 시작할 때의 값만 볼 수 있고 — 그 이후 바뀐 터널 포트는 볼 수 없으며 — SDK는 경고를 한 번 기록합니다.
프로토콜 작동 방식
HTTP / HTTPS
웹 기반 서비스를 위한 프로토콜입니다. IronFlock이 디바이스의 로컬 포트로 트래픽을 프록시하는 터널 도메인의 URL을 생성합니다. 사용자가 브라우저에서 URL을 엽니다. 이 URL은 비공개이며, 포트를 Public으로 전환하지 않는 한 IronFlock에 로그인하고 디바이스에 대한 접근 권한이 있는 사용자만 열 수 있습니다.
TCP
VNC(원격 데스크톱) 또는 직접 소켓 연결과 같은 프로토콜을 위한 것입니다. IronFlock이 터널 서버에 원격 포트를 할당하고 이를 REMOTE_PORT_FOR_<port>로 앱에 노출하며, 그러면 서비스는 tcp://<TUNNEL_DOMAIN>:<remote port>에서 접근할 수 있습니다.
UDP
LoRaWAN 통신 또는 VPN 터널과 같은 프로토콜을 위한 것입니다. TCP와 유사하게 원격 포트가 할당되고 REMOTE_PORT_FOR_<port>로 노출됩니다.
보드에 임베드
Embed Widget을 사용하여 디바이스의 원격 접근 터널을 보드에 직접 임베드할 수 있습니다. 이를 통해 다음이 가능한 원활한 경험을 만들 수 있습니다:
- 모든 디바이스에서 글로벌 데이터 모니터링
- 임베드된 웹 UI를 통해 개별 디바이스와 상호 작용
모두 동일한 대시보드 내에서.
프로덕션 디바이스에 앱을 설치하면
port-template.yml에 있는 모든 포트의 터널이 켜집니다. HTTP 및 HTTPS 터널은 비공개로 유지되어, 포트를 Public으로 전환하지 않는 한 IronFlock에 로그인하고 디바이스에 대한 접근 권한이 있는 사용자만 열 수 있습니다. TCP 및 UDP 터널은 앞단에 로그인이 없는 터널 서버의 원시 포트이므로 앱이 클라이언트를 직접 인증해야 합니다. 디바이스에 대한 network 권한이 있는 사용자는 터널을 껐다가 다시 켤 수 있습니다. 터널 관리를 참조하십시오.