<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Hurlang.log</title>
        <link>https://velog.io/</link>
        <description>개발 꿈나무 Hurlang 입니다.</description>
        <lastBuildDate>Sat, 18 Nov 2023 09:08:06 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Hurlang.log</title>
            <url>https://velog.velcdn.com/images/dev-hongs/profile/88866a43-9c52-47c7-87c3-904ffd437dcb/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Hurlang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev-hongs" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Anaconda] 가상환경 설정]]></title>
            <link>https://velog.io/@dev-hongs/Anaconda-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@dev-hongs/Anaconda-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sat, 18 Nov 2023 09:08:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>가상환경 생성</p>
</blockquote>
<pre><code>conda create -n {가상환경이름} {파이썬 버전}</code></pre><p><em>ex) conda create -n pruny python=3.7</em></p>
<blockquote>
<p>가상환경 목록 확인</p>
</blockquote>
<pre><code>conda env list</code></pre><blockquote>
<p>가상환경 활성화 / 비활성화</p>
</blockquote>
<pre><code>conda activate {가상환경이름}
conda deactivate {가상환경이름)</code></pre><blockquote>
<p>가상환경 삭제</p>
</blockquote>
<pre><code>conda env remove -n {가상환경이름}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Springboot] RestTemplate 활용해서 외부로 API요청 보내기]]></title>
            <link>https://velog.io/@dev-hongs/Springboot-RestTemplate-%ED%99%9C%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%99%B8%EB%B6%80%EB%A1%9C-API%EC%9A%94%EC%B2%AD-%EB%B3%B4%EB%82%B4%EA%B8%B0</link>
            <guid>https://velog.io/@dev-hongs/Springboot-RestTemplate-%ED%99%9C%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%99%B8%EB%B6%80%EB%A1%9C-API%EC%9A%94%EC%B2%AD-%EB%B3%B4%EB%82%B4%EA%B8%B0</guid>
            <pubDate>Wed, 03 May 2023 08:20:16 GMT</pubDate>
            <description><![CDATA[<h2 id="resttemplate를-활용하여-springboot에서-api요청-보내기">RestTemplate를 활용하여 Springboot에서 API요청 보내기!</h2>
<h3 id="delete-요청method만-바꾸면-get과-비슷">DELETE 요청(Method만 바꾸면 Get과 비슷)</h3>
<p>녹화파일을 지우는 메서드를 작성하였습니다. 입력받은 recordingId을 PathVariable 형태로 입력하여 요청을 보냅니다.</p>
<p>요청 순서는 아래와 같습니다.</p>
<ol>
<li><p>RestTemplate 인스턴스를 생성</p>
</li>
<li><p>Header 생성</p>
</li>
<li><p>Header로 entity 생성</p>
</li>
<li><p>restTemplate.exchange()에 url, method, requestEntity, responseType을 담아 요청을 보냅니다.</p>
</li>
</ol>
<pre><code class="language-java">public void removeRecording(String recordingId) {
        String url = OPENVIDU_BASE_PATH + &quot;recordings/&quot; + recordingId;

        // OPENVIDU REST API 요청
        RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
        // Header 생성
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.add(&quot;Authorization&quot;, &quot;Basic &quot; + OPENVIDU_SECRET);

        HttpEntity&lt;String&gt; entity = new HttpEntity&lt;String&gt;(&quot;&quot;, headers);
        // request
        try {
            ResponseEntity&lt;String&gt; response = restTemplate.exchange(
                    url, //{요청할 서버 주소}
                    HttpMethod.DELETE, //{요청할 방식}
                    entity, // {요청할 때 보낼 데이터}
                    String.class
            );
        }
        catch (HttpClientErrorException | HttpServerErrorException e){
            HttpStatus statusCode = e.getStatusCode();

            if (statusCode == HttpStatus.NOT_FOUND){        //404: 삭제할 녹황파일이 없는 경우
                throw new NotExistRecordingException();
            }
            else if (statusCode == HttpStatus.CONFLICT) {   //409: 녹화가 진행중인 경우
                throw new RecordingInProgressException();
            }
        }

    }</code></pre>
<h3 id="post-요청">POST 요청</h3>
<p>세션을 초기화하는 메서드를 작성하였습니다. 순서는 아래와 같습니다.</p>
<ol>
<li><p>RestTemplate 인스턴스를 생성</p>
</li>
<li><p>Header 생성</p>
</li>
<li><p>Body 생성</p>
</li>
<li><p>Header, Body로 entity 생성</p>
</li>
<li><p>restTemplate.exchange()에 url, method, requestEntity, responseType을 담아 요청을 보냅니다.</p>
</li>
<li><p>response를 가공합니다.</p>
</li>
</ol>
<pre><code class="language-java">public InitializeSessionResponseDto initializeSession(HttpServletRequest request){
        ...(생략)

        String url = OPENVIDU_BASE_PATH + &quot;sessions&quot;;
        String customSessionId = userId + &quot;-&quot; + System.currentTimeMillis();
        String recordingMode = &quot;ALWAYS&quot;;

        // OPENVIDU REST API 요청
        RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());

        // Header 생성
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.add(&quot;Authorization&quot;, &quot;Basic &quot; + OPENVIDU_SECRET);

        // Body 생성
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty(&quot;customSessionId&quot;,customSessionId);
        jsonObject.addProperty(&quot;recordingMode&quot;,recordingMode);

        // Header + Body
        HttpEntity&lt;String&gt; entity = new HttpEntity&lt;String&gt;(jsonObject.toString(), headers);

        // request
        ResponseEntity&lt;String&gt; response = restTemplate.exchange(
                url, //{요청할 서버 주소}
                HttpMethod.POST, //{요청할 방식}
                entity, // {요청할 때 보낼 데이터}
                String.class
        );

        // response
        JsonParser parser = new JsonParser();
        JsonObject responseBody = parser.parse(response.getBody()).getAsJsonObject();
        String sessionId = responseBody.get(&quot;id&quot;).getAsString();

        InitializeSessionResponseDto responseDto = new InitializeSessionResponseDto();
        responseDto.setSessionId(sessionId);
        return responseDto;
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] crontab 활용한 스케쥴링]]></title>
            <link>https://velog.io/@dev-hongs/Linux-crontab-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%A7%81</link>
            <guid>https://velog.io/@dev-hongs/Linux-crontab-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%8A%A4%EC%BC%80%EC%A5%B4%EB%A7%81</guid>
            <pubDate>Wed, 03 May 2023 00:07:04 GMT</pubDate>
            <description><![CDATA[<h3 id="프로세스-예약-실행-일회성">프로세스 예약 실행 (일회성)</h3>
<p>at 명령어</p>
<hr>
<h3 id="프로세스-예약-실행-주기성">프로세스 예약 실행 (주기성)</h3>
<p>크론 (cron)</p>
<ul>
<li><p>미리 정한 시간에 명령어, 프로그램, 작업 등을 실행할 수 있는 서비스</p>
</li>
<li><p>at 명령어는 단 1회만 예약시간에 작업 실행하는 반면</p>
<p>크론 서비스는 반복적으로 실행할 수 있음</p>
</li>
<li><p>크론 데몬 cron와 예약작업 정보가 담겨있는 설정파일로 구성</p>
</li>
</ul>
<p>크론탭 (crontab)</p>
<ul>
<li><p>cron은 정해진 스케쥴에 따라 작업을 수행하는 데몬</p>
</li>
<li><p>crontab은 데몬이 바라보는 작업 리스트</p>
</li>
<li><p>cron 프로세스는 /etc/crontab 파일에 설정된 것을 읽어서 작업을 수행하게 된다.</p>
</li>
</ul>
<p>anacron</p>
<ul>
<li><p>/usr/sbin/anacron 에 위치하며,</p>
<p>크론과 같이 동작하는 프로그램으로 서버가 일정 시간 중지되었을 때에도 작업이 실행되는 것을 보장하기 위해 사용하는 도구이다.\</p>
</li>
</ul>
<hr>
<h3 id="crontab-파일-형식">crontab 파일 형식</h3>
<p>크론설정파일에 크론작업을 정의한다.</p>
<p>총 7개의 필드로 구성되어 있다.</p>
<p>분, 시간, 일, 월, 요일, 사용자명, 실행할 명령어 순으로 기재한다.</p>
<pre><code>20 5 10 * * root /usr/sbin/test</code></pre><p>10일 5시 20분에 root 사용자의 test 실행</p>
<p>Tip: 요일의 경우 일(0,7), 월(1), 화(2), 수(3), 목(4), 금(5)</p>
<p><img src="https://velog.velcdn.com/images/dev-hongs/post/bdccb41f-6bc3-4bff-8bdd-11af47b52c26/image.png" alt=""></p>
<h3 id="crontab-수정">crontab 수정</h3>
<pre><code>crontab -e</code></pre><h3 id="crontab-재시작">crontab 재시작</h3>
<p>crontab 설정 변경 후 항상 cron 서비스를 재시작 해야한다.</p>
<pre><code>service cron status # 동작 여부 확인

service cron start    # 가동
service cron restart # 재가동

# cron 명령어가 안되면 crond로 실행</code></pre><h3 id="crontab-등록된-목록보기">crontab 등록된 목록보기</h3>
<pre><code>crontab -l</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 일정 기간 지난 파일 삭제]]></title>
            <link>https://velog.io/@dev-hongs/Linux-%EC%9D%BC%EC%A0%95-%EA%B8%B0%EA%B0%84-%EC%A7%80%EB%82%9C-%ED%8C%8C%EC%9D%BC-%EC%82%AD%EC%A0%9C</link>
            <guid>https://velog.io/@dev-hongs/Linux-%EC%9D%BC%EC%A0%95-%EA%B8%B0%EA%B0%84-%EC%A7%80%EB%82%9C-%ED%8C%8C%EC%9D%BC-%EC%82%AD%EC%A0%9C</guid>
            <pubDate>Wed, 03 May 2023 00:05:07 GMT</pubDate>
            <description><![CDATA[<p>find 명령어에 -mtime +일수 옵션을 주면 되는데 생각한 일수보다 1 적게 주어야 합니다.</p>
<p>예) <strong>3일</strong> 초과한 파일을 삭제하려면 -mtime +2 -delete</p>
<p>예) <strong>3분</strong> 초과한 파일을 삭제하려면 -mmin +2 -delete</p>
<pre><code>find /opt/openvidu/recordings/ find -name &quot;*&quot; -mmin +330 -delete</code></pre><p>/opt/openvidu/recordings 디렉토리 내에 수정된지 330분 이상 된 모든 파일을 삭제한다.</p>
<pre><code>[옵션]

