회사 중앙 스토리지가 멈추면 리소스를 다운 받을 수 없는 것을 대비해 IPFS를 구축하려고 한다. IPFS에 대한 자세한 설명은 검색해봤으면 한다.

 

1. 설치 

- 설치법은 사람마다 다양했다. 버전별로 달라지니 아래 링크를 참조하여 버전을 참고하기 바란다. 그리고 윈도우, 맥, 리눅스 설치법도 있으니 참고하기 바란다.

 

    1-1 바이너리 파일 다운로드

$ wget https://dist.ipfs.tech/kubo/v0.15.0/kubo_v0.15.0_linux-amd64.tar.gz

    1-2 파일 압축 해제

$ tar -xvzf kubo_v0.15.0_linux-amd64.tar.gz

> x kubo/install.sh
> x kubo/ipfs
> x kubo/LICENSE
> x kubo/LICENSE-APACHE
> x kubo/LICENSE-MIT
> x kubo/README.md

    1-3 kubo 폴더로 이동하여 설치 스크립트를 실행

cd kubo
sudo bash install.sh

> Moved ./ipfs to /usr/local/bin

    1-4 버전 테스트

$ipfs --version

> ipfs version 0.15.0

 

https://docs.ipfs.tech/install/command-line/#which-node-should-you-use-with-the-command-line

 

Command-line | IPFS Docs

Command-line Installing IPFS through the command-line is handy if you plan on building applications and services on top of an IPFS node. This method is also useful if you're setting up a node without a user interface, usually the case with remote servers o

docs.ipfs.tech

 

2.  저장소 초기화

ipfs init

> initializing ipfs node at /Users/jbenet/.ipfs
> generating 2048-bit RSA keypair...done
> peer identity: Qmcpo2iLBikrdf1d6QU6vXuNb6P7hwrbNPW9kLAH8eG67z
> to get started, enter:
>
>   ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme

맨 밑 줄 ipfs cat을 입력해보면 아래처럼 나온다.

ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/quick-start
Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you see this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|   This is alpha software. use at your own discretion! |
|   Much is missing or lacking polish. There are bugs.  |
|   Not yet secure. Read the security notes for more.   |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start     <-- usage examples
  ./readme          <-- this file
  ./security-notes

3. IPFS daemon 실행

ipfs daemon

> Initializing daemon...
> API server listening on /ip4/127.0.0.1/tcp/5001
> Gateway server listening on /ip4/127.0.0.1/tcp/8080

4. IPFS SERVICE 등록(서버 실행시 자동 실행)

    4-1 ipfs.service 파일 생성 및 서비스 정보 입력

sudo vi /etc/systemd/system/ipfs.service

ipfs.service

