<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>우성짱의 NAS &amp;gt; 블로그 &amp;gt; 작업실</title>
<link>https://www.wsgvet.com/home</link>
<language>ko</language>
<description>작업실 (2020-10-10 18:42:00)</description>

<item>
<title>그누보드 SMTP 외부메일 설정하는 방법</title>
<link>https://www.wsgvet.com/home/681</link>
<description><![CDATA[<p>예전에 우분투 20.04에서 구글 SMTP메일서버를 활용한 postfix 메일 보내기( <a href="https://www.wsgvet.com/home/594" rel="nofollow">https://www.wsgvet.com/home/594</a> )를 소개해드렸습니다.</p><p><br /></p><p>그런데 찾아보니 구글 SMTP 쓰려면 그냥 그누보드에 있는 PHPMailer를 쓰면 되더라구요 -_-;;;</p><p><br /></p><p>테스트해보니 잘 되네요.</p><p><br /></p><p>구글 지메일 계정 기준으로 설명드리겠습니다.</p><p><br /></p><p><span style="font-size:24pt;"><b>config.php 수정하기</b></span></p><p><br /></p><p>/config.php 173~176번째 줄에 있는</p><p><br /></p><p>[code=php]</p><p>// SMTP</p><p>// lib/mailer.lib.php 에서 사용</p><p>define('G5_SMTP',      '127.0.0.1');</p><p>define('G5_SMTP_PORT', '25');</p><p>[/code]</p><p><br /></p><p>위 내용을</p><p><br /></p><p>[code=php]</p><p>// SMTP</p><p>// lib/mailer.lib.php 에서 사용</p><p>define('G5_SMTP',        'smtp.gmail.com');</p><p>define('G5_SMTP_PORT',              '587');</p><p>define('G5_SMTP_SECURE',            'TLS');</p><p>define('G5_SMTP_USER', 'yourid@gmail.com');</p><p>define('G5_SMTP_PW',        'yourpassword');</p><p>[/code]</p><p><br /></p><p>위와 같이 설정합니다.</p><p><br /></p><p>구글 SMTP가 아닌 다른 곳을 쓰려면 smtp.gmail.com 대신 해당 SMTP 주소를 넣어주면 됩니다.</p><p><br /></p><p>587포트가 아닌 443이나 465포트가 필요하다면 바꿔주면 됩니다.</p><p><br /></p><p>암호화 방법이 <b>TLS</b>가 아닌 <b>STARTTLS</b>를 선택해야된다면 <b>'TLS'</b> 대신에 <b>'STARTTLS'</b>를 넣으면 됩니다.</p><p><br /></p><p>yourid@gmail.com 대신에 자신의 지메일 주소를 넣으면 됩니다.<br /></p><p><br /></p><p>yourpassword 대신에 자신의 앱 비밀번호를 넣으면 됩니다.<br /></p><p><br /></p><p>앱 비밀번호 설정은 <a href="https://www.wsgvet.com/home/594" rel="nofollow">https://www.wsgvet.com/home/594</a> 여기 2번을 참조하세요.</p><p><br /></p><p>앱 비밀번호가 <b>xxxx yyyy zzzz xxxx</b> 이렇게 나오는데요.</p><p><br /></p><p><b>xxxxyyyyzzzzxxxx</b> 이렇게 띄어쓰기 부분을 합쳐서 넣으면 됩니다.</p><p><br /></p><p><br /></p><p><b><span style="font-size:24pt;">mailer.lib.php 수정하기</span></b></p><p><br /></p><p>/lib/mailer.lib.php 19번째 줄부터</p><p><br /></p><p>[code=php]</p><p>$mail = new PHPMailer(); // defaults to using php "mail()"</p><p>if (defined('G5_SMTP') &amp;&amp; G5_SMTP) {</p><p>    $mail-&gt;IsSMTP(); // telling the class to use SMTP</p><p>    $mail-&gt;Host = G5_SMTP; // SMTP server</p><p>    if(defined('G5_SMTP_PORT') &amp;&amp; G5_SMTP_PORT)</p><p>        $mail-&gt;Port = G5_SMTP_PORT;</p><p>    }</p><p>[/code]</p><p><br /></p><p>위 내용을</p><p><br /></p><p>[code=php]</p><p>$mail = new PHPMailer(); // defaults to using php "mail()"</p><p>if (defined('G5_SMTP') &amp;&amp; G5_SMTP) {</p><p>    $mail-&gt;IsSMTP(); // telling the class to use SMTP</p><p>    $mail-&gt;Host = G5_SMTP; // SMTP server</p><p>    if(defined('G5_SMTP_PORT') &amp;&amp; G5_SMTP_PORT)</p><p>        $mail-&gt;Port = G5_SMTP_PORT;</p><p>        /* 추가 시작 */</p><p>        $mail-&gt;SMTPAuth = true;</p><p>        $mail-&gt;AuthType = "LOGIN";  // 이건 있어도 없어도 상관없는 듯 합니다.</p><p>        $mail-&gt;SMTPSecure = G5_SMTP_SECURE;</p><p>        $mail-&gt;Username = G5_SMTP_USER;</p><p>        $mail-&gt;Password = G5_SMTP_PW;</p><p>        /* 추가 끝 */</p><p>    }</p><p>[/code]</p><p><br /></p><p>위와 같이 추가해줍니다.</p><p><br /></p><p>465, 587 포트는 안열어도 잘 갑니다. </p><p><br /></p><p>정말 쉽죠?</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>참고 사이트</b></span></p><p><br /></p><p>gmail smtp 함수 : <a href="https://sir.kr/g5_tip/9778" rel="nofollow">https://sir.kr/g5_tip/9778</a></p><p><br /></p><p>그누보드 5.4 외부메일 사용법 : <a href="https://sir.kr/qa/340893" rel="nofollow">https://sir.kr/qa/340893</a></p>]]></description>
<dc:creator>우성짱</dc:creator>
<dc:date>2020-10-10T18:42:00+09:00</dc:date>
</item>


<item>
<title>그누보드5에 실시간 채팅 구축하기</title>
<link>https://www.wsgvet.com/home/678</link>
<description><![CDATA[<p>현재 제 홈페이지에 있는 실시간 채팅 기능 적용방법을 알려드리겠습니다.</p><p><br /></p><p>원래 기능이 더 업그레이드되면 올리려고 했는데, 언제 업그레이드가 될지 몰라 먼저 올립니다. ㅎㅎ</p><p><br /></p><p>업그레이드 되어도 같은 방식으로 구축하면 되니 괜찮을 것 같습니다.</p><p><br /></p><p>아시겠지만 웹서버에 nodejs가 설치되고, node 명령어를 내릴 수 있어야됩니다.</p><p><br /></p><p>일반적인 웹호스팅 환경에서는 불가능합니다.</p><p><br /></p><p><br /></p><p>채팅 소스 : <a href="https://sir.kr/g5_plugin/7029" rel="nofollow">https://sir.kr/g5_plugin/7029</a></p><p><br /></p><p>와칸다포에버님의 소스를 조윤진님이 수정한 버전입니다.</p><p><br /></p><p>사용자 채팅 차단 기능이 있어 전체 채팅에 충분히 쓸만합니다.</p><p><br /></p><p>저는 도커를 이용하고 있는데, 방화벽만 오픈되어 있다면 어디서든 가능할 것 같습니다.</p><p><br /></p><p>그리고 HTTPS 환경에서 구축하는 방법도 포함되어 있습니다.</p><p><br /></p><p>마지막으로 현재 제가 사용 중인 도커의 셋팅까지 알려드립니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>설치방법</b></span></p><p><br /></p><p>1. 채팅 소스를 받고 chat 폴더를 그대로 그누보드 루트에 복사합니다.</p><p><br /></p><p>2. node 폴더를 그누보드가 아닌 다른 폴더에 복사합니다.</p><p><br /></p><p>예를들어 그누보드가 /var/www/gnuboard 에 있다면, /var/www/node 이런 식으로 넣으면 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>데이터베이스 생성하기</b></span></p><p><br /></p><p>phpmyadmin에서 생성하는 것이 제일 편합니다.</p><p><br /></p><p>phpmyadmin에 로그인 후 자신의 DB를 클릭하고, SQL 탭으로 들어갑니다.</p><p><br /></p><p>[code=bash]</p><p>create table `g5_livechat` (</p><p>    `lc_id` int not null auto_increment primary key,</p><p>    `lc_mb_id` varchar(1024) not null,</p><p>    `lc_msg` text not null,</p><p>    `lc_date` datetime not null</p><p>)default charset=utf8 engine=MyISAM;</p><p>[/code]</p><p><br /></p><p>[code=bash]</p><p>create table `g5_livechat_banlist` (</p><p>    `lb_id` int not null auto_increment primary key,</p><p>    `lb_mb_id` varchar(1024) not null unique key,</p><p>    `lb_reason` text not null</p><p>)default charset=utf8 engine=MyISAM;</p><p>[/code]</p><p><br /></p><p>위 명령어를 각각 내려주면 됩니다.</p><p><br /></p><p>그누보드를 설치할 때 DB 테이블 접두사를 g5가 아닌 다른 것으로 선택했다면 적절하게 수정해주세요.</p><p><br /></p><p>charset은 utf8mb4로 바꿔도 되는데, 이모지는 어짜피 출력이 안되므로 utf8로 둬도 됩니다.</p><p><br /></p><p>참고로 이모지 입력시 전체 새로고침됩니다. ^^;;</p><p><br /></p><p>engine 부분은 InnoDB로 변경해도 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>DB 내용 입력하기</b></span></p><p><br /></p><p>/node/config.js 파일을 열어서 자신의 DB 내용을 입력합니다.</p><p><br /></p><p><b>로컬에 mysql을 설치했을 경우</b></p><p><br /></p><p>this.host는 127.0.0.1 그대로 두면 됩니다.</p><p><br /></p><p>this.port는 3306 그대로 두면 됩니다.</p><p><br /></p><p>this.user는 DB의 유저 이름을 넣으면 됩니다.</p><p><br /></p><p>this.password는 DB의 비밀번호를 넣으면 됩니다.</p><p><br /></p><p>this.dbname는 DB 이름을 넣으면 됩니다.</p><p><br /></p><p>this.port는 nodejs 채팅 프로그램의 포트를 결정하는 것입니다. chat 폴더에 있는 내용과 맞추면 되므로 아무 포트나 넣으면 됩니다.</p><p><br /></p><p>다만 외부에서 접속할 수 있는 포트를 선택해야 합니다.</p><p><br /></p><p>반드시 방화벽을 열어야 합니다.</p><p><br /></p><p>이 글에서는 기본인 1121포트로 하겠습니다.</p><p><br /></p><p><br /></p><p><b>mysql을 도커에 설치했을 경우 </b></p><p><br /></p><p>this.host는 mysql 컨테이너 이름을 넣으면 됩니다.</p><p><br /></p><p>this.port는 ''로 비워두면 됩니다.</p><p><br /></p><p>this.user는 DB의 유저 이름을 넣으면 됩니다.</p><p><br /></p><p>this.password는 DB의 비밀번호를 넣으면 됩니다.</p><p><br /></p><p>this.dbname는 DB 이름을 넣으면 됩니다.</p><p><br /></p><p>this.port는 nodejs 채팅 프로그램의 포트를 결정하는 것입니다. chat 폴더에 있는 내용과 맞추면 되므로 아무 포트나 넣으면 됩니다.</p><p><br /></p><p>다만 외부에서 접속할 수 있는 포트를 선택해야 합니다.</p><p><br /></p><p>반드시 방화벽을 열어야 합니다.</p><p><br /></p><p>그리고 도커에서도 포트를 열어줘야됩니다.</p><p><br /></p><p>이 글에서는 기본인 1121포트로 하겠습니다.<br /></p><p><br /></p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>수정방법</b></span></p><p><br /></p><p>HTTPS를 기준으로 할 것이므로 node폴더에 있는 파일들을 먼저 정할 것입니다.</p><p><br /></p><p>/node/server.js 파일에서 5번째에서 13번째 줄이</p><p><br /></p><p>[code=bash]</p><p>const app = require('express');</p><p>const http = require('http').createServer(app);</p><p>const io = require('socket.io')(http);</p><p>const mysql = require('mysql').createConnection({</p><p>    host:cfg.db.host,</p><p>    port:cfg.db.port,</p><p>    user:cfg.db.user,</p><p>    password:cfg.db.password,</p><p>    database:cfg.db.dbname</p><p>[/code]</p><p><br /></p><p>위와 같이 되어 있는데</p><p><br /></p><p>[code=bash]</p><p>var fs = require('fs');</p><p>var privateKey = fs.readFileSync('/etc/letsencrypt/live/yourdomain/privkey.pem')</p><p>var certificate = fs.readFileSync('/etc/letsencrypt/live/yourdomain/fullchain.pem');</p><p>var credentials = {key: privateKey, cert: certificate};</p><p>const app = require('express');</p><p>const https = require('https').createServer(credentials,app);</p><p>const io = require('socket.io')(https);</p><p>const mysql = require('mysql').createConnection({</p><p>    host:cfg.db.host,</p><p>    port:cfg.db.port,</p><p>    user:cfg.db.user,</p><p>    password:cfg.db.password,</p><p>    database:cfg.db.dbname</p><p>});</p><p>[/code]</p><p><br /></p><p>위와 같이 수정합니다.</p><p><br /></p><p>/etc/letsencrypt/live/yourdomain/ 경로는 <b><span style="color:rgb(255,0,0);">반드시</span></b> 자신의 SSL 인증서가 있는 폴더를 지정해야 합니다.</p><p><br /></p><p>상대경로도 되고, 절대경로도 됩니다.</p><p><br /></p><p>/그누보드루트/chat/js/common.js 제일 첫번째 줄을</p><p><br /></p><p>[code=bash]</p><p>var socket = io.connect('wss://'+location.hostname+':1121/index.acnh?mb_id='+mb_id);</p><p>[/code]</p><p><br /></p><p>위와 같이 ws를 wss로 바꾸면 됩니다.</p><p><br /></p><p>아까 위에서 this.port를 다른 포트로 바꿨다면 1121를 다른 숫자로 바꾸면 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>CSS 수정하기</b></span></p><p><br /></p><p>css를 적절하게 수정하였습니다.</p><p><br /></p><p>/그누보드루트/chat/css/common.css 파일을 열어서</p><p><br /></p><p>[code=css]</p><p>html {overflow-y:auto}</p><p>html, body {height:100%}</p><p>ul li{list-style:none;}</p><p>.send_button{width:40px;height:40px;line-height:38px;text-align:center;border-radius:999px;display:inline-block;font-size:17px;position:relative;bottom:14px;right:-6px;}</p><p>.send_button:hover{color:#323c46;}</p><p>.user_tag{color:#a300ff;}</p><p><br /></p><p>.wrap_chat {height:100%}</p><p>.wrap_chat .cont_chat{margin-bottom:15px;}</p><p>.wrap_chat .header {background-color:#323c46;position:fixed;top:0;left:0;z-index:10;width:100%}</p><p>.wrap_chat .header&gt;.title_area {display:flex;align-items:center;justify-content:center;min-height:50px;font-size:14px;font-weight:bold;color:#fff}</p><p>.wrap_chat .cont_chat {overflow-y:auto;overflow-x:hidden;position:absolute;left:0;bottom:53px;width:100%;top:50px;padding-bottom:10px}</p><p>.wrap_chat .cont_chat&gt;ul {padding:8px 15px 8px;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li {padding:8px 0;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li.notice {color:#959595;text-align:center}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk {display:block;float:left;clear:both;margin-bottom:15px;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.user_thumb {display:inline-block}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.user_thumb&gt;a {overflow:hidden;position:relative;width:40px;height:40px;border-radius:50%;display:block;margin-bottom:15px}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.user_thumb&gt;a:after {position:absolute;top:0;left:0;right:0;bottom:0;border:1px solid rgba(0, 0, 0, 0.06);border-radius:50%;content:'';margin-bottom:10px}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.talk_info {padding-left:7px;display:inline-block;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.talk_info&gt;.name {font-size:13px;white-space:nowrap;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.talk_info&gt;.bubble {margin-top:5px;overflow:hidden;z-index:0;max-width:100%;border-radius:3px 20px 20px;font-size:13px;background-color:#ececec;word-break:break-all;word-break:break-word;word-wrap:break-word;vertical-align:bottom}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li.me&gt;.inner_talk{float:right;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li.me&gt;.inner_talk&gt;.talk_info&gt;.bubble{border-radius:20px 20px 3px;background-color:#afdefd;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.talk_info&gt;.bubble&gt;.txt {padding:9px 12px;white-space:pre-wrap;word-break:break-all;}</p><p>.wrap_chat .cont_chat&gt;ul&gt;li&gt;.inner_talk&gt;.talk_info&gt;.bubble:after {content:'';display:block;clear:both}</p><p>.wrap_chat .box_chat {position:fixed;left:0;bottom:0;width:100%;}</p><p>.wrap_chat .box_chat&gt;.frame_msg {position:relative;background-color:#fff;-webkit-box-shadow: 0px -3px 17px 0px rgba(179,179,179,0.51);-moz-box-shadow: 0px -3px 17px 0px rgba(179,179,179,0.51); box-shadow: 0px -3px 17px 0px rgba(179,179,179,0.51);}</p><p>.wrap_chat .box_chat&gt;.frame_msg textarea {outline: none;}</p><p>.wrap_chat .box_chat&gt;.frame_msg&gt;.tf_msg {width:calc(100% - 105px);overflow-y:auto;height:39px;/*position:fixed;bottom:0;*/padding:8px 12px;margin:14px 15px;margin-bottom:0;border:0 none;font-size:13px;resize:none;/*border:1px solid #000;*/border-radius:100px;background-color: whitesmoke;}</p><p>[/code]</p><p><br /></p><p>위와 같이 변경합니다.</p><p><br /></p><p>자신이 원하는대로 수정하면 됩니다 ^^;;</p><p><br /></p><p><br /></p><p><b><span style="font-size:24pt;">﻿</span><span style="font-size:24pt;">nodejs 실행방법</span></b></p><p><br /></p><p>SSH 접속 후 node 폴더로 가서</p><p><br /></p><p>[code=bash]</p><p>npm init -y &amp;&amp; npm install express mysql socket.io -- save &amp;&amp; nohup node server.js &gt; /dev/null 2&gt;&amp;1 &amp;</p><p>[/code]</p><p><br /></p><p>위 명령어로 package.json 및 package-lock.json를 생성하고, express mysql socket.io 패키지를 설치하고, 백그라운드로 node를 실행합니다.</p><p><br /></p><p>우분투 기준인데, 다른 운영체제를 사용한다면 nohup 대신 다른 명령어를 써야될 수도 있습니다. </p><p><br /></p><p>어쨋든 screen 방식으로 server.js를 실행해야 합니다.</p><p><br /></p><p>도커에서 실행하는 방법은 제일 밑에 따로 적어두겠습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>접속방법</b></span></p><p><br /></p><p><a href="https://xn--vf4b2px5l2ub8zw/chat" rel="nofollow">https://사이트주소/chat</a></p><p><br /></p><p>위 경로로 접속하면 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>접속 링크 생성하기</b></span></p><p><br /></p><p>[code=php]</p><p>&lt;a href="javascript:window.open('/chat/','','width=500,height=700')" ;return="" false;=""&gt;&lt;strong&gt;실시간 채팅&lt;/strong&gt;&lt;/a&gt;</p><p>[/code]</p><p><br /></p><p>PC 접속의 경우 위와 같이 넣으면 깔끔하게 나옵니다.</p><p><br /></p><p>[code=php]</p><p>&lt;a href="&lt;?php echo G5_URL;?&gt;/chat/" target="_blank"&gt;</p><p>[/code]</p><p><br /></p><p>모바일 접속의 경우 위와 같이 넣어주면 깔끔하게 나옵니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;">도커 설정</span></p><p><br /></p><p>현재 제 홈페이지는 100% 도커화되어 있습니다.</p><p><br /></p><p>nodejs도 도커로 설치하면 순식간에 설치가 되고 좋습니다. ㅎㅎ</p><p><br /></p><p>docker-compose.yml 파일이 있는 곳에 소스에 있는 node 폴더를 복사합니다.</p><p><br /></p><p>node폴더에 start.sh 스크립트를 생성합니다.</p><p><br /></p><p>[code=bash]</p><p>npm init -y &amp;&amp; npm install express mysql socket.io -- save &amp;&amp; node server.js</p><p>[/code]</p><p><br /></p><p>위 내용을 넣고 저장합니다.</p><p><br /></p><p><br /></p><p>docker-compose.yml 파일을 열어서</p><p><br /></p><p>[code=docker]</p><p>  nodejs:</p><p>    container_name: nodejs</p><p>    image: node:alpine</p><p>    restart: unless-stopped</p><p>    working_dir: /home/node/app</p><p>    environment:</p><p>      - NODE_ENV=production</p><p>    ports:</p><p>      - "1121:1121"</p><p>    command: sh start.sh</p><p>    volumes:</p><p>      - ./node:/home/node/app</p><p>      - /etc/letsencrypt/live/yourdomain:/etc/letsencrypt/live/yourdomain</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>[/code]</p><p><br /></p><p>위에서 수정할 부분은 /etc/letsencrypt/live/yourdomain 입니다. SSL 인증서가 있는 폴더를 지정하면 됩니다.</p><p><br /></p><p>위 내용을 넣고</p><p><br /></p><p>[code=bash]</p><p>sudo docker-compose up -d nodejs</p><p>[/code]</p><p><br /></p><p>위 명령어를 넣어주면 nodejs가 실행이 됩니다. -d 명령어로 백그라운드에서 실행하게 됩니다. 참쉽죠?</p>]]></description>
<dc:creator>우성짱</dc:creator>
<dc:date>2020-10-03T22:43:55+09:00</dc:date>
</item>


<item>
<title>메일 서버를 Docker로 구축하여 그누보드, 라이믹스, 워드프레스와 연결하기</title>
<link>https://www.wsgvet.com/home/677</link>
<description><![CDATA[<p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>들어가며</b></span></p><p><br /></p><p>도커로 메일서버 구축하기( <a href="https://www.wsgvet.com/home/673" rel="nofollow">https://www.wsgvet.com/home/673</a> )</p><p><br /></p><p>엊그제 윗 글을 올렸습니다.</p><p><br /></p><p>기존에 올렸던 글은 모든 서비스가 도커에서 돌아가야 가능한 설정입니다.</p><p><br /></p><p>즉 그누보드, 라이믹스, 워드프레스가 모두 도커에 있어야했죠.</p><p><br /></p><p>아마도 이런 서비스들을 도커에서 구동하는 분은 거의 안계실 것 같습니다.</p><p><br /></p><p>저는 모든 서비스를 도커에서 처리하지만, 기존에 이미 서비스를하고 있다면 굳이 도커에 올릴 필요가 없기 때문이죠.</p><p><br /></p><p>그래서 로컬에서 이미 서비스들이 돌아갈 때 도커를 새로 설치하여 구축할 수 있는 방법을 알려드리려고 합니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>도커 메일서버란?</b></span></p><p><br /></p><p>도커에서 메일서버를 직접 운영할 수 있게 해줍니다.</p><p><br /></p><p>SMTP, ESMTP, POP3, IMAP 방식을 사용할 수 있습니다.</p><p><br /></p><p>자신의 도메인으로 원하는 계정으로 메일을 보내고 받을 수 있습니다.</p><p><br /></p><p>DNS 셋팅을 하여 구글, 네이버, 다음, 카카오, 프로톤 메일 등에서 스팸처리 당하지 않게 합니다.</p><p><br /></p><p>그누보드, 라이믹스, 워드프레스에 연동하여 메일을 보낼 수 있습니다.</p><p><br /></p><p>아웃룩, 구글 지메일과 연동하여 메일을 읽고 보낼 수 있습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:32px;"><b>필수사항</b></span></p><p><br /></p><p>가상서버호스팅, VPS, 서버 등 SSH를 직접 실행할 수 있어야 됩니다.</p><p><br /></p><p>우분투 20.04, 센토스8에 최적화되어 있습니다.</p><p><br /></p><p>RAM 최소 1GB 이상 (SWAP 2GB 이상 추천)</p><p><br /></p><p>서버에 SSL 인증서가 반드시 있어야 됩니다. <br /></p><p><br /></p><p>그리고 해당 인증서의 경로를 정확하게 알고 있어야 합니다.</p><p><br /></p><p>해당 서비스의 도메인에 맞게 메일서버가 만들어집니다.<br /></p><p><br /></p><p>그리고 25(SMTP), 993(IMAP), 465(ESMTP)포트가 열릴 수 있어야 합니다. POP3가 필요하다면 995번 포트도 포함</p><p><br /></p><p>993 대신에 143(IMAP STARTTLS), 465 대신에 587(ESMTP STARTTLS)도 가능합니다.</p><p><br /></p><p>25번 포트는 서비스하는 사업자에 따라서 완전히 막아두거나, 조건에 따라 열어주거나, 원래 열려있는 경우가 있습니다.</p><p><br /></p><p>메일서버를 운영하려면 필수이므로 반드시 서비스 사업자에게 문의하시길 바랍니다.</p><p><br /></p><p>구글 클라우드의 경우 25번 포트를 열 수 없기 때문에 도커 메일서버를 사용할 수 없습니다.</p><p><br /></p><p>KT회선으로 직접 운영하거나, 오라클 클라우드를 사용한다면 25번 포트가 열려있으므로 바로 사용 가능합니다.</p><p><br /></p><p>하지만 오라클 클라우드의 경우 리버스 DNS를 유료사용자에게만 제공하므로 무료 사용자는 힘들다고 보면 됩니다.</p><p><br /></p><p>25번 포트가 막혀있을 땐 SendGrid api를 이용하여 relay로 쓸 수 있다고 합니다. </p><p><br /></p><p>(링크 : <a href="https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88" rel="nofollow">https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88</a> )</p><p><br /></p><p>API 적용 방법은 추후에 적어보겠습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>서버에 도커 설치하기</b></span></p><p><br /></p><p>도커가 없다면 먼저 설치해야 합니다.</p><p><br /></p><p>docker-mailserver를 이용하기 위해서는 필수입니다.</p><p><br /></p><p><b>Ubuntu 20.04 LTS의 경우</b></p><p><br /></p><p>[code=bash]</p><p>sudo apt update -y &amp;&amp; sudo apt install curl -y \</p><p>&amp;&amp; sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y \</p><p>&amp;&amp; curl -fsSL <a href="https://download.docker.com/linux/ubuntu/gpg" rel="nofollow">https://download.docker.com/linux/ubuntu/gpg</a> | sudo apt-key add - \</p><p>&amp;&amp; sudo add-apt-repository "deb [arch=amd64] <a href="https://download.docker.com/linux/ubuntu" rel="nofollow">https://download.docker.com/linux/ubuntu</a> $(lsb_release -cs) stable" -y \</p><p>&amp;&amp; sudo apt update -y \</p><p>&amp;&amp; sudo apt install docker-ce docker-ce-cli containerd.io -y \</p><p>&amp;&amp; COMPOSE_VERSION=$(curl -s <a href="https://api.github.com/repos/docker/compose/releases/latest" rel="nofollow">https://api.github.com/repos/docker/compose/releases/latest</a> | grep 'tag_name' | cut -d\" -f4) \</p><p>&amp;&amp; sudo curl -L "<a href="https://github.com/docker/compose/releases/download/$%7BCOMPOSE_VERSION%7D/docker-compose-$(uname" rel="nofollow">https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname</a> -s)-$(uname -m)" -o /usr/local/bin/docker-compose \</p><p>&amp;&amp; sudo chmod +x /usr/local/bin/docker-compose;</p><p>[/code]</p><p><br /></p><p>위 내용 전체를 복사 후 붙여넣기 후 실행하면 한방에 깔립니다.</p><p><br /></p><p>docker-compose라는 도커 실행을 도와주는 도구도 최신버전으로 설치됩니다.</p><p><br /></p><p><br /></p><p><b>CentOS 8의 경우</b></p><p><br /></p><p>[code=bash]</p><p>sudo yum -y update &amp;&amp; sudo yum install -y curl \</p><p>&amp;&amp; sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine \</p><p>&amp;&amp; sudo dnf install -y <a href="https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm" rel="nofollow">https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm</a> \</p><p>&amp;&amp; sudo dnf config-manager --add-repo=<a href="https://download.docker.com/linux/centos/docker-ce.repo" rel="nofollow">https://download.docker.com/linux/centos/docker-ce.repo</a> \</p><p>&amp;&amp; sudo dnf install -y docker-ce docker-ce-cli \</p><p>&amp;&amp; sudo systemctl start docker &amp;&amp; sudo systemctl enable --now docker \</p><p>&amp;&amp; COMPOSE_VERSION=$(curl -s <a href="https://api.github.com/repos/docker/compose/releases/latest" rel="nofollow">https://api.github.com/repos/docker/compose/releases/latest</a> | grep 'tag_name' | cut -d\" -f4) \</p><p>&amp;&amp; sudo curl -L "<a href="https://github.com/docker/compose/releases/download/$%7BCOMPOSE_VERSION%7D/docker-compose-$(uname" rel="nofollow">https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname</a> -s)-$(uname -m)" -o /usr/bin/docker-compose \</p><p>&amp;&amp; sudo chmod +x /usr/bin/docker-compose;</p><p>[/code]</p><p><br /></p><p>위 내용 전체를 복사 후 붙여넣기 후 실행하면 한방에 깔립니다.</p><p><br /></p><p>docker-compose라는 도커 실행을 도와주는 도구도 최신버전으로 설치됩니다.</p><p><br /></p><p><br /></p><p><a href="https://docs.docker.com/engine/install/" rel="nofollow">https://docs.docker.com/engine/install/</a></p><p><br /></p><p>수동으로 설치하시려면 위 링크를 통해 설치 방법을 배울 수 있습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>도커 권한 설정</b></span></p><p><br /></p><p>root의 경우 권한 설정을 할 필요가 없지만 일반 계정이라면 docker를 바로 실행할 수 있게 권한을 주는 것이 좋습니다.</p><p><br /></p><p>[code=bash]</p><p>sudo usermod -aG docker $USER</p><p>[/code]</p><p><br /></p><p>위 명령어로 일반 계정이 docker 명령어를 sudo 없이 바로 실행할 수 있게 해줍니다.</p><p><br /></p><p>SSH 창을 끄고 다시 접속하면, sudo 없이 바로 docker나 docker-compose 명령어를 쓸 수 있습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>방화벽 오픈</b></span></p><p><br /></p><p>우선 포트부터 오픈해줍니다.</p><p><br /></p><p>우분투에서 <b>ufw</b>를 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>sudo ufw allow 25/tcp</p><p>sudo ufw allow 465/tcp</p><p>sudo ufw allow 993/tcp</p><p>[/code]</p><p><br /></p><p>위와 같이 25번, 465번, 993번 포트를 열어줍니다. POP3를 원한다면 995번도 같은 방식으로 추가해주세요.</p><p><br /></p><p>993 대신에 143(IMAP STARTTLS), 465 대신에 587(ESMTP STARTTLS)도 가능합니다.</p><p><br /></p><p><b>iptables</b>를 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>sudo iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT</p><p>sudo iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT</p><p>sudo iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT</p><p>sudo netfilter-persistent save</p><p>sudo netfilter-persistent reload</p><p>[/code]</p><p><br /></p><p>위와 같이 25번, 143번 포트를 열어줍니다. POP3를 원한다면 995번도 같은 방식으로 추가해주세요.</p><p><br /></p><p>993 대신에 143(IMAP STARTTLS), 465 대신에 587(ESMTP STARTTLS)도 가능합니다.</p><p><br /></p><p><b>firewall</b>을 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>sudo firewall-cmd --permanent --add-port=25/tcp</p><p>sudo firewall-cmd --permanent --add-port=465/tcp</p><p>sudo firewall-cmd --permanent --add-port=993/tcp</p><p>sudo firewall-cmd --reload</p><p>[/code]</p><p><br /></p><p>위와 같이 25번, 143번 포트를 열어줍니다. POP3를 원한다면 995번도 같은 방식으로 추가해주세요.</p><p><br /></p><p>993 대신에 143(IMAP STARTTLS), 465 대신에 587(ESMTP STARTTLS)도 가능합니다.</p><p><br /></p><p>또한 각 호스팅 및 클라우드 서비스 패널에서 해당 포트를 모두 열어주세요.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>docker-compose.yml 파일 작성하기</b></span></p><p><br /></p><p>이제 도커 설정 및 메일의 데이터가 생성될 폴더로 이동합니다.</p><p><br /></p><p>보통 /home/사용자이름/mail 경로로 두는게 관리하게 편할 것입니다.</p><p><br /></p><p>이제 nano, vi, vim 등을 이용하여 docker-compose.yml를 작성합니다.</p><p><br /></p><p>[code=docker]</p><p>version: '3'</p><p><br /></p><p>services:</p><p><br /></p><p>  example.com:</p><p>    image: tvial/docker-mailserver:latest</p><p>    hostname: example.com</p><p>    domainname: example.com</p><p>    container_name: example.com</p><p>    ports:</p><p>      - "25:25"   # SMTP SEND</p><p>      #- "110:110" # POP3 RECEIVE</p><p>      #- "143:143" # IMAP RECEIVE</p><p>      - "465:465" # ESMTP Enforced Encryption Submission</p><p>      #- "587:587" # ESMTP SEND</p><p>      - "993:993" # IMAP Enforced Encryption Retrieval</p><p>      #- "995:995" # POP3 Enforced Encryption Retrieval POP3가 필요하면 제일 앞에 주석을 해제하세요.</p><p>    volumes:</p><p>      - ./mail/maildata:/var/mail</p><p>      - ./mail/mailstate:/var/mail-state</p><p>      - ./mail/maillogs:/var/log/mail</p><p>      - ./mail/config/:/tmp/docker-mailserver/</p><p>      - /your/certificate/location:/tmp/ssl:ro  # 인증서 위치를 넣어주세요.</p><p>      - /etc/localtime:/etc/localtime:ro # 로컬시간과 도커의 시간을 동기화시켜줍니다.</p><p>      - /etc/timezone:/etc/timezone:ro # 로컬시간과 도커의 시간을 동기화시켜줍니다.</p><p>    environment:</p><p>      #- mail.env</p><p>      #- env-mailserver</p><p>      - SSL_TYPE=manual</p><p>      - SSL_CERT_PATH=/tmp/ssl/fullchain.pem # 인증서 이름이 다르면 수정해주세요.</p><p>      - SSL_KEY_PATH=/tmp/ssl/privkey.pem # 개인키 이름이 다르면 수정해주세요.</p><p>      - ENABLE_SPAMASSASSIN=1</p><p>      - SPAMASSASSIN_SPAM_TO_INBOX=1</p><p>      #- ENABLE_CLAMAV=1  # 바이러스 검사를 원하면 주석을 해제하세요.</p><p>      #- ENABLE_FAIL2BAN=1  # Fail2ban을 활성화하려면 주석을 해제하세요.</p><p>      - ENABLE_POSTGREY=1</p><p>      #- ENABLE_POP3=1  # POP3 접속을 원하면 주석을 해제하세요.</p><p>      - ONE_DIR=1</p><p>      - DMS_DEBUG=0</p><p>    cap_add:</p><p>      - NET_ADMIN</p><p>      - SYS_PTRACE</p><p>    restart: always</p><p>[/code]</p><p><br /></p><p>위 내용에서 example.com를 자신의 도메인으로 바꿉니다.</p><p><br /></p><p>[code=bash]</p><p>- /your/certificate/location:/tmp/ssl:ro  # 인증서 위치를 넣어주세요.</p><p>[/code]</p><p><br /></p><p>그리고 위 내용은</p><p><br /></p><p>/your/certificate/location 폴더를 docker-mailserver의 /tmp/ssl 에 마운트 한다는 말입니다.</p><p><br /></p><p>따라서 인증서가 있는 절대 경로를 넣으면 됩니다.</p><p><br /></p><p>letsencrypt 인증서를 예를들면</p><p><br /></p><p>[code=bash]</p><p>/etc/letsencrypt/live/example.com:/tmp/ssl:ro</p><p>[/code]</p><p><br /></p><p>위와 같이 수정하면 됩니다.</p><p><br /></p><p>그리고 </p><p><br /></p><p>[code=bash]</p><p>- SSL_CERT_PATH=/tmp/ssl/fullchain.pem # 인증서 이름이 다르면 수정해주세요.</p><p>- SSL_KEY_PATH=/tmp/ssl/privkey.pem # 개인키 이름이 다르면 수정해주세요.</p><p>[/code]</p><p><br /></p><p>위 내용의 뜻은 </p><p><br /></p><p>SSL_CERT_PATH : 인증서 경로를 지정하는 것입니다.</p><p>SSL_KEY_PATH : 개인키 경로를 지정하는 것입니다.</p><p><br /></p><p>예를들어 /etc/letsencrypt/live/example.com에 있는 인증서가 /tmp/ssl에 있으므로 그 이후에는 상대경로 그대로 따라간다고 해석하면 됩니다.</p><p><br /></p><p>위와 같이 fullchain.pem 파일과 privkey.pem 파일이 있는 곳을 지정하면 됩니다.</p><p><br /></p><p>해당 내용을 모두 수정한 후 저장합니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>실행하기</b></span></p><p><br /></p><p>[code=bash]</p><p>docker-compose up -d example.com</p><p>[/code]</p><p><br /></p><p>example.com 를 자신의 도메인 이름으로 바꾸고 실행합니다.</p><p><br /></p><p>[code=bash]</p><p>~/mail$ docker-compose up -d example.com</p><p>Creating network "mail_default" with the default driver</p><p>Pulling example.com (tvial/docker-mailserver:latest)...</p><p>latest: Pulling from tvial/docker-mailserver</p><p>d121f8d1c412: Pull complete</p><p>c5b4a53c402d: Pull complete</p><p>6fd5e328f571: Pull complete</p><p>2e231d635543: Pull complete</p><p>f925d7866a50: Pull complete</p><p>a85ec6df5fb2: Pull complete</p><p>d918534d14a8: Pull complete</p><p>91bf2b564bf3: Pull complete</p><p>c3794b250e39: Pull complete</p><p>b7a8126f4fee: Pull complete</p><p>038d572f7344: Pull complete</p><p>266a53d49907: Pull complete</p><p>62fdf8c89b5b: Pull complete</p><p>2e1187bf042e: Pull complete</p><p>01093875f0df: Pull complete</p><p>91b4fc3897cf: Pull complete</p><p>7a607646aa43: Pull complete</p><p>7708ca69a75f: Pull complete</p><p>bdd5513fac17: Pull complete</p><p>19850634145f: Pull complete</p><p>5fa1fc5c8606: Pull complete</p><p>eee7f6b643d7: Pull complete</p><p>dbc38b514df3: Pull complete</p><p>1869e9488861: Pull complete</p><p>745e4d6a5e2b: Pull complete</p><p>61a0994c1e29: Pull complete</p><p>e12701232f17: Pull complete</p><p>b2e3c4d846d8: Pull complete</p><p>8c91901abd9f: Pull complete</p><p>012bd1b9fc18: Pull complete</p><p>d2fafbfc20a2: Pull complete</p><p>6e154df770c8: Pull complete</p><p>27d8004d592c: Pull complete</p><p>e972663808b3: Pull complete</p><p>5f0a6f610fcc: Pull complete</p><p>55f6e28848f9: Pull complete</p><p>b516489901df: Pull complete</p><p>f88a814af0f0: Pull complete</p><p>36dd809a5c88: Pull complete</p><p>0b4f562dcd83: Pull complete</p><p>Digest: sha256:c5b3f52cfbaef8b6c82b4c1e975272e7f2612fb6026f3b54b7c48996f5636c8a</p><p>Status: Downloaded newer image for tvial/docker-mailserver:latest</p><p>Creating example.com ... done</p><p>[/code]</p><p><br /></p><p>위와 같이 docker-mailserver 이미지를 다운 받고, 실행합니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>계정생성하기</b></span></p><p><br /></p><p>[code=bash]</p><p>curl -o setup.sh <a href="https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh;" rel="nofollow">https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh;</a> chmod a+x ./setup.sh</p><p>[/code]</p><p><br /></p><p>위 명령어로 설정 스크립트를 다운 받습니다.</p><p><br /></p><p>이제 계정을 생성해야겠죠?</p><p><br /></p><p>[code=bash]</p><p>./setup.sh email add admin@example.com mypassword</p><p>[/code]</p><p><br /></p><p>위와 같이 admin@example.com 대신 자신이 원하는 이메일 계정, mypassword 대신 자신이 원하는 비번을 넣고 실행합니다.</p><p><br /></p><p>계정 생성이 끝났습니다.</p><p><br /></p><p>계정에 대한 정보는 ./mail/config/postfix-accounts.cf 에 저장됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>DKIM 생성하기</b></span></p><p><br /></p><p>[code=bash]</p><p>./setup.sh config dkim</p><p>[/code]</p><p><br /></p><p>위 명령어로 생성합니다.</p><p><br /></p><p>[code=bash]</p><p>$ ./setup.sh config dkim</p><p>Creating DKIM private key /tmp/docker-mailserver/opendkim/keys/example.com/mail.private</p><p>Creating DKIM KeyTable</p><p>Creating DKIM SigningTable</p><p>Creating DKIM TrustedHosts</p><p>[/code]</p><p><br /></p><p>위와 같이 생성됩니다. 정말 쉽죠?</p><p><br /></p><p>./mail/config/opendkim/keys/example.com/mail.txt</p><p><br /></p><p>위 파일에 우리가 원하는 DKIM 설정 내용이 들어있습니다.</p><p><br /></p><p>mail.txt 파일을 열어보거나</p><p><br /></p><p>[code=bash]</p><p>sudo cat ./mail/config/opendkim/keys/example.com/mail.txt</p><p>[/code]</p><p><br /></p><p>example.com을 자신의 도메인으로 변경 후 위 명령어로 출력하면</p><p><br /></p><p>[code=bash]</p><p>mail._domainkey<span style="white-space:pre;">	</span>IN<span style="white-space:pre;">	</span>TXT<span style="white-space:pre;">	</span>( "v=DKIM1; h=sha256; k=rsa; "</p><p><span style="white-space:pre;">	</span>  "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0p"</p><p><span style="white-space:pre;">	</span>  "t0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB" )  ; ----- DKIM key mail for example.com</p><p>[/code]</p><p><br /></p><p>위와 같이 엄청나게 긴 내용이 나옵니다.</p><p><br /></p><p>이제 DNS 설정에 들어가게 내용을 정리해줍니다. 쌍따옴표를 제거하면 된다고 보면 되는데요.</p><p><br /></p><p>[code=bash]</p><p>"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0p"</p><p><span style="white-space:pre;">	</span>  "t0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB"</p><p>[/code]</p><p><br /></p><p>특히 위 부분이 나눠진게 아니라 합쳐줘야 됩니다. 따라서 최종 완성본은</p><p><br /></p><p>[code=bash]</p><p>v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0pt0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB</p><p>[/code]</p><p><br /></p><p>위와 같이 한줄로 만들면 됩니다. 메모장에 저장해두세요. DNS설정에 꼭 들어가야 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>도메인을 메일서버로 작업하기 위한 설정 추가하기</b></span></p><p><br /></p><p>원래는 mail.example.com으로 메일서버를 만드는 것이 정석입니다.</p><p><br /></p><p>하지만 SSL 인증서 발급이 워낙 번거롭기 때문에 이미 있는 인증서를 쓰기위해 메일서버 도메인을 현재 도메인과 같게하는 것입니다.</p><p><br /></p><p><a href="https://github.com/tomav/docker-mailserver/wiki/FAQ-and-Tips#can-i-use-nakedbare-domains-no-host-name" rel="nofollow">https://github.com/tomav/docker-mailserver/wiki/FAQ-and-Tips#can-i-use-nakedbare-domains-no-host-name</a></p><p><br /></p><p>위 링크에 따르면</p><p><br /></p><p>./mail/config/postfix-main.cf</p><p><br /></p><p>위 경로에 파일을 만들어서 </p><p><br /></p><p>[code=bash]</p><p>mydestination = localhost.$mydomain, localhost</p><p>[/code]</p><p><br /></p><p>위 내용을 넣어주면 됩니다.</p><p><br /></p><p>그런데 config 폴더가 root 권한이기 때문에</p><p><br /></p><p>[code=bash]</p><p>echo 'mydestination = localhost.$mydomain, localhost' | sudo tee -a ./mail/config/postfix-main.cf</p><p>[/code]</p><p><br /></p><p>위 명령어 한줄이면 바로 생성됩니다.</p><p><br /></p><p>이제 도커에서 작업은 끝났습니다.</p><p><br /></p><p><br /></p><p>[code=bash]</p><p>docker-compose up -d --force-recreate example.com</p><p>[/code]</p><p><br /></p><p>example.com 를 자신의 메일서버(도메인)으로 바꿉니다.</p><p><br /></p><p>위 명령어로 재생성해줍니다.</p><p><br /></p><p>이제 서버에서 메일서버가 정상적으로 구동되기 시작했습니다.</p><p><br /></p><p>혹시 </p><p><br /></p><p>[code=bash]</p><p>docker-compose logs example.com</p><p>[/code]</p><p><br /></p><p>위 명령어를 내렸을 때 dovecot 로그가 지속적으로 찍힌다면 SSL 인증서 경로가 잘못된 것이니 반드시 체크해주세요.</p><p><br /></p><p><br /></p><p><b><span style="font-size:24pt;">DNS 설정하기</span></b></p><p><br /></p><p>이제 DNS 설정을 해줍니다.</p><p><br /></p><p>총 4개를 입력할 것입니다.</p><p><br /></p><p>[code=bash]</p><p>1. Type : MX, Name : @(host), Content : example.com, Priority : 10</p><p>2. Type : TXT, Name : @(host), Content : v=spf1 mx ~all</p><p>3. Type : TXT, Name : _dmarc, Content : v=DMARC1; p=none; rua=mailto:admin@example.com; ruf=mailto:admin@example.com; sp=none; ri=86400</p><p>4. Type : TXT, Name : mail._domainkey, Content : v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0pt0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB</p><p>[/code]</p><p><br /></p><p>위와 같이 4개를 넣어주면 됩니다.</p><p><br /></p><p>참고로 @(host)는 클라우드플레어에서는 @를 넣으면 host가 되고, luadns에서는 비워둬야 hostname이 됩니다.</p><p><br /></p><p>1번은 MX 레코드를 지정하는 것입니다.</p><p>2번은 SPF 설정입니다. MX레코드에 지정된 도메인의 IP를 찾아서 검증하는 것입니다.</p><p>3번은 DMARC 설정입니다. 스팸이메일 처리에 대한 규칙을 적은 것입니다. none은 아무것도 안하는 것이고, mailto가 2개 있는데 보고서를 받는 이메일을 넣으면 됩니다. <a href="https://samsikworld.tistory.com/488" rel="nofollow">https://samsikworld.tistory.com/488</a> 링크를 참조하세요.</p><p>4번은 DKIM 설정입니다. 아까 생성했던 그 DKIM을 입력하면 됩니다. 제가 넣은 것과 똑같이 넣으면 절대로 안되고 자신에게 맞는 값을 넣어야 됩니다.</p><p><br /></p><p><br /></p><p>rDNS 리버스 DNS, 리버스 도메인, PTR 레코드 설정하기</p><p><br /></p><p>리버스 도메인이란 일반적인 도메인 조회가 영문 주소(도메인 네임)를 DNS에 질의하여 IP 주소를 찾는 것과 반대로, IP 주소를 사용하여 도메인 네임을 찾는 것을 의미합니다. (나무위키 펌)</p><p><br /></p><p>구글, 다음 메일은 리버스 DNS를 설정하지 않아도 SPF, DMARC, DKIM 작업만 하면 정상 메일로 인식합니다. (네이버 메일은 공지에는 스팸처리한다고 합니다. 저는 스팸처리 안되고 정상 메일처리되더군요 ㅎㅎ)</p><p><br /></p><p>하지만 카카오메일, 프로톤메일 등 몇몇 업체들은 리버스 DNS 설정을 하지 않으면 바로 스팸메일로 분류합니다.</p><p><br /></p><p>AWS : <a href="https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-port-25-throttle" rel="nofollow">https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-port-25-throttle</a></p><p><br /></p><p>Azure : <a href="https://docs.microsoft.com/ko-kr/azure/virtual-network/troubleshoot-outbound-smtp-connectivity" rel="nofollow">https://docs.microsoft.com/ko-kr/azure/virtual-network/troubleshoot-outbound-smtp-connectivity</a> </p><p><br /></p><p>오라클 클라우드 : <a href="https://docs.cloud.oracle.com/en-us/iaas/Content/DNS/Tasks/reversedns.htm" rel="nofollow">https://docs.cloud.oracle.com/en-us/iaas/Content/DNS/Tasks/reversedns.htm</a></p><p><br /></p><p>구글 클라우드 : <a href="https://cloud.google.com/compute/docs/instances/create-ptr-record" rel="nofollow">https://cloud.google.com/compute/docs/instances/create-ptr-record</a></p><p><br /></p><p>KT : <a href="https://dms.kornet.net/reverse" rel="nofollow">https://dms.kornet.net/reverse</a></p><p><br /></p><p>나무 위키 리버스 도메인 설명 : <a href="https://namu.wiki/w/%EB%A6%AC%EB%B2%84%EC%8A%A4%20%EB%8F%84%EB%A9%94%EC%9D%B8" rel="nofollow">https://namu.wiki/w/%EB%A6%AC%EB%B2%84%EC%8A%A4%20%EB%8F%84%EB%A9%94%EC%9D%B8</a></p><p><br /></p><p>리버스 도메인 설정방법은 각 IP 제공자에 따라 다르므로 호스팅이나 클라우드 사업자에게 직접 요청하거나 설정해야 합니다.</p><p><br /></p><p>그리고 KISA 불법스팸대응센터에 화이트 도메인 신청을 해야 국내업체의 스팸처리 확률이 줄어듭니다.</p><p><br /></p><p>화이트도메인 등록 신청하기 : <a href="https://spam.kisa.or.kr/white/sub4.do" rel="nofollow">https://spam.kisa.or.kr/white/sub4.do</a></p><p><br /></p><p>이제 DNS 설정, rDNS 설정, 화이트도메인 신청이 끝났습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>각 프로그램 별 설정 방법</b></span></p><p><br /></p><p>대부분의 프로그램 및 어플에서 IMAP 방식의 접속을 지원합니다.</p><p><br /></p><p>우리가 설정했던 IMAP SSL/TLS 방식과 완벽 호환되므로, 그 방식으로 설정하면 됩니다.</p><p><br /></p><p><b><span style="font-size:18pt;">그누보드 설정</span></b></p><p><br /></p><p>./config.php 173번째줄</p><p><br /></p><p>[code=bash]</p><p>// SMTP</p><p>// lib/mailer.lib.php 에서 사용</p><p>define('G5_SMTP',      'example.com');</p><p>define('G5_SMTP_PORT', '25');</p><p>[/code]</p><p><br /></p><p>위와 같이 변경하기</p><p><br /></p><p><br /></p><p><b><span style="font-size:18pt;">라이믹스 설정</span></b></p><p><br /></p><p>[code=bash]</p><p>발송방법 : SMTP</p><p>SMTP 서버 : example.com</p><p>SMTP 포트 : 465</p><p>SMTP 보안 : SSL</p><p>아이디 : admin@example.com</p><p>비번 : 설정한 비밀번호</p><p>[/code]</p><p><br /></p><p><br /></p><p><b><span style="font-size:18pt;">워드프레스 Post SMTP Mailer/Email Log 플러그인 기준</span></b></p><p><br /></p><p><a href="https://wordpress.org/plugins/post-smtp/" rel="nofollow">https://wordpress.org/plugins/post-smtp/</a></p><p><br /></p><p>[code=bash]</p><p>Transport</p><p><br /></p><p>Type : SMTP</p><p>Mailer Type : PostSMTP</p><p><br /></p><p>Transport Settings</p><p><br /></p><p>Outgoing Mail Server Hostname : example.com</p><p>Outgoing Mail Server Port : 465</p><p>Envelope-From Email Address : admin@example.com</p><p>Security : SMTPS</p><p>Authentication : Plain</p><p><br /></p><p>Authentication</p><p>Username : admin@example.com</p><p>Password : 설정한 비밀번호</p><p>[/code]</p><p><br /></p><p><b><span style="font-size:18pt;">아웃룩 설정</span></b></p><p><br /></p><p>계정 넣고 기다리면 고급설정 나오는데, IMAP 선택하기</p><p><br /></p><p>받는 메일</p><p><br /></p><p>[code=bash]</p><p>사용자이름 : admin@example.com</p><p>비번 : 설정한 비밀번호</p><p><br /></p><p>서버 : example.com</p><p>포트: 993</p><p>암호화방법 : SSL/TLS</p><p>SPA(보안 암호 인증)를 사용한 로그인 필요 체크 해제</p><p>[/code]</p><p><br /></p><p>보내는 메일</p><p><br /></p><p>[code=bash]</p><p>서버 : example.com</p><p>포트 : 465</p><p>암호화방법 : SSL/TLS</p><p>SPA(보안 암호 인증)를 사용한 로그온 필요 : 체크 해제</p><p>발신(SMTP) 서버에 인증필요 체크 : 받는 메일 서버와 동일한 설정 사용</p><p>[/code]</p><p><br /></p><p>993 대신에 143(암호화방법:STARTTLS), 465 대신에 587(암호화방법 STARTTLS)도 가능합니다.</p><p><br /></p><p><span style="font-size:18pt;"><b>구글 안드로이드 지메일 설정하기</b></span></p><p><br /></p><p>수신설정</p><p><br /></p><p>[code=bash]</p><p>사용자이름 admin@example.com</p><p>비번 : 설정한 비밀번호</p><p>서버 : example.com</p><p>포트 : 993</p><p>보안유형 : SSL/TLS</p><p>[/code]</p><p><br /></p><p>발신설정</p><p><br /></p><p>[code=bash]</p><p>사용자이름 : admin@example.com</p><p>비번 : 설정한 비밀번호</p><p>SMTP 서버 : example.com</p><p>포트 : 465</p><p>보안유형 : SSL/TLS</p><p>[/code]</p><p><br /></p><p>993 대신에 143(암호화방법:STARTTLS), 465 대신에 587(암호화방법 STARTTLS)도 가능합니다.</p><p><br /></p><p>참고로 POP3 방식으로 접속하려면 받는 서버를 995번으로 설정하고 보안유형에 SSL/TLS로 설정하면 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>참고 사이트</b></span></p><p><br /></p><p>도커 메일서버 : <a href="https://github.com/tomav/docker-mailserver" rel="nofollow">https://github.com/tomav/docker-mailserver</a> <br /></p><p><br /></p><p>sfuhost에서 메일서버 셋팅방법 : <a href="https://sfuhost.com/manual/700380" rel="nofollow">https://sfuhost.com/manual/700380</a> </p><p><br /></p><p>구글클라우드 메일서버 셋팅방법 : <a href="https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88" rel="nofollow">https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88</a> </p><p><br /></p><p>DMARC 개념 정리 : <a href="https://samsikworld.tistory.com/488" rel="nofollow">https://samsikworld.tistory.com/488</a> </p><p><br /></p><p>Opening Mail Server : <a href="https://blog.0chan.dev/2020-06-16-Opening-Mail-Server/" rel="nofollow">https://blog.0chan.dev/2020-06-16-Opening-Mail-Server/</a> </p>]]></description>
<dc:creator>우성짱</dc:creator>
<dc:date>2020-09-26T19:26:45+09:00</dc:date>
</item>


<item>
<title>도커로 메일서버 구축하기</title>
<link>https://www.wsgvet.com/home/673</link>
<description><![CDATA[<p><br /></p><p><b><span style="font-size:24pt;">도커 메일서버란?</span></b></p><p><br /></p><p>도커에서 메일서버를 직접 운영할 수 있게 해줍니다.</p><p><br /></p><p>SMTP, ESMTP, POP3, IMAP 방식을 사용할 수 있습니다.</p><p><br /></p><p>자신의 도메인 계정으로 메일을 보내고 받을 수 있습니다.</p><p><br /></p><p>DNS 설정으로 구글, 네이버, 다음, 카카오, 프로톤 메일 등에서 스팸처리 당하지 않게 합니다.</p><p><br /></p><p>그누보드, 라이믹스, 워드프레스와 연동하여 메일을 보낼 수 있습니다.</p><p><br /></p><p>아웃룩, 구글 지메일과 연동하여 메일을 읽고 보낼 수 있습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>전제조건</b></span></p><p><br /></p><p>RAM 최소 1GB 이상 (SWAP 2GB 이상 추천)</p><p><br /></p><p>그리고 반드시 25(SMTP), 993(IMAP), 465(ESMTP)포트가 열릴 수 있어야 합니다. POP3가 필요하다면 995번 포트도 포함</p><p><br /></p><p>구글 클라우드의 경우 25번 포트를 열 수 없기 때문에 도커 메일서버를 사용할 수 없습니다.</p><p><br /></p><p>KT회선으로 직접 운영하거나, 오라클 클라우드를 사용한다면 25번 포트가 열려있으므로 바로 사용 가능합니다.</p><p><br /></p><p>하지만 오라클 클라우드의 경우 리버스 DNS를 유료사용자에게만 제공하므로 무료 사용자는 힘들다고 보면 됩니다.</p><p><br /></p><p>25번 포트가 막혀있을 땐 SendGrid api를 이용하여 relay로 쓸 수 있다고 합니다. </p><p><br /></p><p>(링크 : <a href="https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88" rel="nofollow">https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88</a> )</p><p><br /></p><p>mailhog나 mailcatcher를 이용해도 될 것 같은데, 연구 중입니다.</p><p><br /></p><p><br /></p><p><b><span style="font-size:24pt;">방화벽 오픈</span></b></p><p><br /></p><p>우선 포트부터 오픈해줍니다.</p><p><br /></p><p><b>ufw</b>를 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>sudo ufw allow 25/tcp</p><p>sudo ufw allow 465/tcp</p><p>sudo ufw allow 993/tcp</p><p>[/code]</p><p><br /></p><p>위와 같이 25번, 465번, 993번 포트를 열어줍니다. POP3를 원한다면 995번도 같은 방식으로 추가해주세요.</p><p><br /></p><p><br /></p><p><b>iptables</b>를 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>sudo iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT</p><p>sudo iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT</p><p>sudo iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT</p><p>sudo netfilter-persistent save</p><p>sudo netfilter-persistent reload</p><p>[/code]</p><p><br /></p><p>위와 같이 25번, 143번 포트를 열어줍니다. POP3를 원한다면 995번도 같은 방식으로 추가해주세요.</p><p><br /></p><p><br /></p><p><b>firewall</b>을 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>sudo firewall-cmd --permanent --add-port=25/tcp</p><p>sudo firewall-cmd --permanent --add-port=465/tcp</p><p>sudo firewall-cmd --permanent --add-port=993/tcp</p><p>sudo firewall-cmd --reload</p><p>[/code]</p><p><br /></p><p>위와 같이 25번, 143번 포트를 열어줍니다. POP3를 원한다면 995번도 같은 방식으로 추가해주세요.</p><p><br /></p><p>또한 각 호스팅 및 클라우드 서비스 패널에서 해당 포트를 모두 열어주세요.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>적용예시</b></span></p><p><br /></p><p>이 가이드를 바로 적용할 수 있는 글은 다음과 같습니다.</p><p><br /></p><p>Docker compose로 라이믹스 편하게 설치하는 방법</p><p><br /></p><p><a href="https://www.wsgvet.com/ubuntu/125" rel="nofollow">https://www.wsgvet.com/ubuntu/125</a></p><p><br /></p><p><br /></p><p>Docker compose로 그누보드 편하게 설치하는 방법</p><p><br /></p><p><a href="https://www.wsgvet.com/ubuntu/126" rel="nofollow">https://www.wsgvet.com/ubuntu/126</a></p><p><br /></p><p><br /></p><p>Docker compose로 워드프레스 편하게 설치하는 방법</p><p><br /></p><p><a href="https://www.wsgvet.com/ubuntu/153" rel="nofollow">https://www.wsgvet.com/ubuntu/153</a></p><p><br /></p><p><br /></p><p>Docker compose로 멀티 사이트 운영하기</p><p><br /></p><p><a href="https://www.wsgvet.com/ubuntu/123" rel="nofollow">https://www.wsgvet.com/ubuntu/123</a> </p><p><br /></p><p><br /></p><p><b>여기서부터는 제가 올려드린 예시를 통해 설치했다고 가정하고 시작합니다.</b></p><p><b><br /></b></p><p><b>기존에 도커를 쓰지 않는 상황에서는 바로 적용하기 어렵습니다.</b></p><p><b><br /></b></p><p><b>하지만 해당 소스 및 설명을 이해할 수 있다면 누구나 적용할 수 있습니다.</b></p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>SSL 인증서 설치</b></span></p><p><br /></p><p>IMAP이나 POP3를 이용하려면 인증서 발급이 필수입니다.</p><p><br /></p><p>certbot을 이용할 것입니다.</p><p><br /></p><p>와일드카드 인증서를 가지고 있다면 마지막 설정 부분만 보시면 됩니다.</p><p><br /></p><p>그 이외 부분은 <a href="https://github.com/tomav/docker-mailserver/wiki/Configure-SSL" rel="nofollow">https://github.com/tomav/docker-mailserver/wiki/Configure-SSL</a> 링크를 참조하세요.</p><p><br /></p><p><br /></p><p>먼저 도메인의 DNS 설정에서 <b>mail.example.com</b>을 자신의 서버IP를 가리키게 해주세요.</p><p><br /></p><p><b>이하 example.com을 모두 자신의 도메인으로 바꿔주세요.</b></p><p><br /></p><p>이제 도커 환경으로 돌아옵니다.</p><p><br /></p><p>./nginx/conf.d/mail.conf 파일을 만들어서</p><p><br /></p><p>[code=bash]</p><p>server {</p><p>        listen 80;</p><p>        listen [::]:80;</p><p><br /></p><p>        server_name mail.example.com;</p><p><br /></p><p>        # Useful for Let's Encrypt</p><p>        location ~ /.well-known/acme-challenge/ {</p><p>                allow all;</p><p>                root /usr/share/nginx/html;</p><p>        }</p><p>}</p><p>[/code]</p><p><br /></p><p>위 내용을 넣습니다.</p><p><br /></p><p>[code=bash]</p><p>sudo docker-compose up -d --force-recreate --no-deps nginx</p><p>[/code]</p><p><br /></p><p>위 명령어로 Nginx 설정을 적용해줍니다.</p><p><br /></p><p>docker-compose.yml 에서</p><p><br /></p><p>[code=bash]</p><p>  certbot:</p><p>    image: certbot/certbot:latest</p><p>    container_name: certbot</p><p>    volumes:</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>    #command: certonly -n --webroot -w /usr/share/nginx/html -d example.com -d <a href="http://www.example.com" rel="nofollow">www.example.com</a> -d port.example.com -d pma.example.com</p><p>    command: certonly --dry-run -n --webroot -w /usr/share/nginx/html -d mail.example.com</p><p>[/code]</p><p><br /></p><p>위와 같이 certbot 부분에 기존 command를 주석처리하고, <b>mail.example.com</b> 생성 테스트를 위한 command를 넣습니다.</p><p><br /></p><p>저장합니다.</p><p><br /></p><p>그리고 </p><p><br /></p><p>[code=bash]</p><p>sudo docker-compose up certbot</p><p>[/code]</p><p><br /></p><p>위 명령어로 certbot을 실행합니다.</p><p><br /></p><p>[code=bash]</p><p># sudo docker-compose up certbot</p><p>Recreating certbot ... done</p><p>Attaching to certbot</p><p>certbot         | Saving debug log to /var/log/letsencrypt/letsencrypt.log</p><p>certbot         | Plugins selected: Authenticator webroot, Installer None</p><p>certbot         | Obtaining a new certificate</p><p>certbot         | Performing the following challenges:</p><p>certbot         | http-01 challenge for mail.example.com</p><p>certbot         | Using the webroot path /usr/share/nginx/html for all unmatched domains.</p><p>certbot         | Waiting for verification...</p><p>certbot         | Cleaning up challenges</p><p>certbot         | IMPORTANT NOTES:</p><p>certbot         |  - The dry run was successful.</p><p>certbot         |  - Your account credentials have been saved in your Certbot</p><p>certbot         |    configuration directory at /etc/letsencrypt. You should make a</p><p>certbot         |    secure backup of this folder now. This configuration directory will</p><p>certbot         |    also contain certificates and private keys obtained by Certbot so</p><p>certbot         |    making regular backups of this folder is ideal.</p><p>certbot exited with code 0</p><p>[/code]</p><p><br /></p><p>위와 같이 <b>dry run</b> 테스트가 성공했습니다.</p><p><br /></p><p>이제 다시 <b>docker-compose.yml</b> 파일을 열어서</p><p><br /></p><p>[code=bash]</p><p>  certbot:</p><p>    image: certbot/certbot:latest</p><p>    container_name: certbot</p><p>    volumes:</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>    #command: certonly -n --webroot -w /usr/share/nginx/html -d example.com -d <a href="http://www.example.com" rel="nofollow">www.example.com</a> -d port.example.com -d pma.example.com</p><p>    command: certonly -n --webroot -w /usr/share/nginx/html -d mail.example.com</p><p>[/code]</p><p><br /></p><p>위와 같이 <b>--dry-run</b>을 삭제해줍니다.</p><p><br /></p><p>[code=bash]</p><p>sudo docker-compose up certbot</p><p>[/code]</p><p><br /></p><p>다시 위 명령어로 인증서 발급을 시도합니다.</p><p><br /></p><p>[code=bash]</p><p># sudo docker-compose up certbot</p><p>Recreating certbot ... done</p><p>Attaching to certbot</p><p>certbot         | Saving debug log to /var/log/letsencrypt/letsencrypt.log</p><p>certbot         | Plugins selected: Authenticator webroot, Installer None</p><p>certbot         | Obtaining a new certificate</p><p>certbot         | Performing the following challenges:</p><p>certbot         | http-01 challenge for mail.example.com</p><p>certbot         | Using the webroot path /usr/share/nginx/html for all unmatched domains.</p><p>certbot         | Waiting for verification...</p><p>certbot         | Cleaning up challenges</p><p>certbot         | IMPORTANT NOTES:</p><p>certbot         |  - Congratulations! Your certificate and chain have been saved at:</p><p>certbot         |    /etc/letsencrypt/live/mail.example.com/fullchain.pem</p><p>certbot         |    Your key file has been saved at:</p><p>certbot         |    /etc/letsencrypt/live/mail.example.com/privkey.pem</p><p>certbot         |    Your cert will expire on 2020-12-22. To obtain a new or tweaked</p><p>certbot         |    version of this certificate in the future, simply run certbot</p><p>certbot         |    again. To non-interactively renew *all* of your certificates, run</p><p>certbot         |    "certbot renew"</p><p>certbot         |  - If you like Certbot, please consider supporting our work by:</p><p>certbot         | </p><p>certbot         |    Donating to ISRG / Let's Encrypt:   <a href="https://letsencrypt.org/donate" rel="nofollow">https://letsencrypt.org/donate</a></p><p>certbot         |    Donating to EFF:                    <a href="https://eff.org/donate-le" rel="nofollow">https://eff.org/donate-le</a></p><p>certbot         | </p><p>certbot exited with code 0</p><p>[/code]</p><p><br /></p><p>위와 같이 발급이 잘 된 것을 볼 수 있습니다.</p><p><br /></p><p><br /></p><p>이제 다시 <b>docker-compose.yml </b>파일을 열어서</p><p><br /></p><p>[code=bash]</p><p>  certbot:</p><p>    image: certbot/certbot:latest</p><p>    container_name: certbot</p><p>    volumes:</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>    command: certonly -n --webroot -w /usr/share/nginx/html -d example.com -d <a href="http://www.example.com" rel="nofollow">www.example.com</a> -d port.example.com -d pma.example.com -d mail.example.com</p><p>[/code]</p><p><br /></p><p>위와 같이 command에 <b>-d mail.example.com</b>도 포함해줍니다. 인증서 갱신시 같이 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>docker-compose.yml 파일 작성하기</b></span></p><p><br /></p><p>이제 d<b>ocker-mailserver</b>를 <b>docker-compose.yml</b>에 추가해줍니다.</p><p><br /></p><p>밑에 예시가 있으니 참조하세요.</p><p><br /></p><p>[code=docker]</p><p>.</p><p>.</p><p>.</p><p>  mail.example.com:</p><p>    image: tvial/docker-mailserver:latest</p><p>    hostname: mail.example.com</p><p>    domainname: example.com</p><p>    container_name: mail.example.com</p><p>    ports:</p><p>      - "25:25"   # SMTP SEND</p><p>      #- "110:110" # POP3 RECEIVE</p><p>      #- "143:143" # IMAP RECEIVE</p><p>      - "465:465" # ESMTP Enforced Encryption Submission</p><p>      #- "587:587" # ESMTP SEND</p><p>      - "993:993" # IMAP Enforced Encryption Retrieval</p><p>      #- "995:995" # POP3 Enforced Encryption Retrieval POP3가 필요하면 제일 앞에 주석을 해제하세요.</p><p>    volumes:</p><p>      - ./mail/maildata:/var/mail</p><p>      - ./mail/mailstate:/var/mail-state</p><p>      - ./mail/maillogs:/var/log/mail</p><p>      - ./mail/config/:/tmp/docker-mailserver/</p><p>      - ./ssl/:/tmp/ssl:ro  # Certificate location</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    environment:</p><p>      #- mail.env</p><p>      #- env-mailserver</p><p>      - SSL_TYPE=manual</p><p>      - SSL_CERT_PATH=/tmp/ssl/live/mail.example.com/fullchain.pem # Certificate location</p><p>      - SSL_KEY_PATH=/tmp/ssl/live/mail.example.com/privkey.pem # Certificate location</p><p>      - ENABLE_SPAMASSASSIN=1</p><p>      - SPAMASSASSIN_SPAM_TO_INBOX=1</p><p>      #- ENABLE_CLAMAV=1  # 바이러스 검사를 원하면 주석을 해제하세요.</p><p>      #- ENABLE_FAIL2BAN=1  # Fail2ban을 활성화하려면 주석을 해제하세요.</p><p>      - ENABLE_POSTGREY=1</p><p>      #- ENABLE_POP3=1  # POP3 접속을 원하면 주석을 해제하세요.</p><p>      - ONE_DIR=1</p><p>      - DMS_DEBUG=0</p><p>      - PERMIT_DOCKER=connected-networks<br /></p><p>    cap_add:<br /></p><p>      - NET_ADMIN</p><p>      - SYS_PTRACE</p><p>    restart: always</p><p>.</p><p>.</p><p>.</p><p>[/code]</p><p><br /></p><p>위 내용에서 <b>example.com</b>를 자신의 도메인으로 바꿉니다.</p><p><br /></p><p>[code=bash]</p><p>- ./ssl/:/tmp/ssl:ro  # Certificate location</p><p>[/code]</p><p><br /></p><p>./ssl/ 폴더를 docker-mailserver의 /tmp/ssl 에 마운트 한다는 말입니다.</p><p><br /></p><p>여기는 SSL 인증서의 위치를 결정하는 곳입니다.</p><p><br /></p><p>docker-multi-site 설정대로 했다면</p><p><br /></p><p>[code=bash]</p><p>- ./site/ssl/:/tmp/ssl:ro  # Certificate location</p><p>[/code]</p><p><br /></p><p>위와 같이 해주세요.</p><p><br /></p><p>개인적으로 와일드카드 인증서를 발급 받았다면 ./ssl/ 대신에 인증서가 있는 폴더를 지정해주세요.</p><p><br /></p><p><br /></p><p>그리고 </p><p><br /></p><p>[code=bash]</p><p>- SSL_CERT_PATH=/tmp/ssl/live/mail.example.com/fullchain.pem # Certificate location</p><p>- SSL_KEY_PATH=/tmp/ssl/live/mail.example.com/privkey.pem # Certificate location</p><p>[/code]</p><p><br /></p><p>위 내용의 뜻은 </p><p><br /></p><p>SSL_CERT_PATH : 인증서 경로를 지정하는 것입니다.</p><p>SSL_KEY_PATH : 개인키 경로를 지정하는 것입니다.</p><p><br /></p><p>따라서 ./ssl에 있는 인증서가 /tmp/ssl에 있으므로 그 이후에는 상대경로 그대로 따라간다고 해석하면 됩니다.</p><p><br /></p><p>example.com 대신에 자신의 도메인으로 수정하세요.</p><p><br /></p><p>위와 같이 fullchain.pem 파일과 privkey.pem 파일이 있는 곳을 지정하면 됩니다.</p><p><br /></p><p>docker-multi-site 설정대로 했다면</p><p><br /></p><p>[code=bash]</p><p>- SSL_CERT_PATH=/tmp/ssl/fullchain.pem # Certificate location</p><p>- SSL_KEY_PATH=/tmp/ssl/privkey.pem # Certificate location</p><p>[/code]</p><p><br /></p><p>위와 같이 해주세요.</p><p><br /></p><p>개인적으로 와일드카드 인증서를 발급 받았다면 경로를 직접 지정해주면 됩니다.</p><p><br /></p><p><br /></p><p>혹시 로컬에서 그누보드, 라이믹스, 워드프레스를 사용하고 있다면</p><p><br /></p><p>[code=bash]</p><p>- PERMIT_DOCKER=connected-networks<br /></p><p>[/code]</p><p><br /></p><p>위 내용을 삭제하면 localhost와 소통이 됩니다.</p><p><br /></p><p><br /></p><p>docker-compose 설정은 끝났습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>도커 예시 모음</b></span></p><p><br /></p><p><b><span style="font-size:24pt;">docker-gnuboard</span></b></p><p><br /></p><p>[code=docker]</p><p>version: '3'</p><p><br /></p><p>services:</p><p><br /></p><p>  db:</p><p>    image: mariadb:latest</p><p>    container_name: db</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    environment:</p><p>      - TZ=Asia/Seoul</p><p>    volumes:</p><p>      - ./data/dbdata:/var/lib/mysql</p><p>  </p><p>  certbot:</p><p>    image: certbot/certbot:latest</p><p>    container_name: certbot</p><p>    volumes:</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>    command: certonly -n --webroot -w /usr/share/nginx/html -d example.com -d <a href="http://www.example.com" rel="nofollow">www.example.com</a> -d port.example.com -d pma.example.com -d mail.example.com</p><p><br /></p><p>  redis:</p><p>    container_name: redis</p><p>    image: redis:alpine</p><p>    restart: unless-stopped</p><p>    volumes:</p><p>      - ./data/dataredis:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes</p><p><br /></p><p>  smtp:</p><p>    image: namshi/smtp</p><p>    container_name: smtp</p><p>    restart: always</p><p>    env_file: .env</p><p><br /></p><p>  php:</p><p>    depends_on:</p><p>      - db</p><p>    build:</p><p>      context: ./build</p><p>    container_name: php</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    volumes:</p><p>      - ./site:/var/www/web</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  nginx:</p><p>    depends_on:</p><p>      - php</p><p>    image: nginx:alpine</p><p>    container_name: nginx</p><p>    restart: unless-stopped</p><p>    ports:</p><p>      - "80:80"</p><p>      - "443:443"</p><p>    volumes:</p><p>      - phpmyadmin:/var/www/html</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - ./site:/var/www/web</p><p>      - ./nginx/conf.d:/etc/nginx/conf.d</p><p>      - ./nginx/nginx.conf:/etc/nginx/nginx.conf</p><p>      - ./nginx/logs:/var/log/nginx/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  phpmyadmin:</p><p>    image: phpmyadmin:fpm-alpine</p><p>    container_name: phpmyadmin</p><p>    #ports:</p><p>    #  - "80:80"</p><p>    environment:</p><p>      - PMA_HOST=db</p><p>    restart: unless-stopped</p><p>    depends_on:</p><p>      - db</p><p>    volumes:</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - phpmyadmin:/var/www/html</p><p><br /></p><p>  portainer:</p><p>    image: portainer/portainer-ce:alpine</p><p>    container_name: portainer</p><p>    restart: unless-stopped</p><p>    #ports:</p><p>    #  - "9000:9000"</p><p>    volumes:</p><p>      - /var/run/docker.sock:/var/run/docker.sock</p><p>      - ./data/portainer_data:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  mail.example.com:</p><p>    image: tvial/docker-mailserver:latest</p><p>    hostname: mail.example.com</p><p>    domainname: example.com</p><p>    container_name: mail.example.com</p><p>    ports:</p><p>      - "25:25"   # SMTP SEND</p><p>      #- "110:110" # POP3 RECEIVE</p><p>      #- "143:143" # IMAP RECEIVE</p><p>      - "465:465" # ESMTP Enforced Encryption Submission</p><p>      #- "587:587" # ESMTP SEND</p><p>      - "993:993" # IMAP Enforced Encryption Retrieval</p><p>      #- "995:995" # POP3 Enforced Encryption Retrieval POP3가 필요하면 제일 앞에 주석을 해제하세요.</p><p>    volumes:</p><p>      - ./mail/maildata:/var/mail</p><p>      - ./mail/mailstate:/var/mail-state</p><p>      - ./mail/maillogs:/var/log/mail</p><p>      - ./mail/config/:/tmp/docker-mailserver/</p><p>      - ./ssl/:/tmp/ssl:ro  # Certificate location</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    environment:</p><p>      #- mail.env</p><p>      #- env-mailserver</p><p>      - SSL_TYPE=manual</p><p>      - SSL_CERT_PATH=/tmp/ssl/live/mail.example.com/fullchain.pem # Certificate location</p><p>      - SSL_KEY_PATH=/tmp/ssl/live/mail.example.com/privkey.pem # Certificate location</p><p>      - ENABLE_SPAMASSASSIN=1</p><p>      - SPAMASSASSIN_SPAM_TO_INBOX=1</p><p>      #- ENABLE_CLAMAV=1  # 바이러스 검사를 원하면 주석을 해제하세요.</p><p>      #- ENABLE_FAIL2BAN=1  # Fail2ban을 활성화하려면 주석을 해제하세요.</p><p>      - ENABLE_POSTGREY=1</p><p>      #- ENABLE_POP3=1  # POP3 접속을 원하면 주석을 해제하세요.</p><p>      - ONE_DIR=1</p><p>      - DMS_DEBUG=0</p><p>      - PERMIT_DOCKER=connected-networks</p><p>    cap_add:<br /></p><p>      - NET_ADMIN</p><p>      - SYS_PTRACE</p><p>    restart: always</p><p>      </p><p>volumes:</p><p>  phpmyadmin:</p><p>[/code]</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>docker-rhymix</b></span></p><p><br /></p><p>[code=docker]</p><p>version: '3'</p><p><br /></p><p>services:</p><p><br /></p><p>  db:</p><p>    image: mariadb:latest</p><p>    container_name: db</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    environment:</p><p>      - TZ=Asia/Seoul</p><p>    volumes:</p><p>      - ./data/dbdata:/var/lib/mysql</p><p><br /></p><p>  redis:</p><p>    container_name: redis</p><p>    image: redis:alpine</p><p>    restart: unless-stopped</p><p>    volumes:</p><p>      - ./data/dataredis:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes</p><p>  </p><p>  certbot:</p><p>    image: certbot/certbot:latest</p><p>    container_name: certbot</p><p>    volumes:</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>    command: certonly -n --webroot -w /usr/share/nginx/html -d example.com -d <a href="http://www.example.com" rel="nofollow">www.example.com</a> -d port.example.com -d pma.example.com -d mail.example.com</p><p><br /></p><p>  php:</p><p>    depends_on:</p><p>      - db</p><p>    build:</p><p>      context: ./build</p><p>    container_name: php</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    volumes:</p><p>      - ./site:/var/www/web</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  nginx:</p><p>    depends_on:</p><p>      - php</p><p>    image: nginx:alpine</p><p>    container_name: nginx</p><p>    restart: unless-stopped</p><p>    ports:</p><p>      - "80:80"</p><p>      - "443:443"</p><p>    volumes:</p><p>      - phpmyadmin:/var/www/html</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - ./site:/var/www/web</p><p>      - ./nginx/conf.d:/etc/nginx/conf.d</p><p>      - ./nginx/nginx.conf:/etc/nginx/nginx.conf</p><p>      - ./nginx/logs:/var/log/nginx/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  phpmyadmin:</p><p>    image: phpmyadmin:fpm-alpine</p><p>    container_name: phpmyadmin</p><p>    #ports:</p><p>    #  - "80:80"</p><p>    environment:</p><p>      - PMA_HOST=db</p><p>    restart: unless-stopped</p><p>    depends_on:</p><p>      - db</p><p>    volumes:</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - phpmyadmin:/var/www/html</p><p><br /></p><p>  portainer:</p><p>    image: portainer/portainer-ce:alpine</p><p>    container_name: portainer</p><p>    restart: unless-stopped</p><p>    #ports:</p><p>    #  - "9000:9000"</p><p>    volumes:</p><p>      - /var/run/docker.sock:/var/run/docker.sock</p><p>      - ./data/portainer_data:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  mail.example.com:</p><p>    image: tvial/docker-mailserver:latest</p><p>    hostname: mail.example.com</p><p>    domainname: example.com</p><p>    container_name: mail.example.com</p><p>    ports:</p><p>      - "25:25"   # SMTP SEND</p><p>      #- "110:110" # POP3 RECEIVE</p><p>      #- "143:143" # IMAP RECEIVE</p><p>      - "465:465" # ESMTP Enforced Encryption Submission</p><p>      #- "587:587" # ESMTP SEND</p><p>      - "993:993" # IMAP Enforced Encryption Retrieval</p><p>      #- "995:995" # POP3 Enforced Encryption Retrieval POP3가 필요하면 제일 앞에 주석을 해제하세요.</p><p>    volumes:</p><p>      - ./mail/maildata:/var/mail</p><p>      - ./mail/mailstate:/var/mail-state</p><p>      - ./mail/maillogs:/var/log/mail</p><p>      - ./mail/config/:/tmp/docker-mailserver/</p><p>      - ./ssl/:/tmp/ssl:ro  # Certificate location</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    environment:</p><p>      #- mail.env</p><p>      #- env-mailserver</p><p>      - SSL_TYPE=manual</p><p>      - SSL_CERT_PATH=/tmp/ssl/live/mail.example.com/fullchain.pem # Certificate location</p><p>      - SSL_KEY_PATH=/tmp/ssl/live/mail.example.com/privkey.pem # Certificate location</p><p>      - ENABLE_SPAMASSASSIN=1</p><p>      - SPAMASSASSIN_SPAM_TO_INBOX=1</p><p>      #- ENABLE_CLAMAV=1  # 바이러스 검사를 원하면 주석을 해제하세요.</p><p>      #- ENABLE_FAIL2BAN=1  # Fail2ban을 활성화하려면 주석을 해제하세요.</p><p>      - ENABLE_POSTGREY=1</p><p>      #- ENABLE_POP3=1  # POP3 접속을 원하면 주석을 해제하세요.</p><p>      - ONE_DIR=1</p><p>      - DMS_DEBUG=0</p><p>      - PERMIT_DOCKER=connected-networks</p><p>    cap_add:<br /></p><p>      - NET_ADMIN</p><p>      - SYS_PTRACE</p><p>    restart: always</p><p>      </p><p>volumes:</p><p>  phpmyadmin:</p><p>[/code]</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>docker-wordpress</b></span></p><p><br /></p><p>[code=docker]</p><p>version: '3'</p><p><br /></p><p>services:</p><p><br /></p><p>  db:</p><p>    image: mariadb:latest</p><p>    container_name: db</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    environment:</p><p>      - TZ=Asia/Seoul</p><p>    volumes:</p><p>      - ./data/dbdata:/var/lib/mysql</p><p><br /></p><p>  redis:</p><p>    container_name: redis</p><p>    image: redis:alpine</p><p>    restart: unless-stopped</p><p>    volumes:</p><p>      - ./data/dataredis:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes</p><p>  </p><p>  certbot:</p><p>    image: certbot/certbot:latest</p><p>    container_name: certbot</p><p>    volumes:</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>    command: certonly -n --webroot -w /usr/share/nginx/html -d example.com -d <a href="http://www.example.com" rel="nofollow">www.example.com</a> -d port.example.com -d pma.example.com -d mail.example.com</p><p><br /></p><p>  php:</p><p>    depends_on:</p><p>      - db</p><p>    build:</p><p>      context: ./build</p><p>    container_name: php</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    volumes:</p><p>      - ./site:/var/www/web</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  nginx:</p><p>    depends_on:</p><p>      - php</p><p>    image: nginx:alpine</p><p>    container_name: nginx</p><p>    restart: unless-stopped</p><p>    ports:</p><p>      - "80:80"</p><p>      - "443:443"</p><p>    volumes:</p><p>      - phpmyadmin:/var/www/html</p><p>      - ./ssl/:/etc/letsencrypt/</p><p>      - ./site:/var/www/web</p><p>      - ./nginx/conf.d:/etc/nginx/conf.d</p><p>      - ./nginx/nginx.conf:/etc/nginx/nginx.conf</p><p>      - ./nginx/logs:/var/log/nginx/</p><p>      - /usr/share/nginx/html:/usr/share/nginx/html</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  phpmyadmin:</p><p>    image: phpmyadmin:fpm-alpine</p><p>    container_name: phpmyadmin</p><p>    #ports:</p><p>    #  - "80:80"</p><p>    environment:</p><p>      - PMA_HOST=db</p><p>    restart: unless-stopped</p><p>    depends_on:</p><p>      - db</p><p>    volumes:</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - phpmyadmin:/var/www/html</p><p><br /></p><p>  portainer:</p><p>    image: portainer/portainer-ce:alpine</p><p>    container_name: portainer</p><p>    restart: unless-stopped</p><p>    #ports:</p><p>    #  - "9000:9000"</p><p>    volumes:</p><p>      - /var/run/docker.sock:/var/run/docker.sock</p><p>      - ./data/portainer_data:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  mail.example.com:</p><p>    image: tvial/docker-mailserver:latest</p><p>    hostname: mail.example.com</p><p>    domainname: example.com</p><p>    container_name: mail.example.com</p><p>    ports:</p><p>      - "25:25"   # SMTP SEND</p><p>      #- "110:110" # POP3 RECEIVE</p><p>      #- "143:143" # IMAP RECEIVE</p><p>      - "465:465" # ESMTP Enforced Encryption Submission</p><p>      #- "587:587" # ESMTP SEND</p><p>      - "993:993" # IMAP Enforced Encryption Retrieval</p><p>      #- "995:995" # POP3 Enforced Encryption Retrieval POP3가 필요하면 제일 앞에 주석을 해제하세요.</p><p>    volumes:</p><p>      - ./mail/maildata:/var/mail</p><p>      - ./mail/mailstate:/var/mail-state</p><p>      - ./mail/maillogs:/var/log/mail</p><p>      - ./mail/config/:/tmp/docker-mailserver/</p><p>      - ./ssl/:/tmp/ssl:ro  # Certificate location</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    environment:</p><p>      #- mail.env</p><p>      #- env-mailserver</p><p>      - SSL_TYPE=manual</p><p>      - SSL_CERT_PATH=/tmp/ssl/live/mail.example.com/fullchain.pem # Certificate location</p><p>      - SSL_KEY_PATH=/tmp/ssl/live/mail.example.com/privkey.pem # Certificate location</p><p>      - ENABLE_SPAMASSASSIN=1</p><p>      - SPAMASSASSIN_SPAM_TO_INBOX=1</p><p>      #- ENABLE_CLAMAV=1  # 바이러스 검사를 원하면 주석을 해제하세요.</p><p>      #- ENABLE_FAIL2BAN=1  # Fail2ban을 활성화하려면 주석을 해제하세요.</p><p>      - ENABLE_POSTGREY=1</p><p>      #- ENABLE_POP3=1  # POP3 접속을 원하면 주석을 해제하세요.</p><p>      - ONE_DIR=1</p><p>      - DMS_DEBUG=0</p><p>      - PERMIT_DOCKER=connected-networks</p><p>    cap_add:<br /></p><p>      - NET_ADMIN</p><p>      - SYS_PTRACE</p><p>    restart: always</p><p>      </p><p>volumes:</p><p>  phpmyadmin:</p><p>[/code]</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>docker-multi-site</b></span></p><p><br /></p><p>[code=docker]</p><p>version: '3'</p><p><br /></p><p>services:</p><p><br /></p><p>  db:</p><p>    image: mariadb:latest</p><p>    container_name: db</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    environment:</p><p>      - TZ=Asia/Seoul</p><p>    volumes:</p><p>      - ./data/dbdata:/var/lib/mysql</p><p>      - ./db:/docker-entrypoint-initdb.d</p><p><br /></p><p>  redis:</p><p>    container_name: redis</p><p>    image: redis:alpine</p><p>    restart: unless-stopped</p><p>    volumes:</p><p>      - ./data/dataredis:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes</p><p><br /></p><p>  smtp:</p><p>    image: namshi/smtp</p><p>    container_name: smtp_relay</p><p>    restart: always</p><p>    env_file: .env</p><p><br /></p><p>  php:</p><p>    depends_on:</p><p>      - db</p><p>    build:</p><p>      context: ./build</p><p>    container_name: php</p><p>    restart: unless-stopped</p><p>    env_file: .env</p><p>    volumes:</p><p>      - ./site:/var/www/html</p><p>      - ./php/php.ini:/usr/local/etc/php/php.ini</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  nginx:</p><p>    depends_on:</p><p>      - php</p><p>    image: nginx:alpine</p><p>    container_name: nginx</p><p>    restart: unless-stopped</p><p>    ports:</p><p>      - "80:80"</p><p>      - "443:443"</p><p>    volumes:</p><p>      - ./site:/var/www/html</p><p>      - ./nginx/conf.d:/etc/nginx/conf.d</p><p>      - ./nginx/nginx.conf:/etc/nginx/nginx.conf</p><p>      - ./nginx/logs:/var/log/nginx/</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  acme.sh:</p><p>    image: neilpang/acme.sh</p><p>    container_name: acme.sh</p><p>    env_file: .env</p><p>    volumes:</p><p>      - ./data/acme.sh:/acme.sh</p><p>      - ./site:/var/www/html</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    command: acme.sh --cron --home "/acme.sh"</p><p><br /></p><p>  phpmyadmin:</p><p>    image: phpmyadmin</p><p>    container_name: phpmyadmin</p><p>    #ports:</p><p>    #  - "80:80"</p><p>    environment:</p><p>      - PMA_HOST=db</p><p>    restart: always</p><p>    depends_on:</p><p>      - db</p><p>    volumes:</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  portainer:</p><p>    image: portainer/portainer-ce:alpine</p><p>    container_name: portainer</p><p>    restart: always</p><p>    #ports:</p><p>    #  - "9000:9000"</p><p>    volumes:</p><p>      - /var/run/docker.sock:/var/run/docker.sock</p><p>      - ./data/portainer_data:/data</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p><br /></p><p>  mail.example.com:</p><p>    image: tvial/docker-mailserver:latest</p><p>    hostname: mail.example.com</p><p>    domainname: example.com</p><p>    container_name: mail.example.com</p><p>    ports:</p><p>      - "25:25"   # SMTP SEND</p><p>      #- "110:110" # POP3 RECEIVE</p><p>      #- "143:143" # IMAP RECEIVE</p><p>      - "465:465" # ESMTP Enforced Encryption Submission</p><p>      #- "587:587" # ESMTP SEND</p><p>      - "993:993" # IMAP Enforced Encryption Retrieval</p><p>      #- "995:995" # POP3 Enforced Encryption Retrieval POP3가 필요하면 제일 앞에 주석을 해제하세요.</p><p>    volumes:</p><p>      - ./mail/maildata:/var/mail</p><p>      - ./mail/mailstate:/var/mail-state</p><p>      - ./mail/maillogs:/var/log/mail</p><p>      - ./mail/config/:/tmp/docker-mailserver/</p><p>      - ./site/ssl:/tmp/ssl:ro  # Certificate location</p><p>      - /etc/localtime:/etc/localtime:ro</p><p>      - /etc/timezone:/etc/timezone:ro</p><p>    environment:</p><p>      #- mail.env</p><p>      #- env-mailserver</p><p>      - SSL_TYPE=manual</p><p>      - SSL_CERT_PATH=/tmp/ssl/fullchain.pem # Certificate location</p><p>      - SSL_KEY_PATH=/tmp/ssl/privkey.pem # Certificate location</p><p>      - ENABLE_SPAMASSASSIN=1</p><p>      - SPAMASSASSIN_SPAM_TO_INBOX=1</p><p>      #- ENABLE_CLAMAV=1  # 바이러스 검사를 원하면 주석을 해제하세요.</p><p>      #- ENABLE_FAIL2BAN=1  # Fail2ban을 활성화하려면 주석을 해제하세요.</p><p>      - ENABLE_POSTGREY=1</p><p>      #- ENABLE_POP3=1  # POP3 접속을 원하면 주석을 해제하세요.</p><p>      - ONE_DIR=1</p><p>      - DMS_DEBUG=0</p><p>      - PERMIT_DOCKER=connected-networks</p><p>    cap_add:<br /></p><p>      - NET_ADMIN</p><p>      - SYS_PTRACE</p><p>    restart: always</p><p>[/code]</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>도커 권한 설정</b></span></p><p><br /></p><p>root의 경우 권한 설정을 할 필요가 없지만 일반 계정이라면 docker를 바로 실행할 수 있게 권한을 주는 것이 좋습니다.</p><p><br /></p><p>[code=bash]</p><p>sudo usermod -aG docker $USER</p><p>[/code]</p><p><br /></p><p>위 명령어로 일반 계정이 docker 명령어를 sudo 없이 바로 실행할 수 있게 해줍니다.</p><p><br /></p><p><b>SSH 창을 끄고 다시 접속하면</b>, sudo 없이 바로 docker나 docker-compose 명령어를 쓸 수 있습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>실행하기</b></span></p><p><br /></p><p>[code=bash]</p><p>docker-compose up -d mail.example.com</p><p>[/code]</p><p><br /></p><p><b>mail.example.com</b> 를 자신의 메일서버 이름으로 바꿉니다.</p><p><br /></p><p>위 명령어로 docker-mailserver 이미지를 다운 받고, 실행합니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>계정생성하기</b></span></p><p><br /></p><p>[code=bash]</p><p>curl -o setup.sh <a href="https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh;" rel="nofollow">https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh;</a> chmod a+x ./setup.sh</p><p>[/code]</p><p><br /></p><p>위 명령어로 셋업 스크립트를 다운 받습니다.</p><p><br /></p><p>이제 계정을 생성해야겠죠?</p><p><br /></p><p>[code=bash]</p><p>./setup.sh email add admin@example.com mypassword</p><p>[/code]</p><p><br /></p><p>위와 같이 <b>admin@example.com</b> 대신 자신이 원하는 이메일 계정, <b>mypassword</b> 대신 자신이 원하는 비번을 넣고 실행합니다.</p><p><br /></p><p>지금 만든 아이디와 비번이 마지막에 적용 예시에 들어갈 아이디 비번이라고 보면 됩니다.</p><p><br /></p><p>계정 생성이 끝났습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>DKIM 생성하기</b></span></p><p><br /></p><p>[code=bash]</p><p>./setup.sh config dkim</p><p>[/code]</p><p><br /></p><p>위 명령어로 생성합니다.</p><p><br /></p><p>[code=bash]</p><p>$ ./setup.sh config dkim</p><p>Creating DKIM private key /tmp/docker-mailserver/opendkim/keys/example.com/mail.private</p><p>Creating DKIM KeyTable</p><p>Creating DKIM SigningTable</p><p>Creating DKIM TrustedHosts</p><p>[/code]</p><p><br /></p><p>위와 같이 생성됩니다. 정말 쉽죠?</p><p><br /></p><p>./mail/config/opendkim/keys/example.com/mail.txt</p><p><br /></p><p>위 파일에 우리가 원하는 DKIM 설정 내용이 들어있습니다.</p><p><br /></p><p>해당 경로에 가서 mail.txt 파일을 열어보거나</p><p><br /></p><p>[code=bash]</p><p>sudo cat ./mail/config/opendkim/keys/example.com/mail.txt</p><p>[/code]</p><p><br /></p><p>위 명령어로 출력하면</p><p><br /></p><p>[code=bash]</p><p>mail._domainkey<span style="white-space:pre;">	</span>IN<span style="white-space:pre;">	</span>TXT<span style="white-space:pre;">	</span>( "v=DKIM1; h=sha256; k=rsa; "</p><p><span style="white-space:pre;">	</span>  "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0p"</p><p><span style="white-space:pre;">	</span>  "t0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB" )  ; ----- DKIM key mail for example.com</p><p>[/code]</p><p><br /></p><p>위와 같이 엄청나게 긴 내용이 나옵니다.</p><p><br /></p><p>이제 DNS 설정에 들어갈 내용으로 변환할 것입니다. 쌍따옴표를 제거하면 된다고 보면 되는데요.</p><p><br /></p><p>[code=bash]</p><p>"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0p"</p><p><span style="white-space:pre;">	</span>  "t0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB"</p><p>[/code]</p><p><br /></p><p>특히 위 부분이 나눠진게 아니라 합쳐줘야 됩니다. 따라서 최종 완성본은</p><p><br /></p><p>[code=bash]</p><p>v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0pt0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB</p><p>[/code]</p><p><br /></p><p>위와 같이 한줄로 만들면 됩니다. 메모장에 저장해두세요. DNS설정에 꼭 들어가야 됩니다.</p><p><br /></p><p>이제 도커에서 작업은 끝났습니다.</p><p><br /></p><p><br /></p><p>[code=bash]</p><p>sudo docker-compose up -d --force-recreate mail.example.com</p><p>[/code]</p><p><br /></p><p><b>mail.example.com</b> 를 자신의 메일서버 이름으로 바꿉니다.</p><p><br /></p><p>위 명령어로 재생성해줍니다.</p><p><br /></p><p>이제 서버에서 메일서버가 구동되기 시작했습니다.</p><p><br /></p><p>혹시 portainer에서 log를 봤을 때 dovecot 로그가 지속적으로 찍힌다면 SSL 인증서 경로가 잘못된 것이니 꼭 수정해주세요.</p><p><br /></p><p><br /></p><p><b><span style="font-size:24pt;">DNS 설정하기</span></b></p><p><br /></p><p>이제 DNS 설정을 해줍니다.</p><p><br /></p><p>총 5개를 입력할 것입니다.</p><p><br /></p><p>[code=bash]</p><p>1. Type : A, Name : mail, Content : 서버IP주소</p><p>2. Type : MX, Name : @(host), Content : mail.example.com, Priority : 10</p><p>3. Type : TXT, Name : @(host), Content : v=spf1 mx ~all</p><p>4. Type : TXT, Name : _dmarc, Content : v=DMARC1; p=none; rua=mailto:admin@example.com; ruf=mailto:admin@example.com; sp=none; ri=86400</p><p>5. Type : TXT, Name : mail._domainkey, Content : v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvD0NKCyd0/7C25kQ75/cY+upZzGlxNiY8GMELiUoBox9FFaxuGZMImrJVQW/tGt9fQgEyKobQTZjqguEcp4Yg4e9GRFCcSKBOWyvZqjUpl3+cY/csov89kD98V4BUeVQ/GdDYt81HV7IuYlJ57JyS/idYyKe9WuvCmnZMQJvfCjZEBtk2+OIeQqJHWVKILyIEdpq3PzeFm1V0pt0D8wpGPoBD6aE2FQkQTpZN5APcmAIHAO6RVnjo1ihGujh2aiuRGI7ECXBFIo8os9G85WnFJVUdkjD55x1ZLLNeo6WmQnd3JteuarcLVFjWOCSKPVmcS8/YorZrbR7qleDEnD/6QIDAQAB</p><p>[/code]</p><p><br /></p><p>위와 같이 5개를 넣어주면 됩니다.</p><p><br /></p><p>참고로 @(host)는 클라우드플레어에서는 @를 넣으면 host가 되고, luadns에서는 비워둬야 hostname이 됩니다.</p><p><br /></p><p>1번은 mail.example.com이 서버의 IP를 가리키게 하는 것입니다. 참고로 클라우드플레어 사용시 DNS only로 지정해야 됩니다. 서버 IP 노출은 어쩔 수 없습니다.</p><p>2번은 MX 레코드를 지정하는 것입니다.</p><p>3번은 SPF 설정입니다. MX레코드에 지정된 도메인의 IP를 찾아서 검증하는 것입니다.</p><p>4번은 DMARC 설정입니다. 스팸이메일 처리에 대한 규칙을 적은 것입니다. none은 아무것도 안하는 것이고, mailto가 2개 있는데 보고서를 받는 이메일을 넣으면 됩니다. <a href="https://samsikworld.tistory.com/488" rel="nofollow">https://samsikworld.tistory.com/488</a> 링크를 참조하세요.</p><p>5번은 DKIM 설정입니다. 아까 생성했던 그 DKIM을 입력하면 됩니다. 제가 넣은 것과 똑같이 넣으면 절대로 안되고 자신에게 맞는 값을 넣어야 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>rDNS, 리버스 DNS, 리버스 도메인, PTR 레코드 설정하기</b></span></p><p><br /></p><p>리버스 도메인이란 일반적인 도메인 조회가 영문 주소(도메인 네임)를 DNS에 질의하여 IP 주소를 찾는 것과 반대로, IP 주소를 사용하여 도메인 네임을 찾는 것을 의미합니다. (나무위키 펌)</p><p><br /></p><p>구글, 다음 메일은 리버스 DNS를 설정하지 않아도 SPF, DMARC, DKIM 작업만 하면 정상 메일로 인식합니다. (네이버 메일은 공지에는 스팸처리한다고 합니다. 저는 스팸처리 안되고 정상 메일처리되더군요 ㅎㅎ)</p><p><br /></p><p>하지만 카카오메일, 프로톤메일 등 몇몇 업체들은 리버스 DNS 설정을 하지 않으면 바로 스팸메일로 분류합니다.</p><p><br /></p><p>AWS : <a href="https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-port-25-throttle" rel="nofollow">https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-port-25-throttle</a></p><p><br /></p><p>Azure : <a href="https://docs.microsoft.com/ko-kr/azure/virtual-network/troubleshoot-outbound-smtp-connectivity" rel="nofollow">https://docs.microsoft.com/ko-kr/azure/virtual-network/troubleshoot-outbound-smtp-connectivity</a> </p><p><br /></p><p>오라클 클라우드 : <a href="https://docs.cloud.oracle.com/en-us/iaas/Content/DNS/Tasks/reversedns.htm" rel="nofollow">https://docs.cloud.oracle.com/en-us/iaas/Content/DNS/Tasks/reversedns.htm</a></p><p><br /></p><p>구글 클라우드 : <a href="https://cloud.google.com/compute/docs/instances/create-ptr-record" rel="nofollow">https://cloud.google.com/compute/docs/instances/create-ptr-record</a></p><p><br /></p><p>KT : <a href="https://dms.kornet.net/reverse" rel="nofollow">https://dms.kornet.net/reverse</a></p><p><br /></p><p>나무 위키 리버스 도메인 설명 : <a href="https://namu.wiki/w/%EB%A6%AC%EB%B2%84%EC%8A%A4%20%EB%8F%84%EB%A9%94%EC%9D%B8" rel="nofollow">https://namu.wiki/w/%EB%A6%AC%EB%B2%84%EC%8A%A4%20%EB%8F%84%EB%A9%94%EC%9D%B8</a></p><p><br /></p><p>리버스 도메인 설정방법은 각 IP 제공자에 따라 다르므로 호스팅이나 클라우드 사업자에게 직접 요청하거나 설정해야 합니다.</p><p><br /></p><p>그리고 KISA 불법스팸대응센터에 화이트 도메인 신청을 해야 국내업체의 스팸처리 확률이 줄어듭니다.</p><p><br /></p><p>화이트도메인 등록 신청하기 : <a href="https://spam.kisa.or.kr/white/sub4.do" rel="nofollow">https://spam.kisa.or.kr/white/sub4.do</a></p><p><br /></p><p>이제 DNS 설정, rDNS 설정, 화이트도메인 신청이 끝났습니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>각 프로그램 별 설정 방법</b></span></p><p><br /></p><p>대부분의 프로그램 및 어플에서 IMAP 방식의 접속을 지원합니다.</p><p><br /></p><p>우리가 설정했던 IMAP SSL/TLS 방식과 완벽 호환되므로, 그 방식으로 설정하면 됩니다.</p><p><br /></p><p><span style="font-size:24pt;"><b>그누보드 설정</b></span></p><p><br /></p><p>./config.php 173번째줄</p><p><br /></p><p>[code=bash]</p><p>// SMTP</p><p>// lib/mailer.lib.php 에서 사용</p><p>define('G5_SMTP',      'mail.example.com');</p><p>define('G5_SMTP_PORT', '25');</p><p>[/code]</p><p><br /></p><p>위와 같이 변경하기</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>라이믹스 설정</b></span></p><p><br /></p><p>[code=bash]</p><p>발송방법 : SMTP</p><p>SMTP 서버 : mail.example.com</p><p>SMTP 포트 : 465</p><p>SMTP 보안 : SSL</p><p>아이디 : admin@example.com</p><p>비번 : 설정한 비밀번호</p><p>[/code]</p><p><br /></p><p>이러면 끝</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>워드프레스</b></span></p><p><br /></p><p>Post SMTP Mailer/Email Log 플러그인 기준</p><p><br /></p><p><a href="https://wordpress.org/plugins/post-smtp/" rel="nofollow">https://wordpress.org/plugins/post-smtp/</a></p><p><br /></p><p>[code=bash]</p><p>Transport</p><p><br /></p><p>Type : SMTP</p><p>Mailer Type : PostSMTP</p><p><br /></p><p>Transport Settings</p><p><br /></p><p>Outgoing Mail Server Hostname : mail.example.com</p><p>Outgoing Mail Server Port : 465</p><p>Envelope-From Email Address : admin@example.com</p><p>Security : SMTPS</p><p>Authentication : Plain</p><p><br /></p><p>Authentication</p><p>Username : admin@example.com</p><p>Password : 설정한 비밀번호</p><p>[/code]</p><p><br /></p><p><span style="font-size:24pt;"><b>아웃룩</b></span></p><p><br /></p><p>계정 넣고 고급 옵션을 누른 후 "내 계정을 수동으로 설정합니다." 체크 후 연결 클릭, <b>IMAP</b> 선택하기</p><p><br /></p><p><b>받는 메일</b></p><p><br /></p><p>[code=bash]</p><p>사용자이름 : admin@example.com</p><p>비번 : 설정한 비밀번호</p><p><br /></p><p>서버 : mail.example.com</p><p>포트: 993</p><p>암호화방법 : SSL/TLS</p><p>SPA(보안 암호 인증)를 사용한 로그인 필요 체크 해제</p><p>[/code]</p><p><br /></p><p><b>보내는 메일</b></p><p><br /></p><p>[code=bash]</p><p>서버 : mail.example.com</p><p>포트 : 465</p><p>암호화방법 : SSL/TLS</p><p>SPA(보안 암호 인증)를 사용한 로그온 필요 : 체크 해제</p><p>발신(SMTP) 서버에 인증필요 체크 : 받는 메일 서버와 동일한 설정 사용</p><p>[/code]</p><p><br /></p><p><span style="font-size:24pt;"><b>구글 안드로이드 지메일 설정하기</b></span></p><p><br /></p><p><b>수신설정</b></p><p><br /></p><p>[code=bash]</p><p>사용자이름 admin@example.com</p><p>비번 : 설정한 비밀번호</p><p>서버 : mail.example.com</p><p>포트 : 993</p><p>보안유형 : SSL/TLS</p><p>[/code]</p><p><br /></p><p><b>발신설정</b></p><p><br /></p><p>[code=bash]</p><p>사용자이름 : admin@example.com</p><p>비번 : 설정한 비밀번호</p><p>SMTP 서버 : mail.example.com</p><p>포트 : 465</p><p>보안유형 : SSL/TLS</p><p>[/code]</p><p><br /></p><p><br /></p><p>참고로 POP3 방식으로 접속하려면 받는 서버를 995번으로 설정하고 보안유형에 SSL/TLS로 설정하면 됩니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;"><b>참고 사이트</b></span></p><p><br /></p><p>도커 메일서버 : <a href="https://github.com/tomav/docker-mailserver" rel="nofollow">https://github.com/tomav/docker-mailserver</a> </p><p><br /></p><p>sfuhost에서 메일서버 셋팅방법 : <a href="https://sfuhost.com/manual/700380" rel="nofollow">https://sfuhost.com/manual/700380</a> </p><p><br /></p><p>구글클라우드 메일서버 셋팅방법 : <a href="https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88" rel="nofollow">https://medium.com/minds-in-the-cloud/spin-off-an-email-server-with-containers-using-docker-compose-on-google-cloud-platform-debian-9-aa0fe8bf3d88</a> </p><p><br /></p><p>DMARC 개념 정리 : <a href="https://samsikworld.tistory.com/488" rel="nofollow">https://samsikworld.tistory.com/488</a> </p><p><br /></p><p>Opening Mail Server : <a href="https://blog.0chan.dev/2020-06-16-Opening-Mail-Server/" rel="nofollow">https://blog.0chan.dev/2020-06-16-Opening-Mail-Server/</a> </p>]]></description>
<dc:creator>우성짱</dc:creator>
<dc:date>2020-09-24T21:55:59+09:00</dc:date>
</item>


<item>
<title>그누보드5.4 나리야빌더에서 box shadow 효과 적용하기</title>
<link>https://www.wsgvet.com/home/669</link>
<description><![CDATA[<p>현재 제 홈페이지 본문 이미지에 적용된 box shadow 효과를 적용하는 방법에 대해 알려드리겠습니다.<br /></p><p><br /></p><p>우선 적용 전 이미지입니다.</p><p><br /></p><div style="text-align:center;" align="center"><img src="https://cdn.wsgvet.com/data/editor/2009/4be450638fbbbada2c8be12f2669e051_1600777636_0421.png" title="4be450638fbbbada2c8be12f2669e051_1600777636_0421.png" alt="4be450638fbbbada2c8be12f2669e051_1600777636_0421.png" /></div><br /><p><br /></p><p>위와 같이 사진이 흰색 배경이라면, 글과 이미지의 경계가 명확하지 않아 가독성이 떨어집니다.</p><p><br /></p><p><br /></p><p><br /></p><p>이제 적용 후 이미지입니다.</p><p><br /></p><div style="text-align:center;" align="center"><img src="https://cdn.wsgvet.com/data/editor/2009/4be450638fbbbada2c8be12f2669e051_1600777665_9267.png" title="4be450638fbbbada2c8be12f2669e051_1600777665_9267.png" alt="4be450638fbbbada2c8be12f2669e051_1600777665_9267.png" /></div> <p><br /></p><p>위와 같이 흰색 배경인 사진도 글과의 경계가 명확해지면서 가독성이 올라갑니다.</p><p><br /></p><p><br /></p><p>이제 <b>적용</b> 방법을 알려드리겠습니다.</p><p><br /></p><p>/skin/board/NB-Basic/style.css 파일에서</p><p><br /></p><p>25번째 줄에 있는</p><p><br /></p><p>[code=css]</p><p>#bo_v_con img {</p><p><span style="white-space:pre;">	</span>max-width:100%;</p><p><span style="white-space:pre;">	</span>height:auto;</p><p>}</p><p>[/code]</p><p><br /></p><p>위 내용을</p><p><br /></p><p>[code=css]</p><p>#bo_v_con img {</p><p><span style="white-space:pre;">	</span>max-width:100%;</p><p><span style="white-space:pre;">	</span>height:auto;</p><p><span style="white-space:pre;">	</span>-webkit-box-shadow: 0px 0px 12px 3px rgba(163,163,163,0.93);</p><p><span style="white-space:pre;">	</span>-moz-box-shadow: 0px 0px 12px 3px rgba(163,163,163,0.93);</p><p><span style="white-space:pre;">	</span>box-shadow: 0px 0px 12px 3px rgba(163,163,163,0.93);</p><p>}</p><p>[/code]</p><p><br /></p><p>위와 같이 box-shadow 효과를 추가해줍니다.</p><p><br /></p><p><br /></p><p>그리고 44번째 줄 근처에 있는 </p><p><br /></p><p>[code=css]</p><p>#bo_v_img a.view_image {</p><p><span style="white-space:pre;">	</span>display:block;</p><p>}</p><p>[/code]</p><p><br /></p><p>위 내용을</p><p><br /></p><p>[code=css]</p><p>#bo_v_img a.view_image {</p><p><span style="white-space:pre;">	</span>display:block;</p><p><span style="white-space:pre;">	</span>margin:1.0rem;</p><p>}</p><p>[/code]</p><p><br /></p><p>위와 같이 마진을 추가해줍니다. </p><p><br /></p><p>이걸 넣어야 모바일에서도 박스 쉐도우 효과가 깨지지 않습니다.</p><p><br /></p><p><br /></p><p>참 쉽죠? ^^</p>]]></description>
<dc:creator>우성짱</dc:creator>
<dc:date>2020-09-22T21:28:32+09:00</dc:date>
</item>


<item>
<title>그누보드 나리야빌더 NB-Basic 보드스킨 GIF 움짤 표현 최적화하기</title>
<link>https://www.wsgvet.com/home/666</link>
<description><![CDATA[<p>그누보드 5.4.2.8 버전부터 움직이는 GIF 이미지를 올리면 MP4나 WEBM으로 변환하여 보여줄 수 있습니다.<br /></p><p><br /></p><p><a href="https://sir.kr/g5_plugin/7521" rel="nofollow">https://sir.kr/g5_plugin/7521</a></p><p><br /></p><p>위 플러그인으로 가능합니다.</p><p><br /></p><p>여기에 CSS만 추가로 작업해주면 표현해주는데 완벽할 것입니다.</p><p><br /></p><p>현재로서는 GIF 움짤 원본 이미지 사이즈에 맞게 표시가 되므로, 가로가 큰 움짤의 경우 모바일에서 보면 짤립니다.</p><p><br /></p><p>/skin/board/NB-Basic/style.css</p><p><br /></p><p>그래서 위 파일의 24번째 줄 근처에</p><p><br /></p><p>[code=css]</p><p>#bo_v_con video{</p><p><span style="white-space:pre;">	</span>max-width:100%;height:auto</p><p>}</p><p>video[poster]{</p><p><span style="white-space:pre;">	</span>object-fit:fill</p><p>}</p><p>[/code]</p><p><br /></p><p>위 내용을 추가해주면, 가로폭이 줄어드는만큼 움짤도 줄여서 보여줄 것입니다.</p><p><br /></p><p><br /></p><p><span style="font-size:24pt;">적용 전</span></p><p><br /></p><p style="text-align:center;" align="center"><img src="https://cdn.wsgvet.com/data/editor/2009/babc0c1a2885f9caab4ee75d30fc553d_1599736225_5002.png" title="babc0c1a2885f9caab4ee75d30fc553d_1599736225_5002.png" alt="babc0c1a2885f9caab4ee75d30fc553d_1599736225_5002.png" /></p><p><br /></p><p>오른쪽이 짤려서 오토바이가 안보입니다.</p><p><br /></p><p>---</p><p><br /></p><p><span style="font-size:24pt;">적용 후</span></p><p><br /></p><p><br style="clear:both;" /></p><div style="text-align:center;" align="center"><img src="https://cdn.wsgvet.com/data/editor/2009/babc0c1a2885f9caab4ee75d30fc553d_1599736259_2052.png" title="babc0c1a2885f9caab4ee75d30fc553d_1599736259_2052.png" alt="babc0c1a2885f9caab4ee75d30fc553d_1599736259_2052.png" /></div> <p>가로 크기가 조정되어 오토바이가 잘 보입니다.</p>]]></description>
<dc:creator>우성짱</dc:creator>
<dc:date>2020-09-10T20:11:57+09:00</dc:date>
</item>

</channel>
</rss>