-maxdepth

찾을 파일들의 경로 depth(깊이)를 지정한다. 1은 현재 2는 현재디렉토리위 한단계 아래의 하부 디렉토리 포함 이런식(옵션의 맨 처음에 와야 함)

 -depth 

찾을 파일들의 경로 depth(깊이)를 지정한다. 뒤의 단계지정은 maxdepth와 동일한데 다른건 maxdepth는 지정한 depth안의 파일을 모두 보여주지만 depth는 지정한 단계의 파일들만 보여줌

-name filename
파일 이름으로 찾는다.
-atime +n
access time 이 n일 이전인 파일을 찾는다.
-atime -n
access time이 n일 이내인 파일을 찾는다.
-mtime +n
n일 이전에 변경된 파일을 찾는다.
-mtime -n
n일 이내에 변경된 파일을 찾는다.
-perm nnn
파일 권한이 nnn인 파일을 찾는다.
-type x
파일 타입이 x인 파일들을 찾는다.(f: file, d: directory)
-size n
사이즈가 n이상인 파일들을 찾는다.
-links n
링크된 개수가 n인 파일들을 찾는다.
-user username
user이름으로 찾는다.
-group groupname
group 이름으로 찾는다.

처리방법 : 찾은 파일을 어떻게 할 것인지를 지정한다.
-print
찾은 파일의 절대 경로명을 화면에 출력한다.
-ls

찾은 내용을 ls처럼 보여줌

-exec cmd {};　
찾은 파일들에 대해 cmd 명령어를 실행한다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Nginx] Restart vs Reload]]></title>
            <link>https://velog.io/@dev-hongs/Nginx-Restart-vs-Reload</link>
            <guid>https://velog.io/@dev-hongs/Nginx-Restart-vs-Reload</guid>
            <pubDate>Fri, 28 Apr 2023 04:19:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>공통점</p>
</blockquote>
<p>Restart와 Reload는 변경된 설정을 적용하기위해 사용합니다.</p>
<blockquote>
<p>차이점</p>
</blockquote>
<p>Restart는 실제로 서버를 shutdown한 후 재시작하는 방식이라면,
Reload 서버를 유지한 채 변경된 설정파일만을 적용하는 방식입니다.</p>
<pre><code>// Restart
sudo service nginx restart

