'알아둘일'에 해당하는 글 223건

다들 블로그를 하는 이유가 다를 것이다.

나처럼 그냥 생각을 정리하듯, 그저 일기 식으로 하기도 하고,
또는 누군가는 상업적(마케팅?)으로 사용하기도 한다.

블로그 서비스도 많다.
국내는 네이버블로그, 다음(카카오? 여긴 아직도 있나?) , 티스토리
해외쪽은 워드프레스 , 구글 블로그스팟(예전에 다른 이름이었던것 같은데?) , 미디엄 등 많다.

난 개인적으로 설치형을 좋아했던것 같다.

초창기 텍스트큐브 로 시작했었던가? (이게 티스토리와 연관되었던 것 같은 기억이..)
그 후 텍스트큐브에서 티스토리로 이전한 후 그냥 정착한 것 같다.(귀찮은게 반 이상 이다.)

한때 블로그가 핫(?)했다가, 유튜브에 자리를 내준 것 같은 느낌이다.
물론 영상 과 텍스트는 느낌은 다르지만, 컨텐츠 생산의 관점에서는 비슷한 것 같다.

 

워드프레스 use Coolify

그중에 워드프레스를 coolify 를 이용해 설치해보자.
coolify 설치는 https://blog.1day1.org/717 로 대신하고 패스.

 

coolify + n8n 으로 자동화해보자 - 설치편 (feat. vultr)

최근 재미있는 것을 봐서 시도해보려고 한다.coolify 는 vercel / netlify 비슷한 서비스를 만들어주는 오픈소스라고 보면 된다. - 서비스로도 사용할 수 있지만, 셀프 호스팅으로 설치해보려 한다. -

blog.1day1.org

 

워드프레스를 얼마나 편하게(손쉽게?) 할 수 있는지 보여주려한다.

프로젝트를 이름을 정하고,

Environments 을 production 을 선택하고, Resources 를 +Add New Resource 선택해서 워드프레스 선택화면으로 넘어간다
그냥 클릭! 클릭! 으로 넘어가면 된다.

Coolify 에서는 3가지 항목이 있다.(W 라 맨 아래에 있다.) Mariadb / Mysql / No DB 중에 선택할 수 있다.

무난하게 Wordpress With Mysql 으로 해도 되고 Madiadb 로 해도 된다.(디비 있는 버전으로 )

어느 서버에 설치할 지 정한다. (localhost 가 대부분일 듯 하고, 원격서버도 등록했으면 원격서버도 가능)

서버를 설치하면 몇가지 설정을 한다.(연결할 도메인을 설정하는 정도면 끝)
연결할 도메인은 서버 설치하는 위치의 IP 주소로 미리 세팅해놓는다.

위 설정에서 암호 등은 기본값으로 자동 세팅되니, 따로 수정하지 않아도 된다.

 

모든 설정이 완료되면, Deploy 하면 설치된다.

설치 후 설정한 도메인으로 접속하면, 워드프레스 세팅화면을 볼 수 있다.(이후 세팅은 생략)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

Mac OS 세쿼이아 업그레이드 했다. Xcode 16으로 업그레이드 했다.

별다른 이슈가 없는 듯 했는데, iOS 빌드 후 testflight 업로드 하려니 이슈가 발생하였다.

*** Error: [ContentDelivery.Uploader.600000068240] Asset validation failed (90482) Invalid Executable. The executable 'Runner.app/Frameworks/AdFitSDK.framework/AdFitSDK' contains bitcode.

target build 버전 등의 차이로 인한 듯 한데. adFit SDK 쪽에서 처리해줘야 하나? 따로 직접 해결할 수 있나?

예전 비슷한 이슈인가? 다른 이슈? https://devtalk.kakao.com/t/appstore-minimum-os-version/135747

 

[AppStore] 테스트플라이트 아카이브 안됨(minimum OS Version 관련)

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요. 현재 사용 SDK 버전 - 2.21 제가 현재 엑스코드에서 테스트플라이트를 위해 아카이브를 했는데 아래와 같은 에러가 계속 뜹니

devtalk.kakao.com

메시지는 동일한 것은 아닌데, 빌드시 버전 이슈를 본것 같아서 일단 정리.

다른 정확한 해결책을 찾아보는 중.

관련이슈 2 - https://developer.apple.com/forums/thread/764576

 

Invalid Executable. The excecutabl… | Apple Developer Forums

After upgrading to XCode 16, while uploading apps to app store, it's throwing below error and not letting me upload it. It's iOS app. Please help. Invalid Executable. The excecutable ......app/Frameworks/hermes.framework/hermes contains bitcode.

developer.apple.com

역시나 SDK 쪽에서 지원해줘야 하나...

 

[해결책] bitcode 에러 조치 - Xcode 16

관련이슈 3 - https://medium.com/@hyosing92/ios-bitcode%EC%99%80-%EA%B4%80%EB%A0%A8-issue-4643dc841af7

 

[iOS]Bitcode와 관련 Issue

Bitcode 관련 이슈와 왜 deprecate되었을지

medium.com

위 글 내용상 - 직접 bitcode 를 제거해줘야 하는 듯 하다.

ios/Podfile

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == 'AdFitSDK'
      `xcrun --sdk iphoneos bitcode_strip -r Pods/AdFitSDK/Frameworks/AdFitSDK.framework/AdFitSDK -o Pods/AdFitSDK/Frameworks/AdFitSDK.framework/AdFitSDK`
    end

  end
end

본인의 코드중 에러나는 위치를 확인한다. 내 경우는 아래 경로.

Pods/AdFitSDK/Frameworks/AdFitSDK.framework/AdFitSDK

(SDK 종류마다 해당 위치가 차이가 난다 - Pods 에서 해당 경로 확인)

실제 동작은 체크해봐야겠다. Xcode > Product > archive 로 확인해보니

에러 메시지는 사라졌다. 아래의 경고메시지가 거슬르긴 하지만, testflight 로 업로드는 된다.

실제 내부테스트 배포가 되는지 체크해봐야 겠다. (위 경고 메시지 제거방법은 따로 체크)

...

내부테스트 정상 배포되었다. - 일단 긴급 이슈는 해결

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난번 글에 coolify 를 로컬 뿐 아니라, 원격서버에도 세팅을 할 수 있다.  https://blog.1day1.org/724

 

coolify 로 원격 서버를 활용해보자 (multi server)

지난 coolify 관련 글은 로컬서버에 설치하는 방법이었다. https://blog.1day1.org/717 coolify + n8n 으로 자동화해보자 - 설치편 (feat. vultr)최근 재미있는 것을 봐서 시도해보려고 한다.coolify 는 vercel / netlify

blog.1day1.org

그런데, 빈(초기화된) 서버가 아니라, 이미 운영중인 서버에 세팅하려고 할 때 주의할 점을 정리한다.

테스트로 벌쳐(vultr)에서 우분투 / 센토스 등 가상서버 (초기화) 세팅 후 원격서버 적용해봤다.
빈 서버는 별 이상없이 잘 세팅 된다. OS 버전별로도 잘 적용해준다. ( apt , yum 등 다른 환경을 잘 처리해주는 듯 하다)

뜬금 광고 시간.(아래 링크로 최초 가입하시면 300$의 크레딧 -30일내사용- 을 받아서 사용해 볼 수 있습니다.)

30일동안 사용해보고 괜찮으면 연장해서 사용하면 좋을 듯 하다.

 

현재의 나의 환경은?

우분투 서버에 nginx 를 사용하여 웹서버로 운영중이다. 사용중인 포트는 80 포트와 443 포트 두개를 사용한다.
그런데, coolify 원격서버로 세팅하려고 하면, proxy 설정 부분에서 아래와 같은 에러가 나면서 완료가 되지 않는다.

coolify 는 80 / 443 포트를 사용하기 때문에 nginx 가 이미 해당 포트를 사용하고 있어서 에러가 나는 것이다.

어떻게 nginx 를 사용하면서 coolify 원격서버로 활용할 수 있나요?

먼저 원격서버의 nginx 포트를 바꿔준다. (아래와 비슷할 것이다.) 기존 https 포트인 443 을 8443 으로 변경했다.

cat /etc/nginx/sites-enabled/your-site.conf

server {
	server_name your-site.com;
  	...
	...
  
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/your-site.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/your-site.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
  
}

포트 변경 : 443 => 8443
server {
	...
    listen 8443 ssl; # managed by Certbot
    ...
}


변경 후 nginx 재시작

systemctl restart nginx

위처럼 80/443 포트를 사용하는 관련된 nginx 설정을 변경해주고, nginx 를 재시작 해준다.

coolify 관리페이지의 Server => Proxy 부분에서 (실패 지점)  일단 Proxy 서버를 Caddy 로 바꿔준다.

Caddy 를 이용해서 기존 웹서버 경로(도메인)로 우회(변경) 하는 설정을 할 것이다.

웹서비스 사용자 => nginx (80/443)

의 흐름으로 접속하게 되는데, 이를 coolify (caddy) 가 받아서 변경된 nginx 포트로 넘겨주는 설정을 해준다.

웹서비스 사용자 => coolify,caddy(80/443) => nginx (8080/8443)

 

Coolify 에서 Caddy 설정을 해준다.

coolify 관리메뉴 Server => Proxy 메뉴에서 Dynamic Configurations 에서 설정을 해준다.

파일명은 임의로 해준다. Configuration 부분에 본인에 맞게 설정을 해준다.

http://your-site.com {
    redir https://your-site.com
}
https://your-site.com:443 {
    reverse_proxy https://your-site.com:8443
}

예시를 간단하게 설명하면,
첫번째 블록은 http(80) 포트로 접속하는 주소를 https(443) 으로 변경해주는 설정이다.
두번째 블록은 443 포트로 접속하는 주소를 위에서 nginx 변경한 포트(8443)로 우회하도록 하는 설정이다.

redir 과 reverse_proxy 의 차이점은
브라우저 URL 주소부분을 redir 은 아예 변경을 해주고,
reverse_proxy 는 주소 변경 없이 8443 으로 요청한 결과값을 443 으로 보내주는 역할을 한다.

caddy 관련 상세한 설정은 caddy 사이트에 잘 설명되어 있다. https://caddyserver.com/docs/caddyfile/directives/redir

 

Caddy - The Ultimate Server with Automatic HTTPS

Caddy is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go

caddyserver.com

caddy 설정 살펴보면, 기존 nginx 기능을 모두 할 수 있는 듯 하다. 즉, nginx 를 대체할 수도 있으니, 설정을 살펴보고 적용해도 된다.

내 경우는 coolify 원격서버 용도를 계속 사용할지 불확실해서, 한서버에 nginx/coolify 를 같이 운영하기로 했다.
또는 기존 nginx 로 세팅했던 사이트를 coolify 도커 기반으로 바꾸는 것도 재미있을 듯 하다.(이 부분도 하게 되면 별도 포스팅으로 )

 

[추가 - feat. certbot]

