fly.io + rabbitmq + MQTT over WebSocket
fly.io에서는 무료로 제공하는 자원이 있는데 몇가지 제약이 있다. Fly.io Resource Pricing 2023/12/15 기준
- Free allowances
- Up to 3 shared-cpu-1x 256mb VMs
- 3GB persistent volume storage (total)
- 160GB outbound data transfer
- Anycast IP addresses
- Each application receives a shared IPv4 address and unlimited Anycast IPv6 addresses for global load balancing.
- Shared IPv4
- HTTP on port 80, or
- TLS & HTTP on port 443
miyako의 목표는 다음과 같다.
- shared-cpu-1x 256mb VM 하나에 rabbitmq를 띄운다 (무료)
- ipv4를 통해서 MQTT over WebSocket를 노출한다 (무료)
miyako의 빅픽쳐는 다음과 같다. (귀찮아서 안할듯?)
- 다양한 rabbitmq plugins을 넣어서 많은 프로토콜을 지원한다.
- http proxy를 통해서 MQTT over WebSocket, STOMP over WebSocket과 같은 프로토콜을 동시에 지원한다.
# 배포
fly deploy
# 권한 설정
fly secrets set RABBITMQ_DEFAULT_USER=TODO_user
fly secrets set RABBITMQ_DEFAULT_PASS=TODO_password
# 비용 줄이려고 machine은 1개만 사용
fly scale show
fly scale count 1
외부 접속이 막혀있어서 프록시 써야 management에 접속할 수 있다. localhost에서의 포트 충돌을 피하려고 프록시의 포트번호는 기본값과 다르게 설정한다. 15672만 아니면 된다.
fly proxy --app miyako-rabbitmq 15673:15672
http://localhost:15673/
cp samples/.env.sample samples/.env.local
.env.local
을 적절히 수정한다.
$ cd examples/
$ pnpm i
$ pnpm start:env
> examples@1.0.0 start:env C:\dev\miyako-rabbitmq\examples
> node --env-file .env.local src/mqtt_simple.mjs
wss://guest:guest@miyako-rabbitmq.fly.dev/ws
connect
subscribe [ { topic: '/priv/room/sample', qos: 0 } ]
/priv/room/sample now: 2023-12-14T16:59:45.374Z
Dockerfile
이 올바른지 검증하려면 로컬에서 띄워서 테스트하는게 확실하다.
podman build -t miyako-rabbitmq .
docker-compose up -d
http://127.0.0.1:15672/
id: guest / pw: guest
페이지에 접속되면 간단한 스크립트로 MQTT over WebSocket를 테스트해본다.
$ cd examples/
$ pnpm i
$ pnpm start:localhost
> examples@1.0.0 start:localhost C:\dev\miyako-rabbitmq\examples
> node src/mqtt_simple.mjs
ws://guest:guest@127.0.0.1:15675/ws
connect
subscribe [ { topic: '/priv/room/sample', qos: 0 } ]
/priv/room/sample now: 2023-12-14T16:46:44.600Z
참고 링크 https://medium.com/@stefannovak96/hosting-rabbitmq-on-fly-io-in-5-minutes-e749dbb476f1
[
rabbitmq_management,
rabbitmq_mqtt,
rabbitmq_web_mqtt,
rabbitmq_stomp,
rabbitmq_web_stomp
].
rabbitmq plugins은 위와같이 많이 있지만 메모리를 아끼기 위해서 최소한으로만 사용할 예정이다.