// Reload
nginx -s reload</code></pre><blockquote>
<p>nginx -s [명령어]</p>
</blockquote>
<pre><code>nginx -s reload // 설정 파일을 다시 불러오기
nginx -s quit // 서버 shutdown
nginx -s stop // 서버 즉시 중단
nginx -s reopen // 로그 파일을 다시 열기</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Springboot에서 redis 연동하기]]></title>
            <link>https://velog.io/@dev-hongs/Springboot%EC%97%90%EC%84%9C-redis-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev-hongs/Springboot%EC%97%90%EC%84%9C-redis-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 24 Apr 2023 07:50:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>redisConfig.java</p>
</blockquote>
<pre><code>@Configuration
public class RedisConfig {

    @Value(&quot;${spring.redis.host}&quot;)
    private String redisHost;

    @Value(&quot;${spring.redis.port}&quot;)
    private String redisPort;

    @Value(&quot;${spring.redis.password}&quot;)
    private String redisPassword;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisHost);
        redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort));
        redisStandaloneConfiguration.setPassword(redisPassword);
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate&lt;String, Object&gt; redisTemplate() {
        RedisTemplate&lt;String, Object&gt; redisTemplate = new RedisTemplate&lt;&gt;();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}</code></pre><blockquote>
<p>application.yml</p>
</blockquote>
<pre><code>spring:
  redis:
    lettuce:
      pool:
        max-active: 10
        max-idle: 10
        min-idle: 2
    port: 6379
    host: {서버 IP}
    password: &#39;비밀번호&#39;</code></pre><p><img src="https://velog.velcdn.com/images/dev-hongs/post/c058bf88-fc88-48d4-85d1-fcb7effef7e5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[docker 설치]]></title>
            <link>https://velog.io/@dev-hongs/docker-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dev-hongs/docker-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sat, 22 Apr 2023 08:35:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="docker-설치">Docker 설치</h1>
</blockquote>
<p>apt 업데이트</p>
<pre><code>sudo apt update</code></pre><p>apt HTTPS 설정</p>
<pre><code>sudo apt install apt-transport-https ca-certificates curl software-properties-common</code></pre><p>도커 GPG키 설정 : GPG(GNU Private Guard)는 개인간, 머신간 또는 개인-머신간에 교환되는 메시지나 파일을 암호화하거나 서명을 추가하여 작성자를 확인하고 변조유무를 식별할 수 있게 해주는 도구이다. (기본적으로 RSA와 같은 공개 키 암호화 방식 사용)</p>
<p>도커 GPG키 등록</p>
<pre><code>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></pre><pre><code>&lt;&lt;응답&gt;&gt;
OK</code></pre><p>apt에 도커 Repository 추가</p>
<pre><code>sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable&quot;</code></pre><p>apt 업데이트</p>
<pre><code>sudo apt update</code></pre><p>우분투 Repo 대신 도커 Repo로 설치하는지 확인</p>
<pre><code>apt-cache policy docker-ce</code></pre><pre><code>&lt;&lt;응답&gt;&gt;

docker-ce:
  Installed: (none)
  Candidate: 5:20.10.7~3-0~ubuntu-focal
  Version table:
     5:20.10.7~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     5:20.10.6~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     5:20.10.5~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     5:20.10.4~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
        ...</code></pre><p>도커 설치</p>
<pre><code>sudo apt install docker-ce</code></pre><p>도커 확인</p>
<pre><code>sudo systemctl status docker</code></pre><blockquote>
<h1 id="sudo-없이-도커사용하기">sudo 없이 도커사용하기</h1>
</blockquote>
<p>도커 그룹에 사용자 추가하기</p>
<pre><code>sudo usermod -aG docker ${USER}</code></pre><p>새 그룹 구성원 자격을 적용하기 위해서 다음 명령어를 입력합니다.</p>
<pre><code>sudo su - ${USER}</code></pre><p>도커 그룹 확인하기</p>
<pre><code>id -nG</code></pre><pre><code>&lt;&lt;응답&gt;&gt;

{USER} ... sudo ... docker</code></pre><p>docker.sock 권한 변경</p>
<pre><code>sudo chmod 666 /var/run/docker.sock</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Jenkins x GitLab CI/CD 구축하기]]></title>
            <link>https://velog.io/@dev-hongs/Jenkins-x-GitLab-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev-hongs/Jenkins-x-GitLab-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 17 Apr 2023 14:39:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="jenkins-x-gitlab-연동">jenkins X Gitlab 연동</h2>
</blockquote>
<p>jenkins 관리 &gt; 플러그인 관리 &gt; Available plugins &gt; &quot;gitlab&quot; <code>검색</code></p>
<p>gitlab 설치</p>
<p>Generic Webhook Trigger Plugin 설치</p>
<p>new job &gt; freestyle 생성</p>
<p>소스 코드 관리</p>
<ul>
<li><p>Git</p>
<ul>
<li><p>Repo URL : gitlab repo 주소</p>
</li>
<li><p>Credentials &gt; add &gt; jenkins</p>
<ul>
<li><p>Kind를  &#39;Username with password&#39;로 변경</p>
</li>
<li><table>
<thead>
<tr>
<th><strong>UserName</strong></th>
<th><strong>gitlab 계정 아이디</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Password</strong></td>
<td><strong>gitlab 계정 비밀번호</strong></td>
</tr>
<tr>
<td><strong>id</strong></td>
<td><strong>Credential을 식별하는 아이디</strong></td>
</tr>
<tr>
<td><strong>Description</strong></td>
<td><strong>Credential에 대한 설명</strong></td>
</tr>
</tbody></table>
</li>
</ul>
</li>
<li><p>Branch Specifier 설정</p>
<ul>
<li>/main 혹은 /master 혹은 /develop 등</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>빌드 유발</p>
<ul>
<li>Build when a change is pushed to GitLab. GitLab webhook ... <code>클릭</code><ul>
<li>Push Events 체크</li>
<li>Opened Merge Request Events 체크</li>
</ul>
</li>
</ul>
<p>Build Steps</p>
<ul>
<li><p>Add build step &gt; Execute shell</p>
</li>
<li><p>아래는 테스트 코드임 (나중에 도커빌드 등 코드 입력)</p>
<pre><code>echo &#39;jenkins build started..&#39;</code></pre></li>
</ul>
<p><code>저장</code></p>
<hr>
<p>gitlab 접속</p>
<p>연동할 repo &gt; Settings &gt; Webhooks</p>
<p><img src="https://velog.velcdn.com/images/dev-hongs/post/767e56be-3d04-41b8-a69c-57e4e71307c5/image.png" alt=""></p>
<p>gitlab에서 빨간 네모부분 작성 후 아래로 스크롤하면</p>
<p>Project Hooks가 생성되어 있음.</p>
<p>Test &gt; push events 클릭 -&gt; 젠킨스에서 자동 빌드 되는지 확인</p>
<blockquote>
<h2 id="jenkins-x-deploy-server연동">Jenkins x deploy-server연동</h2>
</blockquote>
<h3 id="jenkins서버">jenkins서버</h3>
<p> 배포서버 EC2 인스턴스로 접근하기 위해서 pem 형식의 ssh 키 생성</p>
<pre><code>sudo mkdir /var/lib/jenkins/.ssh</code></pre><pre><code>ssh-keygen -t rsa -C &quot;키명칭&quot; -m PEM -P &quot;&quot; -f /var/lib/jenkins/.ssh/&quot;키명칭&quot;

