중앙화된 CDN된 네트워크로 인해 발생하는 사용자의 불편함을 해소하고자 진행되고 있는 프로젝트입니다. 인프라가 잘 세팅된 곳에서는 질 좋은 서비스를 사용할 수 있고 그렇지 않은 곳은 서비스를 제공받을 수 없는 문제 (제공받는 서비스에도 빈부격차가 존재)가 존재하는데, 컨텐츠 프로바이더와 컨텐츠 네트워크를 탈중앙화된 구조로 변경하여 web3 생태계에서의 어플리케이션을 어디서나 완전하게 제공하고자하는 것이 목표라고 합니다. 이를 위해 아래와 같은 기능을 지원하고 있습니다.
Hosting (IPFS, ENS)
Storage (FileCoin, IPFS, Arweave, Storj, Sia)
Gateway
사진. what-is-fleek
Fleek은 ENS, Filecoin 등 기존의 인프라 프로젝트들을 서비스에서 지원할 뿐만 아니라 자체 네트워크도 함께 개발 중인데요. https://app.fleek.co/ 에서는 샘플 어플리케이션을 제공하고 있습니다. 프로젝트에 관심 있는 분들은 한 번 사용해보시면서 fleek이 어떤 기능을 제공하고자 하는지 직접 확인해보시는 것을 추천드립니다.
그리고 fleek 공식 가이드에서 노드로 네트워크에 참여하는 사용자에게 인센티브를 줄 것을 암시하고 있습니다.
“Fleek Network relies on blockchain technology at its core, allowing governance and token rewards as incentives for participation in serving the network.”
하지만 디스코드에서는 현재 테스트넷은 아직 incentized testnet 단계는 아니며 향후 공지를 기다리라고 하네요. (팀 내부에서도 충분히 논의되는 내용인 듯 합니다.)
사진. fleek-not-incentived
fleek 프로젝트에 대해 더 자세히 알고 싶으신 분들은 아래 링크를 통해 직접 커뮤니티에 참여해보세요!
Rust를 설치하여 직접 설치하는 방법과 docker로 설치하는 두 가지 방법 중 본 포스팅에서는 후자를 소개합니다.
Install & Run (docker)
fleek의 클라이언트 이름은 ursa입니다. ursa 노드를 설치하고 실행하는 방법은 아주 간단합니다.
ursa 이외에 클라이언트 메트릭을 확인할 수 있는 prometheus, grafana, 로드 밸런서인 nginx와 nginx의 exporter도 docker로 제공하고 있지만 실행 시 에러가 발생하여 본 포스팅에서는 제외하였습니다.
sudo apt-get update && sudo apt-get upgrade
git clone https://github.com/fleek-network/ursa.git
cd ursa
# buildkit 활성화
export DOCKER_BUILDKIT=1
# 노드 image 생성
make docker-build
# 노드 실행
make docker-run
노드를 실행하면 아래와 같은 로그를 확인하실 수 있습니다.
2022-12-07T12:28:33.231992Z INFO ursa::ursa::identity: Created identity `default` (12D3KooWA8ZkVjgLEYUkv9quA58gk6TmzBaTXb1LacFBS4gKULcj)
2022-12-07T12:28:33.232038Z INFO ursa: Using "/root/.ursa/data/ursa_db" as database path
2022-12-07T12:28:33.284415Z INFO ursa_network::discovery: Bootstrapping with [(PeerId("12D3KooWDji7xMLia6GAsyr4oiEFD2dd3zSryqNhfxU3Grzs1r9p"), "/ip4/159.223.211.234/tcp/6009"), (PeerId("12D3KooWGw8vCj9XayJDMXUiox6pCUFm7oVuWkDJeE2H9SDQVEcM"), "/ip4/146.190.232.131/tcp/6009")]
2022-12-07T12:28:33.287322Z INFO ursa_network::service: Node starting up with peerId PeerId("12D3KooWA8ZkVjgLEYUkv9quA58gk6TmzBaTXb1LacFBS4gKULcj")
2022-12-07T12:28:33.288036Z INFO ursa_network::discovery: [KademliaEvent] RoutingUpdated { peer: PeerId("12D3KooWDji7xMLia6GAsyr4oiEFD2dd3zSryqNhfxU3Grzs1r9p"), is_new_peer: true, addresses: ["/ip4/159.223.211.234/tcp/6009"], bucket_range: (Distance(28948022309329048855892746252171976963317496166410141009864396001978282409984), Distance(57896044618658097711785492504343953926634992332820282019728792003956564819967)), old_peer: None }
2022-12-07T12:28:33.288411Z INFO ursa_network::discovery: [KademliaEvent] RoutingUpdated { peer: PeerId("12D3KooWGw8vCj9XayJDMXUiox6pCUFm7oVuWkDJeE2H9SDQVEcM"), is_new_peer: true, addresses: ["/ip4/146.190.232.131/tcp/6009"], bucket_range: (Distance(57896044618658097711785492504343953926634992332820282019728792003956564819968), Distance(115792089237316195423570985008687907853269984665640564039457584007913129639935)), old_peer: None }
2022-12-07T12:28:33.289656Z INFO ursa_rpc_server::server: Server (Rpc and http) starting up
2022-12-07T12:28:33.290092Z INFO ursa_rpc_server::server: listening on 0.0.0.0:4069
2022-12-07T12:28:33.291096Z INFO ursa_index_provider::provider: index provider starting up
2022-12-07T12:28:33.291545Z INFO ursa_index_provider::provider: index provider listening on: 0.0.0.0:8070
2022-12-07T12:28:33.292244Z INFO ursa_metrics::metrics: listening on 0.0.0.0:4070
2022-12-07T12:28:36.253113Z INFO ursa_metrics::events: capturing event PeerConnected
2022-12-07T12:28:36.334314Z INFO ursa_metrics::events: capturing event PeerConnected
2022-12-07T12:28:37.268759Z INFO ursa_network::discovery: [KademliaEvent] RoutingUpdated { peer: PeerId("12D3KooWGw8vCj9XayJDMXUiox6pCUFm7oVuWkDJeE2H9SDQVEcM"), is_new_peer: false, addresses: ["/ip4/146.190.232.131/tcp/6009", "/ip4/146.190.232.131/tcp/6009/p2p/12D3KooWGw8vCj9XayJDMXUiox6pCUFm7oVuWkDJeE2H9SDQVEcM"], bucket_range: (Distance(57896044618658097711785492504343953926634992332820282019728792003956564819968), Distance(115792089237316195423570985008687907853269984665640564039457584007913129639935)), old_peer: None }
2022-12-07T12:28:37.269017Z INFO ursa_network::discovery: [KademliaEvent] RoutingUpdated { peer: PeerId("12D3KooWGw8vCj9XayJDMXUiox6pCUFm7oVuWkDJeE2H9SDQVEcM"), is_new_peer: false, addresses: ["/ip4/146.190.232.131/tcp/6009", "/ip4/146.190.232.131/tcp/6009/p2p/12D3KooWGw8vCj9XayJDMXUiox6pCUFm7oVuWkDJeE2H9SDQVEcM", "/ip4/127.0.0.1/tcp/6009"], bucket_range: (Distance(57896044618658097711785492504343953926634992332820282019728792003956564819968), Distance(115792089237316195423570985008687907853269984665640564039457584007913129639935)), old_peer: None }
이 상태에서 Ctrl + C를 누르시면 노드가 종료됩니다. 다시 노드를 실행하면 아래와 같은 에러가 발생할텐데요.
docker: Error response from daemon: Conflict. The container name "/ursa-cli" is already in use by container "170873c06faa5445d5b9d872a0f119b7a352d11e42a4fee7521bb3fae219b9c4". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
make: *** [Makefile:28: docker-run] Error 125
Ctrl + C를 눌러서 실행 중인 container는 종료되었지만 삭제된 것은 아니기 때문입니다. 아래 명령어로 남아있는 container를 지워주면 make docker-run으로 재실행이 가능합니다.
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ed72615fbed grafana/grafana:6.7.2 "/run.sh" 7 minutes ago Exited (1) 7 minutes ago ursa_grafana_1
91310f006357 fish/nginx-exporter "/usr/local/bin/ngin…" 7 minutes ago Exited (137) 7 minutes ago ursa_nginxexporter_1
30142fe527a1 prom/prometheus "/bin/prometheus --w…" 7 minutes ago Exited (137) 7 minutes ago ursa_prometheus_1
83e480da969c nginx:latest "/docker-entrypoint.…" 7 minutes ago Exited (1) 7 minutes ago ursa_nginx_1
39406a7474fb certbot/certbot "/bin/sh -c 'trap ex…" 7 minutes ago Exited (137) 7 minutes ago ursa_certbot_1
0143852971c3 ursa_ursa "/ursa" 7 minutes ago Exited (137) 7 minutes ago ursa_ursa_1
170873c06faa ursa "/ursa" 33 minutes ago Exited (139) 8 minutes ago ursa-cli
# docker rm <ursa-cli의 CONTAINER ID>
docker rm 170873c06faa
170873c06faa
두 번째 방법으로 infra/ursa/docker-compose.yml을 Makefile을 일부 수정하면 데몬 환경에서 노드를 실행할 수 있습니다.
infra/ursa/docker-compose.yml 수정
version: '3'
services:
ursa:
build:
context: ../../.
dockerfile: Dockerfile
restart: on-failure
ports:
# 6009 TCP and UDP, used by the P2P protocol running the network
- "6009:6009"
expose:
# 4069 TCP, used by the HTTP based JSON RPC API
- "4069"
# 4070 TCP, used by the HTTP metrics server
- "4070"
# 6009 TCP and UDP, used by the P2P protocol running the network
- "6009"
# 8070 TCP, used by the HTTP based index provider
- "8070"
volumes:
- ${HOME}/.ursa/:/root/.ursa/:rw
Makefile 수정
compose-up: 부분에서 명령어 뒤에 -d를 붙여 데몬 환경에서 실행하도록 합니다. 이렇게 하면 노드가 백그라운드에서 실행되어 다른 터미널을 열지 않고도 실행 중인 컨테이너의 로그를 확인할 수 있습니다.
compose-up:
docker-compose -f infra/ursa/docker-compose.yml up -d
두 개의 파일을 수정하고 저장한 뒤 아래와 같이 노드를 실행, 로그 확인, 노드 종료할 수 있습니다.
# 노드 실행
make compose-up
# 실행 중인 로그 확인
cd infra/ursa
docker-compose logs -f
# 노드 종료
docker-compose down