[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub
User=계정명

[Install]
WantedBy=multi-user.target

Service에서 User를 서비스 실행할 계정명으로 바꿔준다.

 

    4-2 실행 명령어 입력

sudo systemctl daemon-reload
sudo systemctl enable ipfs
sudo systemctl start ipfs
//정지
sudo systemctl stop ipfs
//동작상태확인
sudo systemctl status ipfs

 

5. 외부 설정

$ vi ~/.ipfs/config

초기에는 127.0.0.1로 되어있으며 로컬에서만 접속이 가능하다. 아래처럼 바꾸면 외부에서 접근이 가능하며 내부망으로도 변경 가능하다.

  "Addresses": {
    "API": "/ip4/0.0.0.0/tcp/5001",
    "Gateway": "/ip4/0.0.0.0/tcp/8080"
  },

- 127.0.0.1 : 로컬

- 0.0.0.0 : 외부 공개

-192.168.xxx.xxxx : 공유기 및 방화벽 내부망에서만 공개(할당 받은 로컬IP 입력)

 

6. WebUI

자신이 윈도우나 가상장치를 사용하여 개발하고 있다면 localhost:5001/webui 로 가능하다. 그런데 나는 우분투서버를 사용하고 있기 때문에 볼 수 없어서 외부 설정을 해서 외부IP로 들어온다. 들어가면 아래처럼 나온다.

 


6-1 에러

여기서 간혹 아래처럼 에러가 발생하는 경우가 있다. 아마 로컬에서 하는 사람들은 안나오는 것 같은데 나처럼 외부 접속으로 할 경우 생기는 것 같다.

나의 경우는 CORS 허용이 안되있는 것 같았다.

vi ~/.ipfs/config

  "API": {
    "HTTPHeaders": {
      "Access-Control-Allow-Headers": [
        "X-Requested-With",
        "Range",
        "User-Agent"
      ],
      "Access-Control-Allow-Methods": [
        "GET","POST"
      ],
      "Access-Control-Allow-Origin": [
        "http://외부IP:5001",
        "http://localhost:3000",
        "http://127.0.0.1:5001",
        "https://webui.ipfs.io"
        ]
    }
},

config 아래쪽에 잘찾아보면 API 가 비워져있다. 자신의 외부IP를 넣고 붙여넣기 해주고 서비스 재시작을 하면된다.

sudo systemctl restart ipfs

7. 기본 사용 포트 정보 (필요에 따라 공유기 및 방화벽에서 포트를 개방)

4001 : SWARM, ip4/0.0.0.0

40000+ : 4만번 이상 포트에서 SWARM 관련 포트가 생성됨

5001 : API, ip4/127.0.0.1

8080 : GATEWAY, ip4/127.0.0.1

 

 

 

https://docs.ipfs.tech/how-to/command-line-quick-start/#web-console

 

Command-line quick start | IPFS Docs

Command-line quick start If you're command-line savvy and just want to get up and running with IPFS right away, follow this quick-start guide. Please note that this guide assumes that you'll be installing Kubo, the reference implementation written in Go. T

docs.ipfs.tech

 

Custom Tab을 이용한 하이브리드 앱을 업로드 했는데 에러가 발생했다.

 

content.ActivityNotFoundException : No Activity found to handle intent ... 뭐라고 나왔다.

두번째 이미지를 봤을때 딱 봐도 최신 기기가 아닌 옛날 기기에서 에러가 발생했다.

그랬을 때 유추해볼 수 있는 건 그 기기에 내가 사용한 기능이 없을 것 같다.

우선 어떤 기능인지 알면 SDK 버전으로 분류하여 해당 기능을 대체하면 된다,

 

그렇지만 그 기능이 해당 기기에서 아예 사용할 수가 없다면 crush가 발생하지 않고 해당 기능을 사용할 수 없게 try-catch문으로 예외처리를 했다.

CustomTab을 사용하지 못하는 폰에서는 WebView를 사용하게 만들어놨다.

        try{
            CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
            CustomTabsIntent customTabsIntent = builder.build();
            customTabsIntent.launchUrl(this, Uri.parse(url));
        }
        catch (Exception e){
            Log.e("err : " , e.toString());

            mWebView = (WebView) findViewById(R.id.wv_main);

            webSettings = mWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);

            mWebView.setWebChromeClient(new WebChromeClient());
            mWebView.loadUrl(url);
        }

한국은 최신 기기들을 사용하니 스마트폰 테스트 때는 발생하지 않았었다. 업로드 하니 옛날버전도 다 테스트하다가 걸러진 것 같다.

 

WebView 와 CustomTab

 

Vue.JS로 개발된 프론트를 WebView로 노출하려고 했는데 페이지가 안뜨고 에러가 발생한다. 

 

그래서 Custom Tab으로 만들어보라고 해서 해봤다.

 

생각보다 간단한 코드인데 정확한 방법이 잘 검색이 안나왔다.

 

build.gradle(Module: 앱이름.app) 에 dependencies를 추가한다. 버전은 맨 아래 링크를 참조했으면 한다.

dependencies {
    ...
    implementation "androidx.browser:browser:1.3.0"
}

 