ex) sudo ssh-keygen -t rsa -C &quot;jenkins-deploy&quot; -m PEM -P &quot;&quot; -f /var/lib/jenkins/.ssh/jenkins-deploy</code></pre><p>공개키를 검색해서 복사</p>
<pre><code>sudo cat /var/lib/jenkins/.ssh/jenkins-deploy.pub</code></pre><pre><code>ex)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDD4HoSH8EbaSRqbf7hLeIlvvn/TnWX5rxJdAJ69GTdwJWi7hwpc6VX2Em5NUHXcE2gGsgFjCNeP1WVMacc3K+F+SCi7R2mpXZh/xbNbykPjBhDc/XtsaCOcyrgO9BvVzJ5Q6NVtn5UbFr+r7/VpcMvfe9/Nn+aIk/t4ZBxs7PZFRfJxXXf/c5Is6oGYInn13hzSq9bhk52FWFG/WtK1Ymm9SLPy2lhtghcbQJ8BZ9CEIfPt8cvEopWHGIzmIMrhgMFk/iQef7Ka/QdQwJiBDEtaQfmOP8fn1Xz0IE4S1jj2s+NoZcsJDoyVlCox3zRzOKuOELZXrlOezvClCGs6j+bo//K8GLjoYg4tQaFOaXd/V2k5KzBqU7flk3ITvAnaTu0CjmzgNrHQ5l7LbhrxTP/WgNYpkxH8sJOgt7E0bbUzuYML+H7heAPZrjZQR3ktzcuDTQv0/G9hHj6ikI9C232U322MGxQmmK9xRBhTDCiqSkkQz3CFAk3X4Zi67qtwiE= jenkins-deploy</code></pre><blockquote>
<h3 id="배포서버-사전에-docker-설치">배포서버 (사전에 docker 설치)</h3>
</blockquote>
<p> pub키 등록</p>
<p>ec2 접속 후 아래 명령어 입력하여 상술한 공개키 추가하기(아랫줄에 추가)</p>
<pre><code>sudo nano .ssh/authorized_keys</code></pre><h3 id="jenkins-사이트에-접속">jenkins 사이트에 접속</h3>
<p>publish over ssh 플러그인</p>
<p>jenkins 관리 &gt; 플러그인 관리 &gt; 설치가능 탭에서 publish over ssh 플러그인 설치</p>
<p>jenkins 관리 &gt; 시스템 관리 &gt; publish over ssh 영역의 SSH servers 추가버튼 클릭</p>
<p>Path to Key는 Private key의 경로를 작성</p>
<pre><code>/var/lib/jenkins/.ssh/jenkins-deploy</code></pre><p>Key는 Private key 파일안의 내용을 복사 붙여넣기</p>
<pre><code>sudo cat /var/lib/jenkins/.ssh/jenkins-deploy</code></pre><pre><code>ex)
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----</code></pre><p>Name은 접속할 ssh 서버의 이름을 작성</p>
<pre><code>ex) deploy-server</code></pre><p>hostname은 접속할 인스턴스의 주소(배포서버 ip)</p>
<pre><code>ex) 52.78.76.246</code></pre><p>username은 접속할 유저명</p>
<pre><code>ex) ubuntu</code></pre><p><img src="https://velog.velcdn.com/images/dev-hongs/post/d708c012-c69a-457f-9407-eb4ec7996fe8/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev-hongs/post/8ff73a4a-6aaf-4370-88b2-6c142fd7ab3f/image.png" alt=""></p>
<hr>
<p>Jenkins freestyle</p>
<ul>
<li><p>빌드 환경 (publish over ssh 플러그인 설치를 미리해야함)</p>
<ul>
<li><p>Send files or execute commands over SSH after the build runs</p>
<ul>
<li><p>Name : 배포 서버 이름 입력</p>
</li>
<li><p>Exec command : 배포 서버에서 실행할 명령어 입력</p>
<pre><code>sudo docker ps -q --filter name=test | grep -q . &amp;&amp; sudo docker rm -f $(sudo         docker ps -aq --filter name=test)
sudo docker rmi repo/test
sudo docker pull repo/test
sudo docker run --rm -d --name test -p 8090:8090 repo/test</code></pre></li>
</ul>
</li>
</ul>
</li>
<li><p>Build Steps</p>
</li>
</ul>
<p>​    <strong>Execute shell</strong></p>
<pre><code>cd BE
chmod +x gradlew
./gradlew clean build --exclude-task test</code></pre><pre><code>cd BE
docker build -t {도커 이미지} .
docker push {도커 이미지}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[linux에 jenkins 설치]]></title>
            <link>https://velog.io/@dev-hongs/linux%EC%97%90-jenkins-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dev-hongs/linux%EC%97%90-jenkins-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 17 Apr 2023 14:30:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h2 id="jdk-설치">jdk 설치</h2>
</blockquote>
<p>openjdk-11-jdk 설치</p>
<pre><code>sudo apt-get update</code></pre><pre><code>sudo apt-get install openjdk-11-jdk</code></pre><hr>
<blockquote>
<h2 id="jenkins-설치">jenkins 설치</h2>
</blockquote>
<p>jenkins 설치에 필요한 패키지 업데이트</p>
<pre><code>wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -</code></pre><pre><code>echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list</code></pre><pre><code>sudo apt update</code></pre><p>패키지 업데이트 간 GPG ERROR 발생시 (Error 로그에 16자리키 활용)</p>
<pre><code>sudo apt-key adv --keyserver  keyserver.ubuntu.com --recv-keys [16자리키]</code></pre><p>jenkins 설치 및 실행 확인</p>
<pre><code>sudo apt install jenkins</code></pre><pre><code>sudo systemctl status jenkins</code></pre><p>Active 상태 확인</p>
<pre><code class="language-shell">● jenkins.service - LSB: Start Jenkins at boot time
     Loaded: loaded (/etc/init.d/jenkins; generated)
     Active: active (exited) since Mon 2021-07-19 07:52:33 UTC; 1min 14s ago
       Docs: man:systemd-sysv-generator(8)
      Tasks: 0 (limit: 1160)
     Memory: 0B
     CGroup: /system.slice/jenkins.service

