회사 중앙 스토리지가 멈추면 리소스를 다운 받을 수 없는 것을 대비해 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

 

728x90

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);
        }

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

728x90

 

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

 

728x90

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

 

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

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

 

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 업로드를 하고 저장하면 끝이다.

728x90

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

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

728x90

 

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

 

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

 

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

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

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

 

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

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

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

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

728x90

홈 디렉토리의 권한을 주려고 하는데 다른 사용자를 생성해서 들어가려고 하니 권한이 없어서 막힌다. 그렇다고 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의 하위 파일까지 소유자 및 그룹 변경

 

728x90

Navigator > Administration > Users and Privileges 선택하면 아래와 같이 나온다.(파란 밑줄 참조)

3번 Add Account를 클릭하면 아래 처럼 user의 정보를 입력하는 화면이 나온다.

 

user 이름과 Password를 입력한다. 단 패스워드가 조금 까다로워야한다. 대소문자와 특수문자, 숫자를 섞어야한다.

 

Limit to Hosts Matching 즉 호스트를 제한한다는 뜻인데 localhost면 원격지에서 접속을 할 수 없다.

Schema Privileges 탭에서 Add Entry...를 클릭하면 아래처럼 원하는 스키마를 선택할 수 있다.

 

그 후 해당 스키마의 권한을 체크를 한 후 Apply를 누르면 계정이 생성된다.

 

 

참고

https://dev.mysql.com/doc/workbench/en/wb-mysql-connections-navigator-management-users-and-privileges.html

 

MySQL :: MySQL Workbench Manual :: 6.2 Users and Privileges

6.2 Users and Privileges The Administration - Users and Privileges tab provides a list of all users and privileges that relate to an active MySQL server instance. From this tab, you can add and manage user accounts, adjust privileges, and expire passwords

dev.mysql.com

 

728x90

+ Recent posts