소스는 기본적으로 4줄이면 끝이다.

MainActivity.java

String url = "https://google.com/";
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

 

여기서 색상이라던지 작업 버튼을 구성을 하고 싶으면 바로 아래 링크를 확인하면 된다.

 

https://developer.chrome.com/docs/android/custom-tabs/integration-guide/#configure-the-color-of-the-address-bar

 

Implementation guide - Chrome Developers

Custom Tabs implementation guide

developer.chrome.com

https://developer.chrome.com/docs/android/custom-tabs/

 

Overview - Chrome Developers

An overview of Custom Tabs

developer.chrome.com

 

앱을 올리기 전에 앱 무결성이라고 서명 키를 보내야한다. 우선 안드로이드 스튜디오에서 키 생성부터 해보고 이후에 플레이 콘솔에 서명 키를 업로드 할 예정이다.

 

이 키는 굉장히 중요하기 때문에 잃어버리면 안됩니다.

잃어버리면 프로젝트에 다른 키로 서명을 하더라도 앱 업로드시 키가 달라서 업로드가 되지 않습니다. 주의하세요!

 

1. Build > Generate Signed Bundle/APK...  선택하면 아래 두 번째 사진처럼 나옵니다. 옛날에는 앱 업로드 할 때 APK로도 가능했는데 이제는 AAB(Android App Bundle)로만 올려야 합니다.

 

2. Key store path > Create new... 를 선택하면 아래처럼 나옵니다.

 

3. Key store path 를 설정합니다. 주소 선택하면서 key 이름도 같이 설정한 후 Password를 입력해줍니다.

 

4.Key 정보를 입력합니다. 여기서 Key에 대한 정보이기 때문에 중요합니다.

 

5. OK를 누르면 아래처럼 이전 화면으로 이동하고 키스토어 생성 때 입력했던 정보가 자동 입력됩니다. Key store password와 Key password가 다르니 유의 해주세요

 

이제 해당 주소에 키가 생성되어 있을겁니다. 그 키를 구글 플레이 콘솔에 올려야하지만 바로 올릴 수 없습니다.

 

6. 앱 업로드 하기 전에 서명 키 변경을 선택하고 다른 키 사용 > Java Keystore의 내보내기 및 업로드를 누르면 PEPK를 다운로드 한다.(PEPK 파일은 키 생성할때도 받을 수 있다.)

7. PEPK 파일을 Key store에 같이 둔다.

 

8. 위 이미지에 2. 코드를 복사한다. 중요한 건 keystore와 alias 이다. 여기서 자기 세팅으로 바꿔줘야한다. keystore는 자기 key 위치를 적고 끝에 파일명.확장자까지 해주면된다. alias는 아까 입력했던 별명을 써주면된다. 아래 코드를 참고하자

java -jar pepk.jar --keystore=C:\Users\94ona\Documents\Downloads\keystore\app_key.jks --alias=test --output=output.zip --include-cert --encryptionkey=eb10fe8f7c7c9df715022017b00c6471f8ba8170b13049a11e6c09ffe3056a104a3bbe4ac5a955f4ba4fe93fc8cef27558a3eb9d2a529a2092761fb833b656cd48b9de6a

 

9. 세팅이 완료됐으면 명령프롬프트 창을 열어서 keystore 위치로 간다.

cd C:\Users\94ona\Documents\Downloads\keystore

이 상태에서 세팅한 코드를 입력하면 store passwore와 alias password를 입력하면 keystore에 zip이 하나 생긴다.

 

앱 서명 환경설정에서 3. 생성된 ZIP 업로드를 하고 저장하면 끝이다.

앱스토어에 올렸는데 수정할 게 생겨서 다시 aab 파일을 업로드 했는데 버전코드는 이미 사용되었습니다. 다른 버전 코드를 사용해 보세요. 라고 나온다.

버전코드는 build.gradle (Module:앱이름.app) > android > defailtConfig >versionCode, versionName 를 변경한다.

 