Jul 19 07:52:32 ip-172-31-14-198 systemd[1]: Starting LSB: Start Jenkins at boot time...
Jul 19 07:52:32 ip-172-31-14-198 jenkins[7146]: Correct java version found
Jul 19 07:52:32 ip-172-31-14-198 jenkins[7146]:  * Starting Jenkins Automation Server jenkins
Jul 19 07:52:32 ip-172-31-14-198 su[7189]: (to jenkins) root on none
Jul 19 07:52:32 ip-172-31-14-198 su[7189]: pam_unix(su-l:session): session opened for user jenkins by (uid=0)
Jul 19 07:52:32 ip-172-31-14-198 su[7189]: pam_unix(su-l:session): session closed for user jenkins
Jul 19 07:52:33 ip-172-31-14-198 jenkins[7146]:    ...done.
Jul 19 07:52:33 ip-172-31-14-198 systemd[1]: Started LSB: Start Jenkins at boot time.</code></pre>
<p>jenkins 접속</p>
<pre><code>http://{ip 주소}:8080</code></pre><p>비밀번호 입력 (아래 명령어 입력해서 초기비밀번호 get)</p>
<pre><code>sudo cat /var/lib/jenkins/secrets/initialAdminPassword</code></pre><pre><code>ex) 0f4a6eca53174a70a4b2f11a0600ab34</code></pre><p><code>Install suggested plugins</code> 클릭해서 설치</p>
<p><code>계정 생성</code></p>
<p>(jenkins 타임존 설정: 빌드 시간을 한국시간으로 확인하려면 수행)</p>
<p>jenkins 관리 &gt; Script Console(맨 아래쪽에 있음) &gt; 아래코드 복붙 &gt; 실행</p>
<pre><code>System.setProperty(&#39;org.apache.commons.jelly.tags.fmt.timeZone&#39;, &#39;Asia/Seoul&#39;)</code></pre><blockquote>
<h2 id="docker-설치">Docker 설치</h2>
</blockquote>
<p>apt 업데이트</p>
<pre><code>sudo apt update</code></pre><p>apt HTTPS 설정</p>
<pre><code>sudo apt install apt-transport-https ca-certificates curl software-properties-common</code></pre><p>도커 GPG키 설정 : GPG(GNU Private Guard)는 개인간, 머신간 또는 개인-머신간에 교환되는 메시지나 파일을 암호화하거나 서명을 추가하여 작성자를 확인하고 변조유무를 식별할 수 있게 해주는 도구이다. (기본적으로 RSA와 같은 공개 키 암호화 방식 사용)</p>
<p> 도커 GPG키 등록</p>
<pre><code>curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></pre><pre><code>&lt;&lt;응답&gt;&gt;
OK</code></pre><p>apt에 도커 Repository 추가</p>
<pre><code>sudo add-apt-repository &quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable&quot;</code></pre><p>apt 업데이트</p>
<pre><code>sudo apt update</code></pre><p>우분투 Repo 대신 도커 Repo로 설치하는지 확인</p>
<pre><code>apt-cache policy docker-ce</code></pre><p>&lt;&lt;응답&gt;&gt;</p>
<pre><code class="language-bash">docker-ce:
  Installed: (none)
  Candidate: 5:20.10.7~3-0~ubuntu-focal
  Version table:
     5:20.10.7~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     5:20.10.6~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     5:20.10.5~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
     5:20.10.4~3-0~ubuntu-focal 500
        500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
        ...</code></pre>
<p>도커 설치</p>
<pre><code>sudo apt install docker-ce</code></pre><p> 도커 확인</p>
<pre><code>sudo systemctl status docker</code></pre><p>sudo 없이 도커사용하기</p>
<p>도커 그룹에 사용자 추가하기</p>
<pre><code>sudo usermod -aG docker ${USER}</code></pre><p>새 그룹 구성원 자격을 적용하기 위해서 다음 명령어를 입력합니다.</p>
<pre><code>sudo su - ${USER}</code></pre><p>도커 그룹 확인하기</p>
<pre><code>id -nG</code></pre><p>&lt;&lt;응답&gt;&gt;</p>
<pre><code>{USER} ... sudo ... docker</code></pre><p>docker.sock 권한 변경</p>
<pre><code>sudo chmod 666 /var/run/docker.sock</code></pre><p>Jenkins에서 Docker login</p>
<pre><code>sudo su - jenkins
docker login</code></pre><pre><code>도커허브 로그인
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[linux에 jdk11 설치]]></title>
            <link>https://velog.io/@dev-hongs/linux%EC%97%90-jdk-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dev-hongs/linux%EC%97%90-jdk-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 17 Apr 2023 14:27:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>openjdk-11-jdk 설치</p>
</blockquote>
<pre><code>sudo apt-get update</code></pre><pre><code>sudo apt-get install openjdk-11-jdk</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[linux에서 용량 큰 파일 찾기]]></title>
            <link>https://velog.io/@dev-hongs/linux%EC%97%90%EC%84%9C-%EC%9A%A9%EB%9F%89-%ED%81%B0-%ED%8C%8C%EC%9D%BC-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@dev-hongs/linux%EC%97%90%EC%84%9C-%EC%9A%A9%EB%9F%89-%ED%81%B0-%ED%8C%8C%EC%9D%BC-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Mon, 17 Apr 2023 14:26:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>용량 큰 파일 찾기</p>
</blockquote>
<pre><code>du -h --max-depth=1 | sort -hr</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Docker 로그집중화 : Log Aggregation with papertrail & logspout]]></title>
            <link>https://velog.io/@dev-hongs/Log-Aggregation</link>
            <guid>https://velog.io/@dev-hongs/Log-Aggregation</guid>
            <pubDate>Mon, 17 Apr 2023 14:22:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="시작하기">시작하기</h1>