위 설정을 하게 되면, 기존 nginx 에 certbot 이 설정된 경우 80 port 로 접속이 안되어 certbot renew 가 실패하게 된다.

http://your-site.com {
    reverse_proxy http://your-site.com:8080
}
https://your-site.com:443 {
    reverse_proxy https://your-site.com:8443
}

기존 caddy 설정을 80 => 8080 / 443 => 8443 으로 처리되도록 해준다.

그리고, certbot 이 80 대신 8080 으로 접속이 가능하도록 renewal 세팅에 다음 항목을 추가해준다. https://blog.1day1.org/711

 

letsencrypt 를 좀더 활용해보자. (feat. post_hook)

letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.간단한 사용법은 https://blog.1day1.org/657 에서 확인. letsencrypt 초간단 설치 in ubuntu , nginx (feat. certbot)https 를 사용하는 것은 옵션이 아니

blog.1day1.org

# Options used in the renewal process
[renewalparams]
...
http01_port = 8080
...

renewal 시에 8080 으로 접속하여 SSL 인증서를 체크할 수 있도록 해줘야 정상적으로 갱신된다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난 coolify 관련 글은 로컬서버에 설치하는 방법이었다. https://blog.1day1.org/717

 

coolify + n8n 으로 자동화해보자 - 설치편 (feat. vultr)

최근 재미있는 것을 봐서 시도해보려고 한다.coolify 는 vercel / netlify 비슷한 서비스를 만들어주는 오픈소스라고 보면 된다. - 서비스로도 사용할 수 있지만, 셀프 호스팅으로 설치해보려 한다. -

blog.1day1.org

coolify 는 로컬서버 뿐 아니라, 원격지 서버를 등록해서 앱을 배포해서 사용할 수 있다.
서버 사양을 분산하거나, 프로젝트별로 분리해서 관리하는 등 여러가지 이유로 원격서버에 설치할 필요가 생긴다.
서버는 여러개가 될 수 있지만, 전체를 coolify 에서 통합관리하기에 불편하지는 않다.

원격서버는 클라우드 서버일 수도 있고, 리얼서버일 수도 있다. 인터넷 접속할 수 있다면 모두 등록 가능하다.
원격서버 등록은 크게 어렵지는 않다. 단, 원격접속 설정 한가지만 사전 등록해준다.