나는 아래 이미지를 다 만들어야 하는 줄 알았다. 해상도별로 아이콘을 만들어야 하는 줄 알았다. 그런데 아니었고 가운데 들어갈 이미지만 필요한 거 였다.

 

앱을 어느정도 정리하고 아이콘 변경을 하러왔다.

 

1. 아이콘 이미지 준비한다. 나는 회사 이미지를 사용하지 않으니 대체 이미지를 만들었다.

참고 : 배경 없는 아이콘을 만들면 배경색도 마음대로 조절할 수 있고 크기도 더 정교하게 맞출 수 있다.

res > New > Image Asset를 선택한다.

 

2. Foreground Layer 에서 Path를 변경하여 아이콘으로 쓸 이미지를 불러온다. 불러오면 아래처럼 Preview에 미리보여주는데 각 아이콘에 맞게 Resize를 변경하여 맞춘다. 

3. Background Layer 에서 배경색을 변경한다. 위에 사진을 보면 Full Bleed Layers가 바탕색이 보인다. 그리고 이미지가 조금 작거나 크게 되면 자기 배경색이 아이콘과 조금 안 맞을 때가 있다. 그렇기 때문에 여기서 배경색을 아이콘 이미지 배경색과 맞춰주거나 아이콘의 배경색을 없애고 가져왔다면 여기서 원래 하려했던 배경색을 세팅을 해준다. 아래 이미지를 참고하자.

4. 이미지를 프로젝트에 불러왔다면 이젠 프로젝트에 적용을 시켜줘야한다.

Manifests > application > icon , roundIcon을 자신이 추가 했던 Name으로 변경한다.

홈 디렉토리의 권한을 주려고 하는데 다른 사용자를 생성해서 들어가려고 하니 권한이 없어서 막힌다. 그렇다고 777 권한을 줄 수는 없기 때문에 사용자 그룹을 만들고 디렉토리 소유를 사용자와 그룹으로 변경하고 하위 디렉토리까지 같이 바뀌는 걸 해봤다. (참고로 파일 권한 등에 대한 것은 다른 포스팅을 참조하길 바란다...)

 

그룹 생성

# groupadd 그룹명

그룹 비밀번호 설정

# gpasswd 그룹명

그룹 사용자 설정  ex) gpasswd -옵션 사용자명 그룹이름 

    옵션 : 

        A :  관리자

        a : 그룹 사용자 추가

        d : 그룹 사용자 제거

# gpasswd -A user group          관리자 지정
# gpasswd -a user group          사용자 추가
# gpasswd -b user group          사용자 제거

 

파일 / 디렉토리 접근 권한

# chmod 옵션 파일or디렉토리명

 

파일 / 디렉토리 소유 변경

소유자 또는 그룹을 한번에 변경 가능하다.

ex) chown 소유자 파일/디렉토리명

     chown 소유자.그룹명 파일/디렉토리명

     chown -hR(옵션) 소유자.그룹명 파일/디렉토리명

#chown user user.txt					user.txt 파일의 소유자 변경
#chown user.group directory				directory의 소유자 및 그룹 변경
#chown -hR user.group directory			directory의 하위 파일까지 소유자 및 그룹 변경

 

사용자 추가 - adduser

adduser를 사용할 경우 사용자의 홈디렉토리를 같이 생성하며 비밀번호 설정도 같이 한다.

# adduser 사용자명
# adduser guest1
Adding user `guest1' ...
Adding new group `guest1' (1001) ...
Adding new user `guest1' (1001) with group `guest1' ...
Creating home directory `/home/guest1' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for guest1
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y

사용자 삭제

- 홈 디렉토리는 같이 삭제가 안되서 찾아서 해봤는데 대부분 안된다.

 

사용자만 삭제 

# userdel -f 사용자명

홈 디렉토리 삭제

# rm -r 디렉토리명

 

+ Recent posts