</blockquote>
<ol>
<li>papertrail 웹사이트 접속</li>
</ol>
<p><a href="https://www.papertrail.com/">https://www.papertrail.com/</a></p>
<ol start="2">
<li><p>회원가입 진행</p>
</li>
<li><p>이메일 인증(회원가입 시 입력한 이메일에서 인증하시면 됩니다.)</p>
</li>
<li><p><a href="https://papertrailapp.com/start">https://papertrailapp.com/start</a> 사이트에서 <code>Add your first system</code> 클릭</p>
</li>
</ol>
<p>​<img src="https://velog.velcdn.com/images/dev-hongs/post/4c35fcb0-f1df-4387-a64e-44a3407a64ee/image.png" alt=""></p>
<hr>
<blockquote>
<h1 id="도커로-logspout-컨테이너-실행하기">도커로 logspout 컨테이너 실행하기</h1>
</blockquote>
<pre><code>로그스파우트
유닉스 세계에는 큰 문제를 풀기 위해 작은 프로그램을 통합하는 오랜 전통이 있다. 로그스파우트(Logspout)에도 도커 컨테이너의 로그를 관리하는 데 마찬가지 철학이 담겨 있다. 로그스파우트는 설정한 호스트의 모든 컨테이너에서 로그(주로 stdout(Standard Output), stderr(Standard Error))를 가져온다. 이 결과 취합된 로그는 HTTP 스트림을 읽어 실시간으로 간편하게 확인할 수 있다. 

원문보기:
https://www.itworld.co.kr/t/35/+/121392#csidx48a6e5afc874040b2aff5cde7d28a00 </code></pre><blockquote>
<h2 id="on-ec2-ubuntu">On EC2 (Ubuntu)</h2>
</blockquote>
<ol>
<li>logspout 이미지 다운로드</li>
</ol>
<pre><code>docker pull gliderlabs/logspout:latest</code></pre><ol start="2">
<li>papertrail setup (<a href="https://papertrailapp.com/systems/setup?type=system&amp;platform=unix">https://papertrailapp.com/systems/setup?type=system&amp;platform=unix</a>)</li>
</ol>
<p>​    빨간 박스에 해당하는 부분을 복사하여 EC2에 붙여넣기 후 실행</p>
<p>  <img src="https://velog.velcdn.com/images/dev-hongs/post/ec02c5bf-8ef1-453f-86db-9b773b820d5e/image.png" alt=""></p>
<p>​    그러면 아래와 같이 setup이 완료된 모습을 볼 수 있음
  <img src="https://velog.velcdn.com/images/dev-hongs/post/5e3d2c5c-c47b-4ef4-845b-ff405cfa549f/image.png" alt=""></p>
<ol start="3">
<li>아래 빨간 네모박스 (logsN.papertrailapp.com:port) 부분을 복사</li>
</ol>
<p><img src="https://velog.velcdn.com/images/dev-hongs/post/8c01f511-ed3f-4045-be2f-59d4d7a83777/image.png" alt=""></p>
<ol start="4">
<li>logspout (위에서 복사한 내용으로 {logsN.papertrailapp.com:port} 부분 대체) 컨테이너 실행</li>
</ol>
<pre><code>docker run --name logspout --restart=always -d -v=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout:latest syslog+tls://{logsN.papertrailapp.com:port}</code></pre><p>예시</p>
<pre><code>docker run --name logspout --restart=always -d -v=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout:latest syslog+tls://logs3.papertrailapp.com:20274</code></pre><hr>
<h1 id="컨테이너-실행하기로그-옵션-설정">컨테이너 실행하기(로그 옵션 설정)</h1>
<h2 id="on-ec2-ubuntu-1">On EC2 (Ubuntu)</h2>
<p>예시1 (Flask)</p>
<pre><code>sudo docker run --rm -d -v /home/ubuntu/:/test/api_key -p 5006:5006 --name flask\
--log-driver=syslog\
--log-opt syslog-address=udp://logs3.papertrailapp.com:20274\
--log-opt tag=Flask\
{도커 이미지}</code></pre><p>예시2 (SpringBoot)</p>
<pre><code>sudo docker run --rm -d --name springboot -p 8090:8090\
--log-driver=syslog\
--log-opt syslog-address=udp://logs3.papertrailapp.com:20274\
--log-opt tag=SpringBoot\
{도커 이미지}</code></pre><p>Events탭(<a href="https://my.papertrailapp.com/events)%EC%97%90%EC%84%9C">https://my.papertrailapp.com/events)에서</a> 로그를 확인할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/dev-hongs/post/32acf997-0ad6-483a-bcd7-b949d6f0d185/image.png" alt=""></p>
<hr>
<h1 id="로깅-툴-활용">로깅 툴 활용</h1>
<p><img src="https://velog.velcdn.com/images/dev-hongs/post/ae9bf358-8ae9-4867-9542-3a47d0dcf12d/image.png" alt=""></p>
<p>설정을 통해 글씨체, 테마 등을 변경할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[linux에서 process name으로 pid 찾아서 kill 하기]]></title>
            <link>https://velog.io/@dev-hongs/linux%EC%97%90%EC%84%9C-process-name%EC%9C%BC%EB%A1%9C-pid-%EC%B0%BE%EC%95%84%EC%84%9C-kill-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev-hongs/linux%EC%97%90%EC%84%9C-process-name%EC%9C%BC%EB%A1%9C-pid-%EC%B0%BE%EC%95%84%EC%84%9C-kill-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 17 Apr 2023 14:16:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="python3-프로세스-종료하기">python3 프로세스 종료하기</h1>
</blockquote>
<pre><code class="language-bash">pkill -9 -ef python3</code></pre>
<p>-9 : KILL 신호를 보내라는 뜻
-e : 로그 출력 옵션
-f : 명령행 전체 참조 옵션</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 메모리 부족현상 해결 (스왑메모리 할당)]]></title>
            <link>https://velog.io/@dev-hongs/AWS-EC2-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B6%80%EC%A1%B1%ED%98%84%EC%83%81-%ED%95%B4%EA%B2%B0-%EC%8A%A4%EC%99%91%EB%A9%94%EB%AA%A8%EB%A6%AC</link>
            <guid>https://velog.io/@dev-hongs/AWS-EC2-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B6%80%EC%A1%B1%ED%98%84%EC%83%81-%ED%95%B4%EA%B2%B0-%EC%8A%A4%EC%99%91%EB%A9%94%EB%AA%A8%EB%A6%AC</guid>
            <pubDate>Mon, 17 Apr 2023 13:03:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>dd 명령어를 통해 swap 메모리를 할당합니다.