coolify 가 원격서버에 접속할 수 있도록 ssh key 등록을 해준다.(아래 이미지의 localhost's key )

ssh key 를 원격지서버에 등록해준다.

어떤 key 를 등록해줘야 하는가? (publick key 등록)

coolify 의 Keys & tokens 메뉴에서 아래 이미지의 표시한 부분에서 Public Key 를 복사한다.(아래는 일부지만, 전체를 복사)

원격지 서버에 접속해서 .ssh/authorized_keys 에 해당 Public Key를 입력해준다.

형식은 아래와 비슷한데, 맨끝의 coolify 는 구분용으로 임의로 입력한 값이다.

# cat .ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5A-퍼블릭키값-NDZbYm-전체-AuLg3 coolify

사전 준비는 끝. (coolify => remote 접속이 가능하면 OK)

주의!!

다음 진행하기 전에 원격서버가
웹(80/443 포트)서버로 이미 사용중이라면 정상설치가 안될 수 있다.

 

원격 서버에 도커엔진 설치하기

위 Validate Server & Install Docker Engine 버튼을 클릭하면,
서버에 접속가능한지 체크하고, 필요한 도커관련 설치를 한다.

특별한 이상이 없다면, 위처럼 단계가 처리된다.

원격 서버를 등록한 후에는 coolify 앱 등록 / 배포등을 진행하면 된다.

Products => Resources => (앱 또는 서비스) => [서버선택시 등록한 원격 서버 선택] => Configuration => Deploy

위와 같은 단계로 진행하는데, 중간단계에 설치/배포할 서버를 원격지 서버로 선택하면 된다.

 

[활용방안]

이 작업을 하는 이유는 기존의 단독으로 운영되는 스프링프로젝트 서버가 있다.
접속이 많을 때 서버가 다운되는 현상이 있어서 어떻게 조치할 까 생각중인데, 스프링앱을 일부 분리해서 도커에 올려 부하 분산을 할려고 구상중이다. 접속이 많은 현상이 항상 그런 것이 아니라, 간헐적으로 나타나기 때문에 앱을 신규 등록 했다가 다시 삭제 하는 형태로 유동적으로 운영할려고 한다.

 

[추가]

혹시 위 원격서버 등록시 다음과 비슷한 에러를 만난 경우

기존에 nginx 로 80/443 포트를 사용하던 원격서버에 세팅하는 경우 위와 같은 에러를 만나게 된다.
관련 조치는 nginx 설정을 다른포트(8080/8443 등)로 바꾸고 coolify 쪽에서 proxy 설정을 연동해줘야한다.
즉, coolify 가 80 / 443 포트를 컨트롤 하도록 해줘야 한다. 이 부분은 별도로 포스팅 하도록 하겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난번 네이버 스팸은 어떻게 사용자의 계정정보를 탈취하는지 설명했었다. https://blog.1day1.org/714

 

여전히 네이버 스팸은 교묘하구나.

네이버 메일을 보다가 눈에 띄는 메시지가 보인다.캡쳐는 PC 에서 했는데, 모바일에서는 보낸사람에 "금융위원회" 까지만 보인다. 그렇다 보니 아차하면 클릭하게 된다.클릭하면 이렇게 나온다.

blog.1day1.org

정부기관 메일로 오면 자칫하다가는 함정에 걸리게 된다. 무심코 암호 입력하면 바로 털리게 된다.

지난번 스팸이후 1달정도 지났는데, 또 메일이 왔다.

핸드폰에서 확인하면 더 눈치채기가 어려울 수 있다.

"확인하러 가기" 버튼은 가급적 누르지 않는것이 좋다.
보통 무작위로 이런 메일을 뿌리는데(없는 계정도 보내게 된다) ,
"확인하러 가기" 클릭하면 오! 이 계정은 사용하는 계정이구나! 라고 알려주는 것이 된다.

 

# 어떻게 조심할 수 있나?

메일 서비스의 보낸이의 주소를 확인하는 것이 좋다.

주소를 보면, 행정안전부는 확실히 아닌것 같다.
더욱 교묘한 스패머는 물론 저 주소도 그럴듯한 주소로 보냈을 텐데, 이 스패머는 초짜인듯 싶다.

암튼, 이 방법으로 체크할 수 있다.

 

테스트를 위해 "확인하러가기" 버튼을 클릭해봤다.

예전에는 네이버 로그인 하는 창이 떴었는데, 뭔가 다른 메지시가 나온다.

왠지 호스팅하는 곳에서 블락을 한 것 같기도 하다.(신고가 들어가서 그럴 수도 )
운이 좋으면 위와 같이 호스팅업체에서 거를 수도 있겠지만, 조심하지 않으면 아래처럼
무의식 중에 암호넣고 로그인해서 계정이 탈취가 될 수 있으니 항상 주의해야 한다.

네이버 메일로 오고 네이버 계정 탈취를 위한 이슈이니, 네이버 측에서 필터링 조치를 할 수도 있을 듯 한데
네이버쪽에서 얼마나 신경을 쓰고 있을지는 모르겠다.(어차피 메일은 돈도 안되니 무심할지도...)

그러고보니, 몇년전 조금더 교묘했던 스팸메일도 있었다. https://blog.1day1.org/639

 

네이버 피싱메일 조심하세요.

오늘 이런 메일이 왔다. 공식적인 네이버 메일인 줄 알았다. 그래서, 메일 내용대로 스팸을 보냈다면, 메일 계정(암호)이 털렸나 생각했다. 암호 바꿔야지 생각하던차 자세히 보니 이상했다. 일

blog.1day1.org

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

nestJS 공부를 하면서, 디비는 postgres 를 사용하고 있다. https://blog.1day1.org/720

 

coolify - Github App 을 사용해서, git push 하면 자동 배포하자

지난글에 nestJS 앱을 dockerfile 을 사용해서 배포하는 방법을 정리했다. https://blog.1day1.org/719 coolify 를 사용해서 nestJS + postgres 앱을 배포해보자coolify 를 써보다 보니 재밌다.처음이라 좀 헤맨 부분

blog.1day1.org

 

한동안은 postgres 를 사용할 듯 하다.

관련 필요한 명령등을 정리해본다.

일단 설치부터.

# https://www.postgresql.org/download/macosx/

 

PostgreSQL: macOS packages

macOS packages You can get macOS PostgreSQL packages from several sources. Interactive installer by EDB Download the installer certified by EDB for all supported PostgreSQL versions. Note! This installer is hosted by EDB and not on the PostgreSQL community

www.postgresql.org

해당 부분에서 다운로드 해서 설치 - 설치는 무난하니 패스.
(혹시 기존 brew install postgresql 이 있었는데, 혼동될까봐 brew 패키지는 삭제했다.)

 

# .bash_profile / .zshrc 명령 path 등록.

# postgresql 16
export PATH="/Library/PostgreSQL/16/bin:$PATH"

 

# 맥OS 터미널에서 관리하는 주요 명령들

디비 서버 상태 보기

# sudo -u postgres pg_ctl -D /Library/PostgreSQL/16/data/ status

pg_ctl: server is running (PID: 83175)
/Library/PostgreSQL/16/bin/postgres "-D" "/Library/PostgreSQL/16/data"

디비 서버 중지 / 실행

$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/16/data/ stop

waiting for server to shut down.... done
server stopped

$ sudo -u postgres pg_ctl -D /Library/PostgreSQL/16/data/ start

waiting for server to start....
2024-09-08 23:43:17.987 KST [83267] LOG:  redirecting log output to logging collector process
2024-09-08 23:43:17.987 KST [83267] HINT:  Future log output will appear in directory "log".
 done
server started

 

반응형

그외 주요 명령들

데이터 입력 / 테이블 관리 등등.

... 계속 정리...

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난글에 nestJS 앱을 dockerfile 을 사용해서 배포하는 방법을 정리했다. https://blog.1day1.org/719

 

coolify 를 사용해서 nestJS + postgres 앱을 배포해보자

coolify 를 써보다 보니 재밌다.처음이라 좀 헤맨 부분이 있지만 ... 익숙해지면 정말 편해질 것 같다세팅하려는 대략적인 흐름도는 아래와 같다 # Docker - nestJS 부분projects 메뉴에서 새프로젝트를

blog.1day1.org

그런데, dockerfile 내에서 git clone 으로 소스를 가져와서 하는 방법이다보니, github webhook 를 처리하기 어려운 부분이 있다.

그래서 coolify 에서 github app 을 세팅해서 사용하는 방법을 사용하기로 한다.

# coolify 프로젝트 ( + New Resource )

with GitHub App 으로 선택한다.

처음에는 +Add GitHub App 으로 앱등록을 해준다.(해당 방법은 아래에 따로 설명)

등록된 앱을 선택하고, Load Repository 를 하고, Build Pack 을 Dockerfile 으로 선택하고 다음으로 넘어간다.

기존에 봤던 설정화면 - 본인에 맞는 입력사항을 입력하고 Save

이전 글의 Dockerfile 이 차이가 있는데,
그 부분은 아래 깃허브 앱 등록 부분을 정리 후에 마지막에 설명한다.

 

반응형

# GitHub App 등록

Create a new Application 에서 +Add GitHub App 를 클릭하거나,
Coolify 좌측메뉴의 Sources 메뉴를 들어간다.(+Add)

적당한 이름을 입력하고, Continue ..

Webhook Endpoint 부분에 github 쪽에서 접근가능한 URL 을 선택하고, Regiser Now

깃허브로 이동한다. ( 앱을 생성하는 절차 )

다시 coolify 로 이동해서, Install Repositories on GitHub  를 클릭한다.(세부 정보 입력으로 이동)

그러면 다시 깃허브로 이동해서 세부적인 설정을 하게 된다.

본인 깃허브 계정의 전체 저장소 또는 프로젝트를 선택할 수 있다. (Install 으로 Github App 을 생성한다.)

다시 coolify 로 이동하면, 설정된 앱을 확인할 수 있다.(아래에서 따로 추가 설정할 것은 없고, 완료 화면)

해당 App 등록이 완료되면,  초기에 Create a new Application 부분에 해당 앱이 나오게 된다(선택하여 다음 진행)

 

# Dockerfile 설정.(깃허브 프로젝트 소스내에 포함)

예전 글(https://blog.1day1.org/719)에는 Dockerfile 내에 git clone 으로 소스 다운로드하는 형태였는데,
Github App 연동 방식은 저장소를 연결해서 소스에 접근할 수 있어, 다운로드 단계를 제거 한다.

# 빌드 스테이지
FROM node:22 AS builder

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# pnpm 설치
RUN npm install -g pnpm

# 모든 소스 파일 복사
COPY . .

# 의존성 설치
RUN pnpm install

# 앱 빌드
RUN pnpm run build


# 프로덕션 스테이지
FROM node:22-slim

# 작업 디렉토리 설정
WORKDIR /app

# pnpm 설치
RUN npm install -g pnpm

# 빌드 스테이지에서 필요한 파일들만 복사
COPY --from=builder /usr/src/app/package*.json ./
COPY --from=builder /usr/src/app/pnpm-lock.yaml ./
COPY --from=builder /usr/src/app/dist ./dist

# 프로덕션 의존성만 설치
RUN pnpm install --prod


# 프로덕션 모드로 실행
CMD ["pnpm", "run", "start:prod"]

# 포트 설정 (NestJS 기본 포트는 3000)
EXPOSE 3000

도커의 이미지 빌드시 두단계를 거치도록 분리했다. (multi-stage 빌드 라고 하는 듯 하다.)

빌드 단계 + 프로덕션 단계.  코드가 복잡하지는 않아 쭈욱 한번 보면 파악이 될 것이다.

 

깃허브 webhook 설정해서 git push 하면 자동으로 배포하게 되도록 설정한다.
일단 여기까지... webhoook 설정은 다음에...

Github App 방식으로 하니, 따로 webhook 설정 안해도 되네. 패스... 끝.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

coolify 를 써보다 보니 재밌다.

처음이라 좀 헤맨 부분이 있지만 ... 익숙해지면 정말 편해질 것 같다

세팅하려는 대략적인 흐름도는 아래와 같다

 

# Docker - nestJS 부분

projects 메뉴에서 새프로젝트를 만들어 준다.

적당한 이름을 입력하고, continue ( New Resource )

여러 방법이 있지만, Dockerfile 방법으로 하도록 한다.

중간 부분의 git clone 본인의 프로젝트소스를 가져오도록 한다.

# 베이스 이미지로 Node.js 사용
FROM node:22

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# git clone
RUN apt-get update && apt-get install -y git

RUN git clone https://github.com/your-account/nestjs-practice-netflix .

# pnpm 설치
RUN npm install -g pnpm

# 의존성 설치
RUN pnpm install

# 앱 빌드
RUN pnpm run build

# 프로덕션 모드로 실행
CMD ["pnpm", "run", "start:prod"]

# 포트 설정 (NestJS 기본 포트는 3000)
EXPOSE 3000

프로젝트에 접속할 주소를 적절하게 적어준다.

저장(Save) 한 후 deploy 하면 도커이미지를 만들어주고, 앱이 실행된다.

반응형

# 디비 postgres 부분

내가 테스트 한 프로젝트는 postgres 를 사용하기에 DB도 세팅해준다.

프로젝트에서 ( New Resource ) 로

PostgreSQL 을 선택해준다.

PostgreSQL 16 을 선택해줬다.

세팅에 암호를 정해준다.

중간 부분의 Postgres URL (internal) 으로 접속할 것이니, 해당 값을 nestjs 에서 사용할 것이다.
DB 를 Start 해준다.

 

그리고, 다시 nestJS 설정으로 와서.

위 처럼 설정값을 적어준다.
(DB_HOST 부분의 값이 - Postgres URL (internal) 에 있던 주소)

프로젝트에 따라 저 환경변수 값이 다를 수 있으니, 본인의 프로젝트에 맞게 수정해준다.

프로젝트를 Deploy 한다. 이미 프로젝트를 Deploy 했다면, Restart 해주면 입력한 설정값이 적용된다.

이제 프로젝트가 동작하는지 확인해본다. (정상적으로 응답된다)

 

아마도 다음 단계는 프로젝트 수정하고 git push 하면
자동으로 coolify 에서 자동 빌드 + 재배포 하는 프로세스를 만들어 봐야 겠다.

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난글에 설치를 해봤다. https://blog.1day1.org/717

 

coolify + n8n 으로 자동화해보자 - 설치편 (feat. vultr)

최근 재미있는 것을 봐서 시도해보려고 한다.coolify 는 vercel / netlify 비슷한 서비스를 만들어주는 오픈소스라고 보면 된다. - 서비스로도 사용할 수 있지만, 셀프 호스팅으로 설치해보려 한다. -

blog.1day1.org

설치는 비교적 큰 이슈 없이 완료했다.

이제 본격적인 n8n 사용을 해보려고 하는데.

처음부터 장벽을 만났다. 흔한 예제인 youtube transcript 를 해보려는데.

에러를 만나 버렸다.

[YoutubeTranscript] 🚨 Transcript is disabled on this video ....

 

당장 에러 붙들고 있을 여유는 없어, 다음 기회에 다시 봐야 겠다.

대신 Coolify 를 사용한 자동 배포 쪽을 더 파봐야 겠다.
(현재 nestJS 공부중인데, 관련 배포를 사용해보려 한다 - docker 배포)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

최근 재미있는 것을 봐서 시도해보려고 한다.

coolify 는 vercel / netlify 비슷한 서비스를 만들어주는 오픈소스라고 보면 된다.
 - 서비스로도 사용할 수 있지만, 셀프 호스팅으로 설치해보려 한다.
 - https://coolify.io/self-hosted

n8n 은 자동화(노코드 툴?)에서 자주 언급되는 make / zapier 같은 서비스를 만들어 주는 오픈소스
 - 역시 이것도 셀프 호스팅으로 https://docs.n8n.io/hosting/

일단 목표는 n8n 으로 블로그 자동포스팅에 적용해보고자 한다.
이 블로그에 글을 올릴지, 별도의 다른 블로그로 할지는 모르겠다.

설치 자체는 가이드 따라서 하면 그리 어렵지는 않아 보이지만,
어느 정도 사양이면 제대로 사용할 수 있을지 실제로 돌려봐야 겠다.(coolify 는 최소 2G / 2 CPUs 정도면 된다고 하지만...)

vultr 에 설치해서 돌려봐야 겠다.
뜬금 광고 시간.(아래 링크로 최초 가입하시면 300$의 크레딧 -30일내사용- 을 받아서 사용해 볼 수 있습니다.)

30일동안 사용해보고 괜찮으면 연장해서 사용하면 좋을 듯 하다.

 

coolify + n8n 의 설치까지는 별 무리는 없어 보이지만, n8n 실제 사용은 또 다른 영역(노코드툴)이니 좀 헤맬지도 모르겠다.

#이제 본격적인 설치시간

월 비용은 대략 22달러 정도 될 듯 하다.

OS를 뭘로 할까? 기본 ubuntu 를 할까, Docker(on ubuntu) 로 할까 등등 살펴 보다보니, 어!

기본 설치되어 있는 이미지가 있네요.(유명해서 그런지. 이미 있군.)

살짝 고민, 설치부터 해볼까. 그냥 설치된 거 쓸까...
고민좀 해보고 다시 찾아오겠습니다.


[추가]

다시 돌아왔다, 그냥 설치된 버전으로 해보기로 했다.

vultr 관련 선택하고 Deploy 한 후 기다리면, 접속할 수 있다.

1. 기본 {서버IP}:8000 로 접속하면 된다.
2. 처음 접속하면 관리계정 등록을 하면 된다.
3. 그러면 coolify 관리화면으로 접속된다.

그냥 아이피로 접속해서 해도 되지만, 뭔가 세련되지 않은 듯 하다.

도메인을 연결해본다.

본인이 가지고 있는 도메인을 연결하면 된다.

SSL 인증서는 어디서 세팅하나 했는데, 자동으로 세팅해주는 듯 하다. (letsencrypt 를 사용한다)

Save 하고 설정한 도메인으로 재접속해서 사용하면 된다.

.

.

이제 n8n 을 설치해보자.

Projects 의 메뉴에서 +Add 로 적당한 이름을 적어준다.(다음 다음 넘어가면 된다)

production 클릭

+Add New Resource 클릭

이제 본격적인 패키지 선택

git 소스를 가져올 수도 있고 / Dockerfile 등 도커이미지를 사용할 수도 있고 / 데이터베이스를 설치할 수도 있다.

아래 부분에 Services 에서 검색한다. N8N 을 선택한다.( 그외 여러가지 유명한 서비스들이 있다)
최근 관심중인 supabase 도 보인다(이것도 해볼 예정)

n8n 을 선택한 후 다음 처럼 세팅한다.(도메인 세팅만 하면 된다)

적당한 서비스 이름 너히고, 도메인 넣고, Deploy 해준다 (좀 시간이 걸린 후 )
deploy 가 완료되면 다음처럼 바뀐다.

메뉴의 Links 에 설정한 도메인을 클릭해서 들어간다.

짠! (여기도 처음 접속시 관리계정 설정 하고 들어가면 된다)


[참고]

처음 에 다음 세팅을 How big is your company? 를 20 이하로 하면, 아래 설정창이 계속 나온다.
(뭔가 버그인 듯 하다. 아래처럼 20-99 로 해줬다)

 

이제 본격적인 n8n - 노코드 자동화를 설정해봐야 겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

certbot 을 주기적으로 renew 한 후 , 인증서가 갱신되면 post_hook 으로
새로운 SSL 인증서 .pem 을 Spring Project 의 .pfx 로 변환하고, 스프링 프로젝트를 재실행 해주는 코드가 필요하다.

지난글의 https://blog.1day1.org/712 에서 언급한 pem => pfx 변환 코드를 좀더 개선했다.

 

스프링 프로젝트에 letsencrypt 인증서를 사용해보자 ( feat. pfx / PCKS12)

지난글에 이어 https://blog.1day1.org/711 스프링 프로젝트에 .pem 인증서를 사용해보자. letsencrypt 를 좀더 활용해보자. (feat. post_hook)letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.간단한

blog.1day1.org

개선한 코드는 letsencrypt의 pem 인증서의 날짜와 변환한 pfx 날짜를 비교해서 변환할지 체크하는 코드를 추가했다.

# cat lets-pem2pfx.sh 
#!/bin/bash

if [ "$2" == "" ]; then
	echo "Usage) $0 {domain} {out-dir/out-file.pfx} {convert-now}";
	exit;
fi

out_dir=$PWD
domain=$1
out_file=$2
convert=$3

password=124345

######
lets_dir=/etc/letsencrypt/live

if [ "$convert" == "convert-now" ]; then
	echo 
else
	certbot certificates --cert-name $domain
fi
ls -al $lets_dir

cd $lets_dir/$domain

# file mtime check.
echo 
echo -n "Origin: "
echo `date +%s%N --reference cert.pem`
echo " "`date  --reference cert.pem`
echo 
echo -n "Target: "
echo `date +%s%N --reference $out_dir/$out_file`
echo " "`date  --reference $out_dir/$out_file`
echo 
if [ "cert.pem" -nt "$out_dir/$out_file" ]; then
	printf '%s\n' "cert.pem is newer than $out_dir/$out_file : need to update new"
else
	printf '%s\n' "cert.pem is older than $out_dir/$out_file"
	echo "No action";
	echo
	exit 122 # fail code ( 0~256 )
fi


if [ "$convert" == "convert-now" ]; then
	openssl pkcs12 -export \
	 -out $out_dir/$out_file \
	 -inkey privkey.pem -in cert.pem -certfile chain.pem \
	 -passin pass:$password -passout pass:$password
	echo "Convert Done";
	ls -al $out_dir/$out_file;
fi

exit 200;
# end file

위 코드를 기반으로 renew 시에 post_hook 에서 처리할 스크립트는 다음과 같다.

# cat renewal-ssl-restart.sh 
#!/bin/bash

readlink=$(readlink -f $0)
dirpath=$(dirname $readlink)


echo 
echo `date`
echo $dirpath;
cd $dirpath;

# convert pem 2 pfx - renewal pem
bash lets-pem2pfx.sh your-domain.com ssl/your-domain.com.pfx convert-now
retCode=$?

if [ "$retCode" == "200" ]; then
	echo "convert-done - do action"

	# restart - tomcat
	echo "Shutdown..."
	shutdown.sh
	sleep 5

	echo "Start up..."
	startup.sh
fi

letsencrypt 의 인증서가 갱신이 되면 post_hook 으로 해당 코드를 실행하여,
pem => pfx 변환 / 스프링프로젝트 재실행 해준다. 위 프로젝트 재실행 코드는 본인에 맞게 수정하여 쓴다.

해당 코드를 콘솔에서 실행까지 테스트 한 후에 /etc/letsencrypt/renewal/yourdomain.conf 의 post_hook 에 넣어준다.

# Options used in the renewal process
[renewalparams]
authenticator = nginx
installer = nginx
account = af93d65834vadv37436bddsfh092ad2a
manual_public_ip_logging_ok = None
#pre_hook = systemctl stop nginx
post_hook = systemctl restart nginx ; bash /root/bin/renewal-ssl-restart.sh >> /var/log/nginx/renewal_ssl_restart-$(date +\%Y-\%m-\%d).log
server = https://acme-v02.api.letsencrypt.org/directory

다음 명령으로 테스트 해본다.

certbot renew --cert-name your-domain.com --dry-run

테스트 명령 후에 혹시 이런 에러가 보일 수 있다.

renewal-ssl-restart.sh >> /var/log/nginx/renewal_ssl_restart-$(date +\%Y-\%m-\%d).log
Error output from post-hook command systemctl:
Another instance of Certbot is already running.

해당 bash 코드에 certbot 확인하는 코드가 있었는데, 해당 코드를 post_hook 에서 실행되지 않게 고쳐줬다.(아래 부분이 고친 코드)

if [ "$convert" == "convert-now" ]; then
	echo 
else
	certbot certificates --cert-name $domain
fi

위 코드는 인증서 확인용 코드인데, 없어도 무방하니 해당 부분 지워도 된다.

테스트 까지 완료했다면, 이제 기다리면 된다.

 

내가 쓰고 있는 인증서는 30일정도 후에 업데이트 될 듯 하다(잘 되길...)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

처음 DB를 접한것은 학생이던 시절(?) 오라클이었던가
어떤 서버에 접속해서 알수 없는 명령을 내려서 테이블 만들고
테이블에 데이터 입력하고, 삭제하고 .. (CRUD)

그 후 본격적(현업?)으로 써보기 시작한 것은 MySQL 이었던것 같다.
스타트업에 있었던 터라 본의(?) 아니게 그랬던것인지, 오픈소스라는 매력, 오라클에 대한 반감 등 여러요소가 있었던 것 같다.

그러다가 MySQL 이 오라클로 넘어가는 사건이 발생한다.
그 후로는 MariaDB 를 사용하게 되었다.
그 사이 서비스에 사용하는 MySQL 을 PgSQL 에 호환되도록 코드를 리팩토링해서 어! 잘 작동하네 정도로 postgre 를 써본 경험정도

그래서 postgres 에 대한 역사는 드문드문 아는정도
(역사 요약은 여기서 https://news.hada.io/topic?id=10344 )

 

Postgres는 언제부터 멋있어졌을까 | GeekNews

VC 펀딩도, DevRel 팀도 없이 25년간 천천히 진화함Ingres(UC 버클리, 1970~1985) —> Postgres95 —> PostgreSQLPostgres = "Post Ingres"첫 언어는 SQL도 아닌 QUEL 이었음. SQL 지원은 Postgres95가 출시된 1995년에 추가됨1996

news.hada.io

읽다보면, 드문드문 아! 그랬었지 라는 기억이 난다.

...

언제부터인가 MongoDB 를 필두로 NoSQL 이 유행하던 때 도 있었다.

사실 요즘은 어떤게 핫한지 잘 모른다. 이미 핫했지만, 이제서야 알게 된 것일지도 모르겠다.
아! 요즘 언어로는 힙한 postgres 인가!

DB 관련에는 어떤것들이 있나! https://news.hada.io/topic?id=16365 에서 살펴볼수 있다.

 

그냥 Postgres 쓰세요 | GeekNews

대부분의 웹 애플리케이션은 지속적인 데이터 저장이 필요하므로, 새로운 애플리케이션을 만들 때 기본적으로 Postgres를 선택하는 것이 좋음왜 sqlite가 아닌가?sqlite는 좋은 DB지만, 데이터가 하나

news.hada.io

사실 한가지에 익숙하다보면, 모든 것을 그 하나로 처리하고 싶은 욕구가 본능인듯 싶다.
나도 MySQL 을 NoSQL 처럼 사용하려 json 타입으로 만들어 사용하기도 한다.

왜! 지금 postgres 에 관심을 갖는지는 사실 supabase 라는 서비스에 있다. https://supabase.com/
요즘 구글 Firebase 대항마(?)로 뜨고 있는 서비스이다.(나온지 얼마되지 않은 듯 한데...)

 

Supabase | The Open Source Firebase Alternative

Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.

supabase.com

이 supabase 가 postgres 기반이라고 한다.
서비스지만, 오픈소스 기반이라 종속되지 않고, 서비스를 이용하다가, 본인서버로 마이그레이션 할수도 있는 듯 하다
물론 그정도로 서비스가 커져야 겠지만.

앱을 만들면서 supabase 를 쓰게 될 듯 하다.
돌아돌아 다시 만나게 된 postgres

이번에는 오래 쓰게 될지, 또 다시 찍먹하고 MySQL 으로 돌아갈지, 같이 쓸지는 모르겠다.

기억에 남기기 위해 포스팅 해본다.

postgres 로 할 수 있는 것들 - https://news.hada.io/topic?id=13231

 

PostgreSQL로 충분하다 | GeekNews

PostgreSQL을 각 분야에 사용하는 방법에 대한 링크를 정리한 페이지백그라운드잡, 메시지 큐, GIS, Audit Log, 접근 제어, 권한 관리, 검색, 시계열, 그래프 데이터, 외부 데이터, HTTP, API, 이벤트/복제/CD

news.hada.io

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지난글에 이어 https://blog.1day1.org/711 스프링 프로젝트에 .pem 인증서를 사용해보자.

 

letsencrypt 를 좀더 활용해보자. (feat. post_hook)

letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.간단한 사용법은 https://blog.1day1.org/657 에서 확인. letsencrypt 초간단 설치 in ubuntu , nginx (feat. certbot)https 를 사용하는 것은 옵션이 아니

blog.1day1.org

서버에 일반 랜딩페이지용은 nginx 로 사용하고, api 용 서버는 스프링 프로젝트로 구축되어 있다.

스프링프로젝트는 아래 형태로 세팅되어 있다. ( application-prd.properties )

server.contextPath=/myproject
server.address=0.0.0.0
server.port=8443
server.ssl.key-store=/myproject/ssl/myproject.com.pfx
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=1234567

해당 프로젝트는 내가 구축한 것은 아니고, 수년전 구축된 것을 인수받아 관리하고 있다.
그래서 해당 방식이 최신 방식은 아닐 수 있다. (잘은 모르지만, jks / pkcs12 방식이 주로 쓰이는 듯 하다)
요즘은 application.yaml 파일이 주로 쓰이나?

아무튼 이제 해야할 부분은 letsencrypt 인증서를 스프링에서 쓸수 있는 방식으로 변환하고자 한다.

# cat lets-pem2pfx.sh 
#!/bin/bash

if [ "$2" == "" ]; then
	echo "Usage) $0 {domain} {out-file.pfx}";
	exit;
fi

out_dir=$PWD
domain=$1
out_file=$2
password=123456

cd /etc/letsencrypt/live/$domain

openssl pkcs12 -export \
 -out $out_dir/$out_file \
 -inkey privkey.pem -in cert.pem -certfile chain.pem \
 -passin pass:$password -passout pass:$password

위와 같은 스크립트로 변환해줬다.
처음에는 암호없이 했는데, 스프링프로젝트가 안되서, 다시 암호를 넣고 했다.(원래 정책상 안되는지, 빠뜨린게 있는지는 ??)

다음 단계는 3개월(90일)마다 갱신을 해줘야 하니, 자동화가 필요하겠지.

1) certbot renew
2) convert pem to pfx
3) restart spring project

위 단계로 자동으로 갱신 / 재시작 하는 코드를 만들어야 겠다.(다음에 계속... )

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

letsencrypt 를 잘 사용하고 있는데, 주로 개발용으로 사용했다.

간단한 사용법은 https://blog.1day1.org/657 에서 확인.

 

letsencrypt 초간단 설치 in ubuntu , nginx (feat. certbot)

https 를 사용하는 것은 옵션이 아니라 이젠 필수요소인듯 하다. 명령은 2줄이면 될려나? apt install certbot python3-certbot-nginx certbot --nginx -d {도메인} -d {여러개일때 도메인 추가} 나중에 도메인을 추가

blog.1day1.org

좀더 프로덕션에 사용해 볼까 하는 생각에 좀더 자동화를 해보려고 알아보고 있다.

# cat /etc/letsencrypt/renewal/yoursite.com.conf 
# renew_before_expiry = 30 days
version = 1.11.0
archive_dir = /etc/letsencrypt/archive/yoursite.com
cert = /etc/letsencrypt/live/yoursite.com/cert.pem
privkey = /etc/letsencrypt/live/yoursite.com/privkey.pem
chain = /etc/letsencrypt/live/yoursite.com/chain.pem
fullchain = /etc/letsencrypt/live/yoursite.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
authenticator = nginx
installer = nginx
account = ef9ksjdkfjskd3sdf5sdf3s23gf12g452t4g232ad2a
manual_public_ip_logging_ok = None
pre_hook = systemctl stop nginx
post_hook = systemctl start nginx
server = https://acme-v02.api.letsencrypt.org/directory