(128씩 16개의 공간을 만드는 것이여서 우리의 경우 count를 16으로 할당하는 것이 좋습니다. 즉, 2GB정도 차지합니다.)</p>
</blockquote>
<pre><code>sudo dd if=/dev/zero of=/swapfile bs=128M count=16</code></pre><blockquote>
<p>스왑 파일에 대한 읽기 및 쓰기 권한을 업데이트합니다.</p>
</blockquote>
<pre><code>sudo chmod 600 /swapfile</code></pre><blockquote>
<p>Linux 스왑 영역을 설정합니다.</p>
</blockquote>
<pre><code>sudo mkswap /swapfile</code></pre><blockquote>
<p>스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 만듭니다.</p>
</blockquote>
<pre><code>sudo swapon /swapfile</code></pre><blockquote>
<p>절차가 성공했는지 확인합니다.</p>
</blockquote>
<pre><code>sudo swapon -s</code></pre><blockquote>
<p><strong>/etc/fstab</strong> 파일을 편집하여 부팅 시 스왑 파일을 활성화합니다.
편집기에서 파일을 엽니다.</p>
</blockquote>
<pre><code>sudo nano /etc/fstab</code></pre><blockquote>
<p>파일 끝에 다음 줄을 새로 추가하고 파일을 저장한 다음 종료합니다.</p>
</blockquote>
<pre><code>/swapfile swap swap defaults 0 0</code></pre><blockquote>
<p>다음과 같이 적용됬는지 확인을 해봅니다.</p>
</blockquote>
<pre><code>free</code></pre><p><img src="https://velog.velcdn.com/images/dev-hongs/post/cf835cd8-89e5-4e7f-b563-d83e53add747/image.png" alt=""></p>
<blockquote>
<p>참고</p>
</blockquote>
<p><a href="https://sundries-in-myidea.tistory.com/102">https://sundries-in-myidea.tistory.com/102</a> 사이트 참고  (메모리 부족 현상 해결)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git 자동로그인 설정]]></title>
            <link>https://velog.io/@dev-hongs/git-%EC%9E%90%EB%8F%99%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@dev-hongs/git-%EC%9E%90%EB%8F%99%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Mon, 17 Apr 2023 12:59:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>사용자 정보를 저장합니다.</p>
</blockquote>
<pre><code>git config --global user.name &quot;이름&quot;</code></pre><pre><code>git config --global user.email &quot;git@email&quot;</code></pre><blockquote>
<p>인증 이력을 캐시에 저장하도록 설정합니다</p>
</blockquote>
<pre><code>git config credential.helper store</code></pre><blockquote>
<p>최초 1회 git login을 수행합니다. (ex. git pull)</p>
</blockquote>
<pre><code>Username for &#39;본인아이디&#39;
Password for &#39;본인 비밀번호&#39;</code></pre><blockquote>
<p>계정을 입력한 후에는 정보가 서버에 저장되어 매번 아이디/비밀번호를 입력하지 않아도 됩니다.</p>
</blockquote>
<hr>
<blockquote>
<p>(선택사항) 계정 정보 유효시간을 설정합니다</p>
</blockquote>
<pre><code>git config --global credential.helper &#39;cache --timeout 7200&#39;

2시간 - 7200
1일 - 86400
7일 - 604800
30일 - 2592000</code></pre><blockquote>
<p>참고:</p>
</blockquote>
<p><a href="https://git-scm.com/docs/git-credential-cache">https://git-scm.com/docs/git-credential-cache</a>
<a href="https://tae-hui.tistory.com/entry/ubuntuGit-%EC%95%84%EC%9D%B4%EB%94%94-%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0?category=881302">https://tae-hui.tistory.com/entry/ubuntuGit-%EC%95%84%EC%9D%B4%EB%94%94-%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0?category=881302</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2에 Redis 설치하기]]></title>
            <link>https://velog.io/@dev-hongs/AWS-EC2%EC%97%90-Redis-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dev-hongs/AWS-EC2%EC%97%90-Redis-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 17 Apr 2023 12:56:24 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>사전에 aws 인바운드 규칙에 6379 tcp 포트 허용해주기</p>
</blockquote>
<hr>
<blockquote>
<p>ubuntu에 redis 설치</p>
</blockquote>
<pre><code>sudo apt update
sudo apt install redis-server</code></pre><blockquote>
<p>레디스 상태 확인</p>
</blockquote>
<pre><code>sudo systemctl status redis</code></pre><blockquote>
<p>포트 개방 (외부 접속 허용)</p>
</blockquote>
<pre><code>sudo nano /etc/redis/redis.conf</code></pre><pre><code>127.0.0.1 ::1 (변경 전)
0.0.0.0 (변경 후)</code></pre><pre><code>ctrl + s (저장)
ctrl + x (나가기)</code></pre><blockquote>
<p>redis 재실행</p>
</blockquote>
<pre><code>sudo systemctl restart redis</code></pre><blockquote>
<p>포트가 열렸는지 확인</p>
</blockquote>
<pre><code>sudo netstat -nltp | grep 6379</code></pre><hr>
<blockquote>
<p>redis  서버에 접속</p>
</blockquote>
<pre><code>redis-cli</code></pre><blockquote>
<p>redis 비밀번호 설정</p>
</blockquote>
<pre><code>redis-cli</code></pre><pre><code>CONFIG SET requirepass &quot;비밀번호&quot;</code></pre><blockquote>
<p>비밀번호 확인</p>
</blockquote>
<pre><code>redis-cli</code></pre><pre><code>&gt; ping</code></pre><pre><code>&gt; (error) NOAUTH Authentication required.
비밀번호 인증을 하지 않았기 때문에 error가 발생합니다.</code></pre><hr>
<pre><code>&gt; AUTH &quot;비밀번호&quot;</code></pre><pre><code>&gt; ping</code></pre><pre><code>&gt; pong</code></pre><blockquote>
<p>set을 사용해서 key-value로 데이터를 입력</p>
</blockquote>
<pre><code>set [key] [value]</code></pre><blockquote>
<p>get[key]로 데이터 값을 조회</p>
</blockquote>
<pre><code>get[key]</code></pre><blockquote>
<p>지정된 key를 검색</p>
</blockquote>
<pre><code>keys *검색어*</code></pre><blockquote>
<p>전체 key 조회</p>
</blockquote>
<pre><code>keys *</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2에 MariaDB 설치]]></title>
            <link>https://velog.io/@dev-hongs/AWS-EC2%EC%97%90-MariaDB-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@dev-hongs/AWS-EC2%EC%97%90-MariaDB-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Mon, 17 Apr 2023 12:41:12 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>apt 업데이트</p>