3개월(90일) 후에 재인증(?)을 해줘야 한다.
위 설정에서 pre_hook / post_hook 부분에서
systemctl start nginx 로 하면 nginx 가 정상으로 실행되지 않는 현상이 있다.

실행 체크는 certbot renew --dry-run 으로 해보면 된다.(아래와 비슷한 에러)

2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:443 failed (98: Address already in use)
2024/08/04 01:40:02 [notice] 22375#22375: try again to bind() after 500ms
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:443 failed (98: Address already in use)
2024/08/04 01:40:02 [notice] 22375#22375: try again to bind() after 500ms
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:80 failed (98: Address already in use)
2024/08/04 01:40:02 [emerg] 22375#22375: bind() to 0.0.0.0:443 failed (98: Address already in use)

보통 저런 에러는 nginx 가 실행중이라 start 를 해서 이미 80/443 포트를 사용중이라는 에러
(원인의 예상은 renew 체크시 web 접속이 필요해서 nginx 가 실행중이어야 하는 듯 싶다.)
letsencrypt 인증서버에서 .well-known 서버접속해서 확인하는 듯 하다.

13.214.188.135 - - [04/Aug/2024:01:44:32 +0900] "GET /.well-known/acme-challenge/G_jAk7TzDtYa5B9RRH2-tBY5jvvOkxqsz8ZLEgnV5_8 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
18.226.4.132 - - [04/Aug/2024:01:44:32 +0900] "GET /.well-known/acme-challenge/G_jAk7TzDtYa5B9RRH2-tBY5jvvOkxqsz8ZLEgnV5_8 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
16.16.94.36 - - [04/Aug/2024:01:44:33 +0900] "GET /.well-known/acme-challenge/G_jAk7TzDtYa5B9RRH2-tBY5jvvOkxqsz8ZLEgnV5_8 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
16.16.94.36 - - [04/Aug/2024:01:44:33 +0900] "GET /.well-known/acme-challenge/II0XkQ6LIjFkl_jGey5q98RyZd231HG5Xs6amebSOjM HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
18.226.4.132 - - [04/Aug/2024:01:44:42 +0900] "GET /.well-known/acme-challenge/II0XkQ6LIjFkl_jGey5q98RyZd231HG5Xs6amebSOjM HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"
54.191.171.212 - - [04/Aug/2024:01:44:42 +0900] "GET /.well-known/acme-challenge/II0XkQ6LIjFkl_jGey5q98RyZd231HG5Xs6amebSOjM HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" "-"

에러가 발생해서 다음처럼 수정하였다. (nginx 중지 안해도 되니 pre_hook 은 주석처리 )

#pre_hook = systemctl stop nginx
post_hook = systemctl restart nginx

일단 dry-run 으로 해보니 정상적이었다.(실제 90일 후에 어떨지 살펴봐야겠지)

 

다음 활용은 letsencrypt 인증서 (.pem) 를 spring boot  의 ( .pfx ) 파일로 변환해서 사용해봐야겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

현재 개발중인 플러터 앱의 기능에 이상현상(안드로이드쪽)이 있어서, 비교할 겸 리액트 네이티브로도 비슷하게 구성하고자 한다.
(아마도 메인은 플러터 , RN 은 보조 혹은 학습 단계가 될 듯 하다.)

리액트 네이티브 세팅 후에 차이점(혹은 추가점) 을 정리한다.

기본 리액트 네이티브 설치 등은 SKIP

리액트 네이티브 - 프로젝트 내에서 실행.

# npx @react-native-community/cli doctor

Common
 ✓ Node.js - Required to execute JavaScript code
 ✓ npm - Required to install NPM dependencies
 ✓ Watchman - Used for watching changes in the filesystem when in development mode
 ● Metro - Metro Bundler is not running

Android
 ✓ Adb - Required to verify if the android device is attached correctly
 ✓ JDK - Required to compile Java code
 ✓ Android Studio - Required for building and installing your app on Android
 ✓ ANDROID_HOME - Environment variable that points to your Android SDK installation
 ✓ Gradlew - Build tool required for Android builds
 ✓ Android SDK - Required for building and installing your app on Android

iOS
 ✓ Xcode - Required for building and installing your app on iOS
 ✓ Ruby - Required for installing iOS dependencies
 ✓ CocoaPods - Required for installing iOS dependencies
 ● ios-deploy - Required for installing your app on a physical device with the CLI
 ✓ .xcode.env - File to customize Xcode environment

Errors:   0
Warnings: 2

Usage
 › Press f to try to fix issues.
 › Press e to try to fix errors.
 › Press w to try to fix warnings.
 › Press Enter to exit.

처음에는 watchman / adb / ANDROID_HOME 등이 에러 표시가 났다.

watchman 등은 새로 설치.
ANDROID_HOME 은 /Library/Android/sdk 의 패스를 넣어주면 된다.(bash / zsh 등)

metro 도 해결책을 찾아보자.
이건 npx react-native start 로 하면 해결 되는 듯 하다.

ios-deploy 쪽은 당장 iOS 쪽은 만들지 않을 듯 해서 당분간 패스

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

개발은 오래(?)했지만, 앱은 실질적으로 1년도 안된 듯 하다.

그렇다 보니, 앱 출시도 여러가지 시행착오를 겪고 있다.

이번에 지인분 앱을 만들어 주면서, 내 개인(테스트)앱도 만들어 보고 있다.

그런데, 개발자계정 만든지 얼마 안되서 이런 장벽도 있다. (프로덕션 출시를 위해서는 비공개 테스트를 해야 한다.)
지인분 계정은 오래전에 만들어서 그런지, 이번에 신규앱 출시할 때 위와 같은 단계는 없다.

관련 안내를 보니 작년에 관련 정책이 생겼나 보다. (개발자 계정이라도 미리 만들어 둘걸...)

기존 계정은 바로 프로덕션 신청(심사요청)을 할 수 있었는데, 신규계정은 비공개테스트 단계를 거쳐야 하나보다.
(아마도 개발자 검증? 을 위한 조치겠지 - 한번 검증을 거치면 다음에는 안해도 되겠지? 매번 앱 출시 마다 해야하지는 않겠지...)

 

그나저나 테스트 앱 - 버전 올리면서 올리고 있는데.

몇몇 플러터 패키지를 등록하고 올리다 보니 - 보기에는 무시무시한 - 경고 메시지가 보인다.
해당 패키지가 권한 추가 또는 최소OS버전 등으로 인해 설치 가능 기기가 줄어든 듯 싶다.
뭐! 어쩔 수 없는 것이겠지.(그래도 뭔가 씁슬하다-손해보는 듯한?)

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터 앱 - 안드로이드 쪽 자동배포를 해봤는데, 이번에는 iOS 쪽도 해본다.

testFlight 로 업로드 하는 코드.

# IPA 파일 생성
flutter build ipa --release --export-options-plist=ios/exportOptions.plist

# TestFlight에 업로드 
xcrun altool --upload-app --type ios \
 --file build/ios/ipa/*.ipa \
 --username "{your-apple-develper-id}" \
 --password "{your-app-password}" \
 --primary-bundle-id "{your-app-bundle-id}"

코드 자체는 심플하다. 관련 인증 부분이 좀 어려울 수 있다.

일단 앱 암호는 https://appleid.apple.com/account/manage 애플 계정쪽에서 설정한다.

그외 다른 인증 방식으로 몇가지 시도해봤는데, 유일하게 위 방법만 동작하였다.
( --apiKey --apiIssuer 방법 , --upload-package 방법 , xcrun notarytool 방법 => 모두 실패 )
위 다른 방식들이 좀더 안전(?)한 방법인 듯 해서 시도해봤었는데, 실패.

 

다음 부분에서도 좀 헤맸다.

# cat ios/exportOptions.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>destination</key>
    <string>export</string>
    <key>method</key>
    <string>app-store</string>
    <key>teamID</key>
    <string>{your-developer-team-ID}</string>
    <key>teamName</key>
    <string>{your-developer-team-Name}</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>{your-app-bundle-id}</key>
        <string>{your-project-provisioning-profile}</string>
    </dict>
    <key>signingCertificate</key>
    <string>Apple Distribution</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>uploadBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <true/>
</dict>
</plist>

위 입력사항 중 2개 teamName / bundle id 는 금방 찾았고 , 그외 2가지 항목을 찾아야 한다.

teamID / provisioning profile 은 어디?

open ios/Runner.xcworkspace 
# 플러터 프로젝트를 Xcode 를 열어본다.

Runner 쪽을 보면 Signing 부분에 있다. ( 지금 살펴보니, 모든 항목이 다 여기에 있다. )

내 경우는 계정소유자가 아니라 (앱 관리자? )권한으로 참여하는 것이라 Signing Certificate 쪽 설정하는데 고생을 좀 했다.

위 설정까지 문제없이 했다면, 맨 위 코드로 빌드 => 배포 가 정상적으로 될 것이다.

 

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터 앱을 만들었고, 이제 플레이 콘솔에서 수동으로 해보니 별다른 문제없이 배포되었다.
내부테스트 까지 해봤고, 조금 정리후에는 실제 플레이 스토어에 출시 할 수 있을 듯 하다.

그전에 수동 업로드 과정을 자동화 하고자 한다.

관련 API 를 제공하는 듯 하다.

Google Play Android Developer API  가 세팅되어 있어야 한다.
관련 부분은 필요하면 따로 정리.

CI/CD 로 주로 fastlane 과 연동하는 방법을 많이 쓰는 것 같다.

난 좀 단순화(?) 시켜서 반자동 으로 처리하고자 한다.
업로드 부분은 python 코드로 다음과 같다.

위와 같은 코드를 사용했다.

본인 프로젝트에 맞는 config.json 의 내용을 수정하고, python 환경에서 실행하면 된다.

flutter build appbundle 으로 aab 파일을 생성한 후에 업로드

프로젝트 폴더에서 실행

python3 play-release.py 'feature: auto relase code'

 

python 환경이 구성되어 있지 않다면.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install python

pip3 install google-auth google-auth-httplib2 google-api-python-client

python  venv 를 구성하는 방법도 좋은 팁이다.(이 부분도 추후 필요시 정리)

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터로 앱을 만들고 있다.

광고연동을 하고 있는데, 애드몹은 무난하게 넘어갔다.

다음에는 앱로빈(Applovin) 을 연동중에 있는데, 안드로이드 쪽도 좀 힘든 부분이 있었지만, 해결은 하였다.

그런데, iOS 쪽을 연동하는 중에 이상한 부분이 있어서 기록을 남긴다.

[현상]

플러터 코드를 동일하게 하고, 앱로빈쪽의 Ad Unit 을 iOS 용으로 만들고 구동해보니
다른 광고는 정상인데, native 만 나오지 않는다.( banner , mrec , Interstitial 등은 잘 나온다)

[조치1]

AppLovinMAX.setVerboseLogging(true);

AppLovinMAX.initialize 초기화 시에 옵션 추가

해당 설정을 추가하면 자세한 로그를 볼 수 있다. 그런데, android 에서는 잘 나오는데, ios 쪽에서는 나오지 않는다.

[조치2]

AppLovinMAX.showMediationDebugger();

다른 디버거 옵션을 넣어본다. 광고 동작등을 체크해볼 수 있다.
여기서는 native 광고도 잘 나온다. 뭔가 설정의 문제일 듯 하다. 범위가 좁혀졌다.

혹시나 해서.

위치 ios/Runner.xcodeproj/project.pbxproj

....
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
    "$(inherited)",
    "@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.example.userAppName;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
....

해당 bundle id 를 ad unit 과 맞춰준다.

PRODUCT_BUNDLE_IDENTIFIER = com.example.userAppName;

AppLovin 의 광고 유닛 - 동일하게 맞춰준다.

테스트 용이라 임의로 입력했었다.(안드로이드에서 정상동작해서 신경쓰지 않았었다.)

디버거에도 해당 View Ad Units 부분에 나온다(기존에는 나오지 않았다. 0 )

 

저렇게 bundle id 를 동일하게 맞춰주니 정상동작 한다.

[해결]

android 는 모두 상관없고, iOS 는 native 만 체크하는 듯 하다.

정식 앱이면, 자연스럽게 bundle id 가 맞게 입력했을텐데, 테스트용으로 임의로 넣다보니 그런 현상이 발생했다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

윈도우의 데이터를 우분투에서 가져와서 처리하는 시스템이 있다.

윈도우 공유를 우분투에서 smb 마운트 하여 사용중이다.(ubuntu 22.04 )

그런데, 며칠(수일~수십일)이 지난 후 우분투가 다운 되는 현상이 발생하였다.

커널 메시지에 다음과 같은 부분이 있다.

kernel: [242843.663373] general protection fault, probably for non-canonical address 0xdead000000000108: 0000 [#1] PREEMPT SMP NOPTI
kernel: [242843.663381] CPU: 4 PID: 1689344 Comm: kworker/4:1 Tainted: G           OE      6.5.0-35-generic #35~22.04.1-Ubuntu
kernel: [242843.663385] Hardware name: ASUS System Product Name/PRIME B760M-A, BIOS 1002 04/03/2023
kernel: [242843.663387] Workqueue: cifsiod smb2_cached_lease_break [cifs]
kernel: [242843.663452] RIP: 0010:smb2_close_cached_fid+0x2a/0xd0 [cifs]


 kernel: [254783.343885] CPU: 2 PID: 1619082 Comm: kworker/2:2 Tainted: G      D    OEL     6.5.0-26-generic #26~22.04.1-Ubuntu
 kernel: [254783.343888] Hardware name: ASUS System Product Name/PRIME B760M-A, BIOS 1002 04/03/2023
 kernel: [254783.343890] Workqueue: cifsiod smb2_reconnect_server [cifs]
 kernel: [254783.343948] RIP: 0010:native_queued_spin_lock_slowpath+0x273/0x300
주요 메시지

Workqueue: cifsiod smb2_cached_lease_break [cifs]
smb2_close_cached_fid

cifsiod smb2_reconnect_server [cifs]

native_queued_spin_lock_slowpath

혹시 부품이상인가 싶어 여러가지 시도를 해봐도 동일(비슷)한 다운 현상이 발생하였다.

사실 그동안 위 메시지를 그냥 넘겼었다.
비슷한 구성의 다른 시스템에서는 나타나지 않은 현상이라, smb 쪽 이슈일까 싶은 생각조차 들지 않았던 것 같다.

이제야 눈에 띄었지만, 실제로 원인인지는 몇가지 설정을 해보면서 찾아봐야 겠다.

smb 의 캐시관련 이슈를 기준으로 찾아봐야 겠다.
캐시가 full 이 되어 중지되는 그런 것일까? 네트웍 접속 지연등의 문제일까?

1차 시도 : 일단 마운트시의 기본값이 cache=strict 인데, cacha=none 으로 해보고 상황을 지켜볼 참이다.

/etc/fstab 예시

//windows/share  /data/  cifs uid=user,gid=user,username=guest,password=,iocharset=utf8,cache=none  0  2

위가 안된다면 2차시도는

echo "0" > /proc/fs/cifs/LookupCacheEnable

3차 시도는 smb 버전 변경 ( 3.0 / 2.0 / 1.0 다른 버전 시도)

현재
vers=3.1.1

시도
vers=1.0

...

잘 해결 되길...

=======

[추가]

1차 시도를 해봤다. 그런데, 전송속도가 캐시가 없으니 너무 떨어진다. (거의 1/5 수준으로)
거의 사용이 어려운 수준.

그러면 2차 시도도 마찬가지로 쓰기 어려울 듯 . 바로 3차 시도로 넘어가야 할 듯 하다.

[추가2]

3차 시도 는 이런 에러?(경고)가.( 상위버전 3.0 / 2.0 부터 시도해볼까?)

CIFS: VFS: Use of the less secure dialect vers=1.0 is not recommended unless required for access to very old servers
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터로 개발중인데, 안드로이드 스튜디오 jellyfish 로 업그레이드 하면서 몇몇 문제를 해결하고 사용중이다.
뭔가 자잘한 오류 메시지들이 보인다.

이번에는 SDK 매니저 에서 에뮬레이터를 추가하면서 발생한 듯 싶다.

INFO    | Storing crashdata in: /tmp/android-{user-name}/emu-crash-34.2.14.db, detection is enabled for process: 56249

다음 명령 flutter emulators  으로 동일한 메시지를 확인 할 수 있다.

추가했던 에뮬중에 이상이 생긴 듯 하다.

새버전과 호환성 문제일까?

종료하려는데 이런 메시지가?

좀더 살펴보다가, 재부팅 신공(?)을 시도해봐야 겠다.

---

[추가 - 재부팅 신공?]

실패

---

[추가 - 재설치]

아래 주요 디렉토리를 삭제 후에 재설치

  위치 사용자 디렉토리 cd ~/
  
  rm -r .android/
  rm -r Library/Android/
  rm -r Library/Caches/Google/AndroidStudio*
  rm -r Library/Caches/AndroidStudio3.6/
  rm -r Library/Preferences/AndroidStudio3.6/
  rm Library/Preferences/com.android.Emulator.plist 
  rm Library/Preferences/com.google.android.studio.plist

실패

다음에는 하위 버전으로 다시 시도해봐야 겠다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

플러터 를 안드로이드 로 개발중인데 - 새버전이 나와서 업그레이드 하였다.

에러가 생길 것은 예상은 했다. 빌드해보니.

Launching lib/main.dart on sdk gphone64 arm64 in debug mode...
Running Gradle task 'assembleDebug'...

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> A problem occurred starting process 'command '/..../flutter/bin/flutter''

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
Error: Gradle task assembleDebug failed with exit code 1
Error executing devicectl: ProcessException: Process exited abnormally with exit code 3:

User cancelled
  Command: /usr/bin/arch -arm64e xcrun devicectl list devices --timeout 5 --json-output /var/folders/d7/4qd968hd0kzc21y8jggx2qcr0000gn/T/flutter_tools.w7hJCy/core_devices.D5JYTk/core_device_list.json
Error executing devicectl: ProcessException: Process exited abnormally with exit code 3:

User cancelled
  Command: /usr/bin/arch -arm64e xcrun devicectl list devices --timeout 5 --json-output /var/folders/d7/4qd968hd0kzc21y8jggx2qcr0000gn/T/flutter_tools.w7hJCy/core_devices.AHDMpc/core_device_list.json

다음과 같은 에러가 발생하였다.

flutter doctor 해봐도 특별한 이상은 안 보였다.

 


iOS 쪽을 시도 해봤다.

# xcodebuild -downloadPlatform iOS

Downloading iOS 17.5 Simulator (21F79): 83.1% (6.09 GB of 7.34 GB)2024-05-27 00:10:48.511 xcodebuild[38139:36929395]  DVTDownloadable: Download Failed. Downloadable: https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg. Error Domain=NSPOSIXErrorDomain Code=28 "No space left on device" UserInfo={NSErrorFailingURLStringKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, NSErrorFailingURLKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>}
Downloading iOS 17.5 Simulator (21F79): Error: Error Domain=NSPOSIXErrorDomain Code=28 "No space left on device" UserInfo={NSErrorFailingURLStringKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, NSErrorFailingURLKey=https://download.developer.apple.com/Developer_Tools/iOS_17.5_Simulator_Runtime/iOS_17.5_Simulator_Runtime.dmg, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDownloadTask <D677E7D4-290F-4ABB-AE5D-98AAF40F70BC>.<1>}

여기도 에러.

하드 공간이 없다.  오랜만에 봤더니, 6기가 정도 밖에 안 남았네. ㅜㅜ

용량이 부족하다. 조금 정리하고 다시 시도..

Registering simulator runtime with CoreSimulator failed.
Domain: DVTDownloadableErrorDomain
Code: 29
User Info: {
    DVTErrorCreationDateKey = "2024-05-26 15:36:28 +0000";
}
--
Registering simulator runtime with CoreSimulator failed.
Domain: DVTDownloadableErrorDomain
Code: 29
--
Cannot copy the image because the disk is almost full
Domain: com.apple.CoreSimulator.simdiskimaged.SimDiskImageError
Code: 14
--


System Information

macOS Version 14.4.1 (Build 23E224)
Xcode 15.4 (22622) (Build 15F31d)
Timestamp: 2024-05-27T00:36:28+09:00

더 줄여야 겠다.

하드 좀 정리하고, 다시 해보니 정상 다운로드 되었다.
그리고, 안드로이드 스튜디오에서 다시 빌드 해보니 정상 동작 했다.

이제 안드로이드 쪽 빌드를 해결해보자.(즉, iOS 쪽은 정상)

android / gradle 빌드 쪽 이슈로 좁혀졌다.


[다시 시도]

flutter upgrade --force 로 플러터 SDK 를 업그레이드 해봤다.

* What went wrong:
Execution failed for task ':gradle:compileGroovy'.
> Failed to run Gradle Worker Daemon
   > A problem occurred starting process 'Gradle Worker Daemon 1'

에러가 나지만, 메시지가 달라졌다.

android/ 에서 gradle 을 콘솔에서 명령을 내려봤다.

# ./gradlew app:installDebug

FAILURE: Build failed with an exception.

* Where:
Build file '.../android/app/build.gradle' line: 2


What went wrong:
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
      Your current JDK is located in /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home/jre
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 24s
4 actionable tasks: 2 executed, 2 up-to-date

다른 프로젝트에서 1.8 오래된 버전이 필요해서 바꿨었는데, 그것이 영향을 준것 같다.
근데, 안드로이드 스튜디오 젤리피시 버전업 하기까지는 이상이 없었는데..??

android/gradle.properties
파일에 JAVA_HOME 패스를 넣었다.(.bash_profile 등에 넣어도 된다.)

org.gradle.java.home=/Library/Java/JavaVirtualMachines/adoptopenjdk-16.jdk/Contents/Home/

 

다시 빌드...

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':connectivity_plus:compileDebugJavaWithJavac'.
> error: invalid source release: 17

 

이거 점점 미궁으로 가는거 아닌가? ㅜㅜ

java 버전 17 으로 맞춰준다.

# brew install openjdk@17

sudo ln -s  /opt/homebrew/Cellar/openjdk\@17/17.0.11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

gradle.properties 나 IDE 세팅등에 버전을 맞춘다.

org.gradle.java.home=/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home/

 

일단 여기까지 해보니, 정상 빌드 된다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

ubuntu 16.04  터미널에서 로그파일등에서 주요 키워드를 볼때 색상을 표시하고자 한다.

watch --color -n 10 \
 'bash your-program-run.sh |  \
GREP_COLOR="01;33" grep --color=always -i -e "Warnning.*" -e "^" | \
GREP_COLOR="01;35" grep --color=always -i -e "Fail.*" -e "^" | \
GREP_COLOR="01;31" grep --color=always -i -e "Alert.*" -e "^"  \
 '

프로그램 실행 명령이 출력으로 나올 때 grep 으로 색상을 표시한다. ( --color=always )
GREP_COLOR 로 키워드 별로 색상을 다르게 줄 수 있다.
(색상코드는 여기 참조 : https://chrisyeh96.github.io/2020/03/28/terminal-colors.html )

또한 -e ".*Keyword.*" 처럼 하면 해당 키워드가 나온 모든 줄이 되고, -e "Keyword" 를 하면 해당 키워드만 색상표시된다.

그런데, 문제는 watch 를 조합하면 색상 표시가 안된다.(우분투 16.04)

동일 명령을 ubuntu 22.04 에서는 정상으로 나온다.

터미널에서 색상코드(ansi code) 표시를 제대로 처리 못하는 것 같다.

ㄴ정상인 경우 코드
비정상 처리된 코드

우분투 16.04 의 watch 버전은 3.3.10 버전 ( 22.04 는 3.3.17 버전이다)

 

# 해결 방안

방법1. 정상동작 하는 터미널에서 원격으로 접속 명령을 내린다.

watch --color -n 10 'ssh {your-username}@{your-server} {원래 명령}'

위 처럼 해서 watch 가 색상코드를 정상적으로 처리하도록 한다.

 

방법2. watch 버전을 해결된 버전으로 소스 컴파일 한다.

위 방법이 뭔가 찜찜하다면, 소스를 직접 컴파일한다.

소스 : https://gitlab.com/procps-ng/procps/-/releases/v3.3.13

해당 릴리즈의 Changelog 를 보니

watch: Support ANSI 39,49 reset sequences              issue #73

가 해당 버그인 듯 싶다.

암튼 소스를 받고 컴파일 한다.

wget https://gitlab.com/procps-ng/procps/-/archive/v3.3.13/procps-v3.3.13.tar.gz

tar xvzf procps-v3.3.13.tar.gz
cd procps-v3.3.13/

sudo apt install autoconf libtool autopoint libtool-bin ncurses-dev

./autogen.sh
./configure
make

설치는 make install 으로 하면 /usr/local/bin 으로 설치가 될 것이다.

그런데, 이 경우 watch 만 필요하니 $HOME/bin 디렉토리에 복사해서 사용했다.

정상적으로 색상이 나오는 것을 확인했다.

 

방법3. 상위버전 deb 패키지에서 watch 파일을 추출한다.

위 방법2 로 소스컴파일 하니, 문제는 한글이 watch 를 거치면서 사라져 버린다. ㅜㅜ

상위 deb 패키지에서 추출하기로 한다.(현버전 16.04 => 18.04 의 패키지)

상위버전 패키지 - https://launchpad.net/ubuntu/+source/procps/2:3.3.12-3ubuntu1.2/+build/17397008

procps_3.3.12-3ubuntu1.2_amd64.deb (219.4 KiB)

하단의 deb 파일을 다운로드

패키지를 설치하면 다른 이상이 있을 수 있으니, watch 실행파일만 추출한다.
(참조 : https://www.cyberciti.biz/faq/how-to-extract-a-deb-file-without-opening-it-on-debian-or-ubuntu-linux/ )

ar x procps_3.3.12-3ubuntu1.2_amd64.deb

tar xvJf data.tar.xz

cp usr/bin/watch $HOME/bin

이제 한글도 제대로 나온다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

오래된 서비스가 돌아가는 머신이 있다.

ubuntu 10.04 버전이니 14년이 넘어가는 머신 - 리얼서버 => 가상서버 로 몇번 옮겨지기도 했다.

새버전으로 바꾸기에는 레거시 코드가 있어서 그냥 돌리고 있다.

리얼 => 가상 서버로 옮겨지면서, 가상머신 내부는 최소의 용량으로 두고, 데이터는 외부로 두고 nfs 로 마운트해서 사용하고 있다.

재부팅할 때 - 아래 부분에서 딜레이가 발생한다.

원인을 찾아보다가, 보아하니 nfs 마운트한 위치를 bind 로 재마운트 한 부분에서 딜레이가 발생하는 것 같다.

# apache logs
/data8/apache2                /var/log/apache2   bind    bind,rw,defaults  0  2

/data8 이 nfs 로 마운트 된 위치 , 그것을 mount bind 로 했다.

재부팅 reboot / 종료 halt 시에 딜레이가 발생한다. ( 이 부분이 ubuntu 상위 버전에서는 일어나지 않는 듯 하다)
10.04 버전에서 이상현상.(다른 모든 버전을 체크하지는 못 함 - 비슷한 환경을 구성한 14.04 은 정상 )

종료프로세스인 /etc/rc6.d 부분이

umount 코드들이 실행되지만, mount bind 는 제대로 언마운트를 못하는 듯 하다.

그래서

S22umount-work-nfs -> ../init.d/umount-work-nfs*

위 파일을 만들어 줬다.

# cat /etc/init.d/umount-work-nfs 
#! /bin/sh
### BEGIN INIT INFO
# Provides:          unmount work nfs
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      6
# Short-Description: Umount nfs work dir before reboot.
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
	# Message should end with a newline since kFreeBSD may
	# print more stuff (see #323749)
	log_action_msg "Will umount all nfs work dir - before restart"
	umount /var/log/apache2 
}

case "$1" in
  start)
	# No-op
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	do_stop
	;;
  *)
	echo "Usage: $0 start|stop" >&2
	exit 3
	;;
esac

do_stop 부분에 bind mount 한 위치를 umount 해준다.

10.04 버전을 아직도 쓰실 분이 얼마나 있겠냐마는 ㅜㅜ

난 여러버전을 쓰고 있구나. 10.04 / 14.04 / 18.04 .. 최근 22.04 도 ,  곧 나올 24.04 도 쓰겠군.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

지금까지의 삽질(?)은 콘솔 환경에서 개발을 편하게 할 수 있게 세팅하기 위함이다.
Language Server Protocol (LSP) 가 최종 목적이 될 듯 하다.

mac os 와 byobu 를 사용하니, 몇몇 단축키가 충돌되거나 한다.
CTRL + 화살표(Left / Right) 등

1. 일단 터미널에서 단어간의 이동이 안된다. 다른 조합으로 바꾼다. (터미널 쪽에서 설정이 필요 - alacritty)

위치 .config/alacritty/alacritty.toml

bindings = [
  { key = "Right", mods = "Alt", chars = "\u001BF" },
  { key = "Left",  mods = "Alt", chars = "\u001BB" },
  { key = "F",  mods = "Control|Shift", action = "ToggleFullscreen" }, # full screen
 ]

CTRL 을 Alt (mac Opt 키) 조합으로 바꾼다.
Ctrl + Shift + F 로 전체화면 변경도 추가했다.

 

2. byobu 에서 Alt + Left/Right 는 윈도우 간의 전환인데, 위 터미널 설정이 우선하는 것 같다.

대신 동일 기능으로 CMD + Left / Right 로 전환 가능하다.

byobu ( tmux ) 의 단축키를 F1~F12 등을 사용하기도 하는데.

난 CTRL+a 의 조합을 사용하기 좋아한다.(Mac 에서는 Fxx 키를 입력하기 불편하다. fn 키를 같이 입력해야함)
tmux 는 ctrl+b 를 사용하나보다. byobu 쪽은 ctrl+a 를 사용한다.

CTRL+a 는 prefix 또는 Leader 키라고 한다.

CTRL+a 입력 후 조합단어. 대소문자 구분 ( 동일 키 )

+ c : 새윈도우 열기 ( F2 동일 )
+ n : 다음 윈도우 ( CMD + Right )
+ p : 이전 윈도우 ( CMD + Left )
+ ctrl-a : 바로 이전 윈도우

+ , : 윈도우 이름 변경 ( F8 )

+ d : detach  ( F6 )

+ % : 창 수직 분리 pane 
+ | : 창 수평 분리

pane 간 이동 ( Shift + Up/Down/Left/Right )

pane 간 사이즈조절 ( Shift + Opt + Up/Down/Left/Right )

 

3. byobu 에서 pane 을 나눈 후 마우스 스크롤을 pane 단위로 하도록 설정

# cat .config/byobu/.tmux.conf
set -g mouse on

위 항목 추가.

위 설정을 하니, pane 단위 스크롤이 되기는 한데, 복사하기 위해 마우스 드래그가 이상해 진다.
그냥 Alt + F12 로 위 옵션을 on / off 할 수 있으니, 이 방법이 나을 듯 하다.

CTRL+a + : (: 콜론, not ; 세미콜론)
으로 명령 모드로 들어간 후
set -g mouse on
set -g mouse off

직접 명령을 실행해도 된다.

 

4. 방향키 ( Arrow Key ) 를 다른 조합으로 바꾼다.

키보드의 방향키를 쓰기 불편해서 다른 키조합으로 바꾸고 싶다.(키캡을 교체하면 좀 나을려나?)
- 기존 텐키리스 쓰다가, 텐키 로 바꿨는데, 방향키가 적응이 안되네(유독 방향키가 구분이 안되는 키보드이긴 하지만)

alacritty + zsh + byobu(tmux) 조합에서 방향키를 다른 키로 바꾼다. ( alt + h j k l 으로 변경 )
alacritty 는 시도해봤는데, 안되거나 어렵다. 키코드값 chars 를 알아내기가 어렵다. 포기...

그래서 zshrc 에서 세팅하기로 한다. ( alt 가 ^] 라고 하는데, 맥이라 그런지 안되고 아래처럼 해야 된다.)

# cat .zshrc

bindkey "˙" backward-char
bindkey  "∆" down-line-or-history
bindkey  "˚" up-line-or-history
bindkey  "¬" forward-char

이렇게 바꾸니 좀 나아졌다. (키보드를 바꾸는게 상책이려나?)

- 그냥 다시 텐키리스 키보드로 바꿈.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

mac os 의 기본 shell 은 bash 로 되어 있는 것 같다.
chsh -s /bin/zsh 로 바꾸라는 안내도 나오지만, 그냥 쓰기로 했다.

다만, neovim 을 쓰기 위해 alacritty 를 쓰면서 zsh 를 써보기로 했다. (https://blog.1day1.org/693)
alacritty 가 따로 탭기능은 없어서, byobu 를 쓰기로 했다.

brew install byobu 로 설치

실행하니 기본쉘인 bash 로 실행이 된다. byobu 쓸때도 zsh 를 쓰고자 한다.

# cat .config/byobu/.tmux.conf
set -g default-shell /bin/zsh
set -g default-command /bin/zsh

위 파일명이 비어 있는데, 위 두줄을 넣어준다.

정상으로 zsh 가 기본으로 실행된다.

간만에 byobu 를 쓰려니 단축키가 잘 생각이 안난다.
자주 쓰던 키를 정리해둬야 겠다.

Shift-F1 을 누르면 단축키가 나온다. ( 아래와 같은데, 난 좀 다르게 사용한다. 그 부분을 따로 정리.)

  F1                             * Used by X11 *
    Shift-F1                     Display this help
  F2                             Create a new window
    Shift-F2                     Create a horizontal split
    Ctrl-F2                      Create a vertical split
    Ctrl-Shift-F2                Create a new session
  F3/F4                          Move focus among windows
    Alt-Left/Right               Move focus among windows
    Alt-Up/Down                  Move focus among sessions
    Shift-Left/Right/Up/Down     Move focus among splits
    Shift-F3/F4                  Move focus among splits
    Ctrl-F3/F4                   Move a split
    Ctrl-Shift-F3/F4             Move a window
    Shift-Alt-Left/Right/Up/Down Resize a split
  F5                             Reload profile, refresh status
    Alt-F5                       Toggle UTF-8 support, refresh status
    Shift-F5                     Toggle through status lines
    Ctrl-F5                      Reconnect ssh/gpg/dbus sockets
    Ctrl-Shift-F5                Change status bar's color randomly
  F6                             Detach session and then logout
    Shift-F6                     Detach session and do not logout
    Alt-F6                       Detach all clients but yourself
    Ctrl-F6                      Kill split in focus
  F7                             Enter scrollback history
    Alt-PageUp/PageDown          Enter and move through scrollback
    Shift-F7                     Save history to $BYOBU_RUN_DIR/printscreen
  F8                             Rename the current window
    Ctrl-F8                      Rename the current session
    Shift-F8                     Toggle through split arrangements
    Alt-Shift-F8                 Restore a split-pane layout
    Ctrl-Shift-F8                Save the current split-pane layout
  F9                             Launch byobu-config window
    Ctrl-F9                      Enter command and run in all windows
    Shift-F9                     Enter command and run in all splits
    Alt-F9                       Toggle sending keyboard input to all splits
  F10                            * Used by X11 *
  F11                            * Used by X11 *
    Alt-F11                      Expand split to a full window
    Shift-F11                    Zoom into a split, zoom out of a split
    Ctrl-F11                     Join window into a vertical split
  F12                            Escape sequence
    Shift-F12                    Toggle on/off Byobu's keybindings
    Alt-F12                      Toggle on/off Byobu's mouse support
    Ctrl-Shift-F12               Mondrian squares
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

neovim 을 세팅하고 사용해보려고 한다.
지난번 초기 세팅후 맥OS 기본 터미널에서 색상이 이상해져서 다른 터미널을 찾고 있다.(https://blog.1day1.org/690)
혹시나 해서 다른 theme (gruvbox) 를 시도해봐도 정상으로 나오지는 않았다.(조금 나아졌지만 ...)

가능한 맥OS 기본세팅으로 가려고 했지만 어려울 듯 하다.
그래서 다른 터미널을 찾기를 시도.

여러가지가 있지만, 그중에 alacritty 가 눈에 들어왔다.

설치는 여기를 참조 : https://github.com/alacritty/alacritty

설치 / 실행하면 너무나 심플해서 당황스러울 것이다.(기본 설정 하는 메뉴도 없다)

기본 설정 하기 : ~/.config/alacritty/alacritty.toml 파일에 설정을 해준다.
설정 항목은 https://alacritty.org/config-alacritty.html 을 참조한다.

예전에는 설정파일이 yml 방식이었는데, 최근 toml 방식으로 바뀐것 같다.
설정 예시 검색시 toml 방식을 사용하면 된다.

내가 조정한 몇가지 설정을 정리하면 다음과 같다.


[window]

dimensions = { columns = 500, lines = 100 }  # Default: columns = 0, lines = 0

opacity = 0.8  # Default: 1.0

#startup_mode = "Maximized"  # Default: "Windowed"


[font]

# Font size in points
size = 12  # Default: 11.25

위 정도만 해도 봐 줄만 한 것 같다.

추가로 alacritty 를 써보면서 기본 쉘도 zsh 로 해보고 있다.(oh my zsh 던가?)
아직은 내 취향에 맞는 설정이 확정되지 않아. 추후 필요시 정리.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

neovim 을 세팅해보고 있다.
설정 참고는 https://github.com/cpow/neovim-for-newbs/blob/main/init.lua

세팅해보는데, 맥OS 기본 터미널에서는 이렇게 나온다.

컬러 세팅(colorscheme) 이 안 먹는 것 같다.

VScode 의 내장 터미널? 에서는 잘 되는 것 같다.

 

검색해보면, 맥OS 기본 터미널에서는 안되고 다른 터미널을 써라가 답인 듯 한데.
일단 좀더 찾아보고 안되면 다른 터미널로...

 

[추가]

위처럼 처음부터 환경을 만드는 방법도 있고.

어느정도 세팅된 것을 설치해서 사용할 수도 있다.
예로는 LazyVim / LunarVim / AstroNvim / NVChad  등이 있다.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

우분투 <=> 윈도우 의 경우는 심볼릭링크가 크게 상관없을 듯 하다.

그런데, 우분투 <=> 우분투 의 경우 samba 마운트 시에 symlink 유지여부가 SMB 버전마다 차이가 있는 듯 하다.

결론부터 이야기 하면 vers=1.0 으로 해야 유지가 되는 듯 하다.

//ubox-serv/data  /data/   cifs uid=ccex,gid=ccex,username=guest,password=,iocharset=utf8,vers=1.0  0  2
#//ubox-serv/data  /data/   cifs uid=ccex,gid=ccex,username=guest,password=,iocharset=utf8,noserverino 0  2

fstab 에 설정에서 위처럼 vers=1.0 으로 하는 경우만 symlink 유지됨.

SMB버전은 올리고, noserverinfo 등의 옵션은 안되는 듯 하다.

 

다른 해결 방법이 있을지는 추후 필요하면 정리.

반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,

세부적인 부분은 링크로 대신

1. ssh 키 생성 : https://docs.github.com/ko/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

 

새 SSH 키 생성 및 ssh-agent에 추가 - GitHub Docs

SSH(Secure Shell Protocol)를 사용하여 GitHub.com의 리포지토리에서 데이터에 액세스하고 쓸 수 있습니다. SSH를 통해 연결할 때 로컬 머신에서 프라이빗 키 파일을 사용하여 인증합니다. 자세한 내용은 "

docs.github.com

2. 깃허브에 키 등록 : https://github.com/settings/keys

키등록까지 한 후에 ssh 계정 설정으로 여러계정의 깃허브에 연결할 수 있다.
(예시> 개인계정 / 회사계정 등)

위 계정의 ssh 키는 달라야 한다. 동일하면, 등록이 안된다.
(키 파일명도 다르게 해준다. 기본 : id_ed25519 , 추가 : id_ed25519_idname 등 )

3. 키 가 등록되는 위치는 .ssh 를 기준으로 .ssh/config 파일에 다음항목을 추가한다.

Host github.com-idname
	hostname github.com
	User git
	IdentityFile ~/.ssh/idname-id_ed25519

위 처럼 github.com 주소를 분리해준다.
즉, github.com 로 접속하면 기본값이 .ssh/id_ed25519 가 적용되고, github.com-idname 으로 접속하면 .ssh/idname-id_ed25519 가 적용되는 식이다.

ssh git@github.com-idname 를 해보면 다음과 같이 나와야 한다.

PTY allocation request failed on channel 0
Hi idname! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

이후에는 저장소를 지정한 Host 주소로 연결해서 사용하면 된다.

git remote add origin git@github.com-idname:idname/your-repositry-name.git

커밋 후 git push -u origin main 로 저장소에 업로드 하면 된다.

저장소 별로 author 정보를 등록해준다.( 전체 적용시는 --global 을 추가 - git config --global OOO )

git config user.name "user name"
git config user.email "your-mail@your-mail.com"

 

혹시 author 가 다르게 등록이 되었으면, 전체 변경이라 주의!!

git rebase -r --root --exec "git commit --amend --no-edit --reset-author"
git push --force-with-lease
반응형

WRITTEN BY
1day1
하루하루 즐거운일 하나씩, 행복한일 하나씩 만들어 가요.

,