</blockquote>
<pre><code>sudo apt update</code></pre><blockquote>
<p>MariaDB 설치</p>
</blockquote>
<pre><code>sudo apt install mariadb-server</code></pre><pre><code>sudo apt install mariadb-client</code></pre><pre><code>sudo mysql_secure_installation</code></pre><blockquote>
<p>mariaDB 접속</p>
</blockquote>
<pre><code>sudo mysql -u root -p</code></pre><blockquote>
<p>DB의 목록을 확인</p>
</blockquote>
<pre><code>show databases;</code></pre><blockquote>
<p>버전 확인</p>
</blockquote>
<pre><code>select version();</code></pre><hr>
<blockquote>
<p>데이터베이스 생성</p>
</blockquote>
<pre><code>create database {db이름};</code></pre><blockquote>
<p>아이디 생성
@&#39;%&#39;: 모든 클라이언트에서 접근이 가능합니다
@&#39;localhost&#39;: 해당 컴퓨터에서만 접근이 가능합니다</p>
</blockquote>
<pre><code>create user &#39;{username}&#39;@&#39;%&#39; identified by &#39;{password}&#39;; 
create user &#39;{username}&#39;@&#39;localhost&#39; identified by &#39;{password}&#39;; </code></pre><blockquote>
<p>사용자 권한 주기</p>
</blockquote>
<pre><code>GRANT ALL PRIVILEGES ON *.* TO &#39;{username}&#39;@&#39;%&#39;; // 모든 데이터베이스의 모든 테이블에 대한 권한 부여(*.*이 모든 테이블을 의미함)

GRANT ALL PRIVILEGES ON {DB이름}.* TO &#39;{username}&#39;@&#39;%&#39;; // 특정 DB에 모든 권한 부여

GRANT select, insert, update PRIVILEGES ON *.* TO &#39;{username}&#39;@&#39;%&#39;; // 특정 DB에 특정 권한 부여
</code></pre><blockquote>
<p>새로고침(변경한 권한을 즉시 반영해주는 명령어)</p>
</blockquote>
<pre><code>FLUSH PRIVILEGES;</code></pre><hr>
<blockquote>
<p>heidiSQL로 접속이 안될경우 (10061) 외부접근을 허용해주어야한다.</p>
</blockquote>
<blockquote>
<p>mariaDB 외부접근 설정</p>
</blockquote>
<pre><code>sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf</code></pre><pre><code class="language-bash">#bind-address = 127.0.0.1 (변경 전)
bind-address = 0.0.0.0</code></pre>
<pre><code>sudo systemctl restart mariadb</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[AWS EC2 볼륨 확장]]></title>
            <link>https://velog.io/@dev-hongs/AWS-EC2-%EB%B3%BC%EB%A5%A8-%ED%99%95%EC%9E%A5</link>
            <guid>https://velog.io/@dev-hongs/AWS-EC2-%EB%B3%BC%EB%A5%A8-%ED%99%95%EC%9E%A5</guid>
            <pubDate>Mon, 17 Apr 2023 12:27:44 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>AWS에서 볼륨 수정</p>
</li>
<li><p>EC2에서 용량 적용</p>
<ul>
<li><p>용량 확인</p>
<pre><code>lsblk</code></pre></li>
<li><p>용량 적용</p>
<pre><code>sudo growpart /dev/xvda 1</code></pre></li>
<li><p>용량 확인</p>
<pre><code>lsblk</code></pre></li>
</ul>
</li>
</ol>
<ol start="3">
<li><p>리눅스 파일 시스템에 확장</p>
<pre><code>sudo resize2fs /dev/root</code></pre></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[쉘 스크립트 작성법]]></title>
            <link>https://velog.io/@dev-hongs/%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%91%EC%84%B1%EB%B2%95</link>
            <guid>https://velog.io/@dev-hongs/%EC%89%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%91%EC%84%B1%EB%B2%95</guid>
            <pubDate>Mon, 17 Apr 2023 12:25:37 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p>쉘 파일을 생성합니다.</p>
<pre><code>touch test.sh</code></pre></li>
<li><p>쉘 파일에 대한 권한 설정을 합니다.</p>
<pre><code>sudo chmod 755 test.sh

소유자 rwx
그룹 r-x
기타 r-x</code></pre></li>
</ol>
<ol start="3">
<li><p>vi 혹은 nano 등 편집기로 쉘 파일을 수정합니다</p>
<pre><code>sudo nano test.sh</code></pre><pre><code>#!/bin/bash

echo &quot;Hello World&quot;</code></pre><pre><code>(저장 : ctrl + s)
(나가기: ctrl + x)</code></pre></li>
</ol>
<ol start="4">
<li><p>쉘 파일을 실행합니다.</p>
<pre><code>sh test.sh
bash test.sh</code></pre><pre><code># 결과

Hello World</code></pre></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[Python(Flask) API Key 분리]]></title>
            <link>https://velog.io/@dev-hongs/63ajgqb2</link>
            <guid>https://velog.io/@dev-hongs/63ajgqb2</guid>
            <pubDate>Mon, 17 Apr 2023 12:08:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h1 id="방법-1--컨테이너-환경-변수-설정">방법 1 : 컨테이너 환경 변수 설정</h1>
</blockquote>
<p>docker 컨테이너 실행시 환경 변수를 설정합니다. (key-value 쌍)</p>
<pre><code class="language-bash">sudo docker run --rm -d -e API_KEY=&quot;...&quot; -p 5006:5006 {도커 이미지}</code></pre>
<p>Python 파일에서는 os.getenv() 함수로 환경변수 API_KEY(key)의 value값을 호출합니다.</p>
<pre><code class="language-python">import os
API_KEY = os.getenv(&#39;API_KEY&#39;)
print(API_KEY) </code></pre>
<hr>
<blockquote>
<h1 id="방법-2--도커--v-옵션-활용">방법 2 : 도커 -v 옵션 활용</h1>
</blockquote>
<p>(참고: 아래 예시는 Jenkins에서 Publish Over SSH 플러그인을 활용한 경우 입니다.)
jenkins : Send files or execute commands over SSH after the build runs ...</p>
<pre><code class="language-bash">...

sudo docker run --rm -d -v /home/ubuntu/:/test/api_key -p 5006:5006 {도커 이미지}</code></pre>
<p>여기서 호스트 /home/ubuntu == 컨테이너 /test/api_key 는 완벽히 같은 디렉토리입니다.</p>
<pre><code class="language-python"># /test/api_key/OPENAI.py
OPENAI_API_KEY = &quot;...&quot;</code></pre>
<p>Python 파일에서는</p>
<pre><code class="language-python">from api_key import OPENAI
import openai

# 발급받은 API 키 설정 (호스트의 디렉토리를 볼륨하는 방법)
        OPENAI_API_KEY = OPENAI.OPENAI_API_KEY

        openai.api_key = OPENAI_API_KEY
</code></pre>
<p>test/api_key/ 디렉토리에 존재하는 OPENAI.py를 import한 후, 내부에 존재하는 OPENAI_API_KEY 변수를 호출하여 사용하는 방식입니다.</p>
]]></description>
        </item>
    </channel>
</rss>