분류 서버

Acme.sh Docker 이미지로 와일드카드 인증서 발급받기

컨텐츠 정보

본문

3232235777_o9xbOPr2_80a2297a677ca86bb6210dbb3071d63e07889230.png 



1. 왜 도커로 설치할까요?


DNS 인증을 통한 acme.sh Letsencrypt SSL 인증서 발급받기


LuaDNS API를 이용한 무료도메인 와일드카드 SSL 인증서 발급 받기 


acme.sh를 이용한 ECDSA Wildcard SSL 인증서 발급받는 방법 


위와 같이 acme.sh를 활용한 글을 적었었는데요.


이번에는 acme.sh 도커 이미지로 발급 받는 방법에 대해 적습니다.


도커 이미지를 활용하면 호스트(내 컴퓨터, 또는 내 서버)에 지저분하게 깔리지 않고,


이미지 1개만 다운 받고 도커로 실행되기 때문에 깔끔합니다.


지우고 싶으면 그냥 도커 컨테이너와 이미지만 지우면 되구요.


언제 어디서나 같은 이미지를 활용할 수 있기 때문에 관리하기도 편합니다.


그리고 도커 이미지끼리 SSL 인증서 활용에도 더 편하기도 하구요.


또한 DNS API 인증으로 발급 받기 때문에 현재 서버에 웹서버가 없어도 발급됩니다.


도커 이외에 어떤 의존성도 없이 발급받을 수 있기 때문에 강력 추천합니다.



2. 와일드카드 인증서 발급을 위한 DNS API 정하기


https://github.com/acmesh-official/acme.sh/wiki/dnsapi


위 링크에 보면 DNS 제공자에 따른 설정 방법을 모두 적어두었습니다.


대표적으로 클라우드플레어 DNS API 설정 및 LuaDNS API 설정에 대해 알려드리겠습니다.


일반적인 유료 도메인(com, net, me, dev 등등)의 경우는 클라우드플레어를 추천합니다.


freenom의 무료 도메인(cf, ga, gq, ml, tk)의 경우는 LuaDNS를 추천합니다.


제가 추천한다고 해서 이 서비스들이 무조건 제일 좋다는게 아니고 설정하기 편해서 그렇습니다.


다른 DNS서비스도 같은 개념으로 발급받을 수 있으니 참조하시면 되겠습니다.


(1) 클라우드플레어를 선택했다면


클라우드플레어에 가입 및 도메인 등록 후


https://www.wsgvet.com/bbs/board.php?bo_table=home&wr_id=639


위 링크의 2번에서 API key를 찾습니다.



CF_Key=1231kjh23kj1h23kj1h23kj1h23123
CF_Email=email@email.com


위와 같이 설정할 것입니다.


(2) LuaDNS를 선택했다면


https://www.wsgvet.com/bbs/board.php?bo_table=home&wr_id=640


위 링크처럼 가입 및 도메인 설정한 뒤 4번의 API Token 값을 찾습니다.



LUA_Key=1231kjh23kj1h23kj1h23kj1h23123
LUA_Email=email@email.com


위와 같이 설정할 것입니다.



이제 이렇게 찾은 값을 .env 파일에 저장 할 것입니다.



nano .env


위와 같이 .env 파일을 생성합니다.


그리고 위에서 설정한 내용을 그대로 넣고 


컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.



3. Docker Compose 설정하기


저는 docker 명령어보다 docker-compose를 더 좋아합니다.


더 편하고 직관적인 느낌이 좋더라구요 ㅎㅎ


아직 도커를 설치하지 않았다면


https://www.wsgvet.com/bbs/board.php?bo_table=ubuntu&wr_id=96


위 링크의 1번과 2번을 참조하여 설치하면 됩니다.



우선 인증서가 들어갈 폴더를 생성합니다.


폴더까지 자동으로 생성해주지는 않더라구요.



mkdir -p ./site/ssl


위와 같이 현재 위치에서 site 폴더와 그 하위에 ssl 이라는 폴더를 같이 생성했습니다.


이제 ssl 폴더에 인증서를 넣을 것입니다.



nano docker-compose.yml


위 명령어로 도커 컴포즈 파일을 생성합니다.



version: '3'


services:


  acme.sh:
    image: neilpang/acme.sh

    container_name: acme.sh
    env_file: .env
    volumes:
      - ./data/acme.sh:/acme.sh
      - ./site:/var/www/html
    command: acme.sh --issue --staging --dns dns_cf -d example.com -d *.example.com --key-file /var/www/html/ssl/privkey.pem --fullchain-file /var/www/html/ssl/fullchain.pem --cert-file /var/www/html/ssl/chain.pem


위 내용은 클라우드플레어를 선택했다면 쓸 수 있는 내용입니다.


LuaDNS를 선택했다면 dns_cf 대신에 dns_lua를 넣으면 됩니다.



version: '3'


services:


  acme.sh:
    image: neilpang/acme.sh

    container_name: acme.sh
    env_file: .env
    volumes:
      - ./data/acme.sh:/acme.sh
      - ./site:/var/www/html
    command: acme.sh --issue --staging --dns dns_lua -d example.com -d *.example.com --key-file /var/www/html/ssl/privkey.pem --fullchain-file /var/www/html/ssl/fullchain.pem --cert-file /var/www/html/ssl/chain.pem


LuaDNS의 경우 위와 같이 설정하면 되겠죠? 


도메인은 꼭 자신의 것으로 바꿔주시구요.


컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.


이제 도커를 실행해봅니다.



4. 테스트 인증서 발급받기



sudo docker-compose up acme.sh


위 명령어를 내리면



# sudo docker-compose up acme.sh
Pulling acme.sh (neilpang/acme.sh:)...
latest: Pulling from neilpang/acme.sh
df20fa9351a1: Already exists
55ffa67455e2: Pull complete
3952aebf6eeb: Pull complete
38619139bf4b: Pull complete
291023932359: Pull complete
90ac48033759: Pull complete
3dab76226369: Pull complete
Digest: sha256:86cf3be4cd01039c0a9eb8463a6621ba8454049189b9e25020f7b5ce19d92bbb
Status: Downloaded newer image for neilpang/acme.sh:latest
Creating acme.sh    ... done
Attaching to acme.sh
acme.sh       | [Mon Aug 17 13:10:18 UTC 2020] Using stage ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory
acme.sh       | [Mon Aug 17 13:10:20 UTC 2020] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
acme.sh       | [Mon Aug 17 13:10:20 UTC 2020] Creating domain key
acme.sh       | [Mon Aug 17 13:10:20 UTC 2020] The domain key is here: /acme.sh/example.com/example.com.key
acme.sh       | [Mon Aug 17 13:10:20 UTC 2020] Multi domain='DNS:example.com,DNS:*.example.com'
acme.sh       | [Mon Aug 17 13:10:20 UTC 2020] Getting domain auth token for each domain
acme.sh       | [Mon Aug 17 13:10:26 UTC 2020] Getting webroot for domain='example.com'
acme.sh       | [Mon Aug 17 13:10:26 UTC 2020] Getting webroot for domain='*.example.com'
acme.sh       | [Mon Aug 17 13:10:26 UTC 2020] Adding txt value: gI9uqlc4amM0BDx-MccFJe2sFlY6V1MmlbzzKLssASQ for domain:  _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:10:27 UTC 2020] Adding record
acme.sh       | [Mon Aug 17 13:10:28 UTC 2020] Added
acme.sh       | [Mon Aug 17 13:10:28 UTC 2020] The txt record is added: Success.
acme.sh       | [Mon Aug 17 13:10:28 UTC 2020] Adding txt value: CRCFCAdWkZIpYlCcrM8CM7tDFdY4Ffg318D9ZLS2-Io for domain:  _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:10:29 UTC 2020] Adding record
acme.sh       | [Mon Aug 17 13:10:30 UTC 2020] Added
acme.sh       | [Mon Aug 17 13:10:30 UTC 2020] The txt record is added: Success.
acme.sh       | [Mon Aug 17 13:10:30 UTC 2020] Let's check each DNS record now. Sleep 20 seconds first.
acme.sh       | [Mon Aug 17 13:10:50 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:10:53 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh       | [Mon Aug 17 13:10:53 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:10:56 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh       | [Mon Aug 17 13:10:56 UTC 2020] All success, let's return
acme.sh       | [Mon Aug 17 13:10:56 UTC 2020] Verifying: example.com
acme.sh       | [Mon Aug 17 13:11:01 UTC 2020] Success
acme.sh       | [Mon Aug 17 13:11:01 UTC 2020] Verifying: *.example.com
acme.sh       | [Mon Aug 17 13:11:06 UTC 2020] Success
acme.sh       | [Mon Aug 17 13:11:06 UTC 2020] Removing DNS records.
acme.sh       | [Mon Aug 17 13:11:06 UTC 2020] Removing txt: gI9uqlc4amM0BDx-MccFJe2sFlY6V1MmlbzzKLssASQ for domain: _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:11:09 UTC 2020] Removed: Success
acme.sh       | [Mon Aug 17 13:11:09 UTC 2020] Removing txt: CRCFCAdWkZIpYlCcrM8CM7tDFdY4Ffg318D9ZLS2-Io for domain: _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:11:11 UTC 2020] Removed: Success
acme.sh       | [Mon Aug 17 13:11:11 UTC 2020] Verify finished, start to sign.
acme.sh       | [Mon Aug 17 13:11:11 UTC 2020] Lets finalize the order, Le_OrderFinalize: https://acme-staging-v02.api.letsencrypt.org/acme/finalize/15180878/133054507
acme.sh       | [Mon Aug 17 13:11:13 UTC 2020] Downloading cert, Le_LinkCert: https://acme-staging-v02.api.letsencrypt.org/acme/cert/fa3e9587a3386dee4a6794c43e267ba062b3
acme.sh       | [Mon Aug 17 13:11:15 UTC 2020] Cert success.
acme.sh       | -----BEGIN CERTIFICATE-----
acme.sh       | -----END CERTIFICATE-----
acme.sh       | [Mon Aug 17 13:11:15 UTC 2020] Your cert is in  /acme.sh/example.com/example.com.cer
acme.sh       | [Mon Aug 17 13:11:15 UTC 2020] Your cert key is in  /acme.sh/example.com/example.com.key
acme.sh       | [Mon Aug 17 13:11:15 UTC 2020] The intermediate CA cert is in  /acme.sh/example.com/ca.cer
acme.sh       | [Mon Aug 17 13:11:15 UTC 2020] And the full chain certs is there:  /acme.sh/example.com/fullchain.cer
acme.sh       | [Mon Aug 17 13:11:15 UTC 2020] Installing cert to:/var/www/html/example.com/chain.pem
acme.sh       | [Mon Aug 17 13:11:16 UTC 2020] Installing cert to:/var/www/html/ssl/chain.pem
acme.sh       | [Mon Aug 17 13:11:16 UTC 2020] Installing key to:/var/www/html/ssl/privkey.pem
acme.sh       | [Mon Aug 17 13:11:16 UTC 2020] Installing full chain to:/var/www/html/ssl/fullchain.pem
acme.sh exited with code 0


위와 같이 정상적으로 발급 받고, 원하는 위치에 인증서가 들어간 것을 볼 수 있습니다.


호스트(내 컴퓨터, 서버)에서는 아까 생성한 site/ssl 폴더에 인증서가 들어간 것을 확인할 수 있습니다.



5. SSL 인증서 발급받기


방금 발급받은 것은 staging에서 발급 받은 것으로 실사용에서는 쓸 수 없습니다.


테스트로 받은 이유는 Let's Encrypt에서 일주일에 받을 수 있는 인증서 갯수를 정해놨기 때문입니다.


이리저리 테스트하다가 그 횟수를 넘기면 일주일이나 기다려야하기 때문에 테스트용으로 받은 것입니다.


테스트 인증서를 문제없이 발급 받았다면, 이제 옵션을 바꿔봅시다.



nano docker-compose.yml


위 명령어로 도커 컴포즈 파일에 들어갑니다.



version: '3'


services:


  acme.sh:
    image: neilpang/acme.sh

    container_name: acme.sh
    env_file: .env
    volumes:
      - ./data/acme.sh:/acme.sh
      - ./site:/var/www/html
    command: acme.sh --issue --force --dns dns_cf -d example.com -d *.example.com --key-file /var/www/html/ssl/privkey.pem --fullchain-file /var/www/html/ssl/fullchain.pem --cert-file /var/www/html/ssl/chain.pem


위 내용처럼 수정합니다.


즉, --staging을 지우고 --force 옵션을 넣은 것입니다.


LuaDNS를 선택했다면 dns_cf 대신에 dns_lua를 넣으면 됩니다.


컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.



sudo docker-compose up acme.sh


위 명령어로 시작해줍니다.



#sudo docker-compose up acme.sh
Attaching to acme.sh

acme.sh       | [Mon Aug 17 13:37:16 UTC 2020] Using CA: https://acme-v02.api.letsencrypt.org/directory
acme.sh       | [Mon Aug 17 13:37:16 UTC 2020] Multi domain='DNS:example.com,DNS:*.example.com'
acme.sh       | [Mon Aug 17 13:37:16 UTC 2020] Getting domain auth token for each domain
acme.sh       | [Mon Aug 17 13:37:23 UTC 2020] Getting webroot for domain='example.com'
acme.sh       | [Mon Aug 17 13:37:23 UTC 2020] Getting webroot for domain='*.example.com'
acme.sh       | [Mon Aug 17 13:37:23 UTC 2020] Adding txt value: 6nHrBw7aIRm13eqih_20FAePSw9clq5m80_AyWdOHlw for domain:  _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:37:24 UTC 2020] Adding record
acme.sh       | [Mon Aug 17 13:37:25 UTC 2020] Added
acme.sh       | [Mon Aug 17 13:37:25 UTC 2020] The txt record is added: Success.
acme.sh       | [Mon Aug 17 13:37:25 UTC 2020] Adding txt value: WJK_hTqAP_6NEqUzP20cpDejt-yUl27-Ki6QslGB8cI for domain:  _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:37:26 UTC 2020] Adding record
acme.sh       | [Mon Aug 17 13:37:27 UTC 2020] Added
acme.sh       | [Mon Aug 17 13:37:27 UTC 2020] The txt record is added: Success.
acme.sh       | [Mon Aug 17 13:37:27 UTC 2020] Let's check each DNS record now. Sleep 20 seconds first.
acme.sh       | [Mon Aug 17 13:37:47 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:37:49 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh       | [Mon Aug 17 13:37:49 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:37:50 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh       | [Mon Aug 17 13:37:50 UTC 2020] All success, let's return
acme.sh       | [Mon Aug 17 13:37:50 UTC 2020] Verifying: example.com
acme.sh       | [Mon Aug 17 13:37:56 UTC 2020] Success
acme.sh       | [Mon Aug 17 13:37:56 UTC 2020] Verifying: *.example.com
acme.sh       | [Mon Aug 17 13:38:01 UTC 2020] Success
acme.sh       | [Mon Aug 17 13:38:01 UTC 2020] Removing DNS records.
acme.sh       | [Mon Aug 17 13:38:01 UTC 2020] Removing txt: 6nHrBw7aIRm13eqih_20FAePSw9clq5m80_AyWdOHlw for domain: _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:38:04 UTC 2020] Removed: Success
acme.sh       | [Mon Aug 17 13:38:04 UTC 2020] Removing txt: WJK_hTqAP_6NEqUzP20cpDejt-yUl27-Ki6QslGB8cI for domain: _acme-challenge.example.com
acme.sh       | [Mon Aug 17 13:38:07 UTC 2020] Removed: Success
acme.sh       | [Mon Aug 17 13:38:07 UTC 2020] Verify finished, start to sign.
acme.sh       | [Mon Aug 17 13:38:07 UTC 2020] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/94082185/4730969880
acme.sh       | [Mon Aug 17 13:38:10 UTC 2020] Downloading cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/03da5cee1b8fcb695e54f29747f01f7eecbe
acme.sh       | [Mon Aug 17 13:38:12 UTC 2020] Cert success.
acme.sh       | -----BEGIN CERTIFICATE-----
acme.sh       | -----END CERTIFICATE-----
acme.sh       | [Mon Aug 17 13:38:12 UTC 2020] Your cert is in  /acme.sh/example.com/example.com.cer
acme.sh       | [Mon Aug 17 13:38:12 UTC 2020] Your cert key is in  /acme.sh/example.com/example.com.key
acme.sh       | [Mon Aug 17 13:38:12 UTC 2020] The intermediate CA cert is in  /acme.sh/example.com/ca.cer
acme.sh       | [Mon Aug 17 13:38:12 UTC 2020] And the full chain certs is there:  /acme.sh/example.com/fullchain.cer
acme.sh       | [Mon Aug 17 13:40:38 UTC 2020] Installing cert to:/var/www/html/ssl/chain.pem
acme.sh       | [Mon Aug 17 13:40:38 UTC 2020] Installing key to:/var/www/html/ssl/privkey.pem
acme.sh       | [Mon Aug 17 13:40:38 UTC 2020] Installing full chain to:/var/www/html/ssl/fullchain.pem
acme.sh exited with code 0


위와 같이 발행된 것을 확인할 수 있습니다.



6. 자동갱신 설정 Cron에 넣어주기


위 내용을 보면 아시겠지만 acme.sh 컨테이너는 본연의 임무를 수행하고 정지됩니다.


그러므로 자동갱신은 cron으로 따로 작성해야 합니다.


우선 도커 컴포즈 파일을 수정합니다.



nano docker-compose.yml


위 명령어로 도커 컴포즈 파일에 들어갑니다.



version: '3'


services:


  acme.sh:
    image: neilpang/acme.sh

    container_name: acme.sh
    env_file: .env
    volumes:
      - ./data/acme.sh:/acme.sh
      - ./site:/var/www/html
    command: acme.sh --cron --home "/acme.sh"


위 내용처럼 수정합니다. 


컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.


이제 다시 재생성 해주면 자동으로 renew를 해줍니다.



nano ssl_renew.sh


재생성해주는 스크립트 파일을 생성합니다.



#!/bin/bash


COMPOSE="/usr/local/bin/docker-compose --no-ansi"


cd /home/sammy/gnuboard/


$COMPOSE up acme.sh && $COMPOSE kill -s SIGHUP nginx


위 내용에서 /home/sammy/gnuboard/ 는 지금 작업하고 있는 폴더를 넣으면 됩니다.


자신의 환경에 맞게 수정 후 컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.


참고로 && $COMPOSE kill -s SIGHUP nginx 부분은 갱신 후 nginx라는 컨테이너를 재실행 해주는 명령어입니다.


나중에 도커 컴포즈로 멀티사이트 운영하기 편을 따라하면 마지막은 이렇게 놔두면 됩니다.


단순히 갱신만 하려면 해당 내용을 삭제하면 됩니다.



chmod +x ssl_renew.sh


위와 같이 실행 가능하게 만듭니다.




sudo crontab -e


위와 같이 크론에 들어갑니다.



no crontab for root - using an empty one


Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed


Choose 1-4 [1]:


혹시 위와 같이 나오면 1번 엔터를 누릅니다.


제일 밑에



* * * * * /home/sammy/gnuboard/ssl_renew.sh >> /var/log/ssl_renew_cron.log 2>&1


위와 같이 넣습니다. 파일 경로는 자신에게 맞게 수정해야 합니다. 


컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.


이제 매분 ssl 갱신을 시도할 것입니다.


1분 뒤에



tail -f /var/log/ssl_renew_cron.log


위 명령어를 내리면 



~/gnuboard$ tail -f /var/log/ssl_renew_cron.log
acme.sh       | [Sun Aug 16 16:57:03 UTC 2020] ===Starting cron===

acme.sh       | [Sun Aug 16 16:41:48 UTC 2020] Installing from online archive.
acme.sh       | [Sun Aug 16 16:41:48 UTC 2020] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
acme.sh       | [Sun Aug 16 16:41:51 UTC 2020] Extracting master.tar.gz
acme.sh       | [Sun Aug 16 16:41:51 UTC 2020] Installing to /acme.sh
acme.sh       | [Sun Aug 16 16:41:51 UTC 2020] Installed to /acme.sh/acme.sh
acme.sh       | [Sun Aug 16 16:41:51 UTC 2020] OK
acme.sh       | [Sun Aug 16 16:41:51 UTC 2020] Install success!
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] Upgrade success!
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] Auto upgraded to: 2.8.7
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] Renew: 'example.com'
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] Skip, Next renewal time is: Thu Oct 15 12:34:21 UTC 2020
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] Add '--force' to force to renew.
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] Skipped example.com
acme.sh       | [Sun Aug 16 16:57:04 UTC 2020] ===End cron===
acme.sh exited with code 0
No such service: nginx


위와 같이 acme.sh를 다시 받고 알아서 체크하는 것을 볼 수 있습니다.


그리고 해당 내용이 끝나면 웹서버를 알아서 끄고 다시 실행하는 것을 볼 수 있습니다.


아직 nginx 컨테이너가 없어서 No such service가 나옵니다. 정상입니다.



이제 cron 작업을 매일 한번씩 실행되게 바꿔줍니다.



sudo crontab -e


위 명령어로 다시 cron에 들어간 다음



0 12 * * * /home/sammy/gnuboard/ssl_renew.sh >> /var/log/ssl_renew_cron.log 2>&1


매일 12시에 실행되도록 설정합니다.


컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.


이제 하루에 한번 ssl 갱신을 시도할 것입니다.


7. 마치며


도커를 활용하면 깔끔하게 갱신까지 편하게 쓸 수 있습니다.


또한 이 방법으로 도커끼리 인증서를 공유하여 쓸 수도 있습니다.


https://www.wsgvet.com/bbs/board.php?bo_table=ubuntu&wr_id=123


위 글에 하나의 도커에 멀티사이트를 운영하는 글을 올렸습니다.


와일드카드 인증서를 받으면 멀티사이트 운영할 때 정말 좋습니다.
 

관련자료

  • 서명
    우성군의 NAS를 운영하고 있습니다.

    저의 즐거움이 여러분의 즐거움이면 좋겠습니다.

댓글 0
등록된 댓글이 없습니다.
Total 155 / 1 Page
RSS
메일 서버를 Docker로 구축하여 그누보드, 라이믹스, 워드프레스와 연결하기

서버 들어가며도커로 메일서버 구축하기( https://www.wsgvet.com/home/673 )엊그제 윗 글을 올렸습니다.기존에 올렸던 글은 모든…

도커로 메일서버 구축하기

서버 도커 메일서버란?도커에서 메일서버를 직접 운영할 수 있게 해줍니다.SMTP, ESMTP, POP3, IMAP 방식을 사용할 수 있습니다.자신의 …

그누보드5.4 나리야빌더에서 box shadow 효과 적용하기

나리야 현재 제 홈페이지 본문 이미지에 적용된 box shadow 효과를 적용하는 방법에 대해 알려드리겠습니다.우선 적용 전 이미지입니다.위와 같이 사…

그누보드 나리야빌더 NB-Basic 보드스킨 GIF 움짤 표현 최적화하기 댓글 2

나리야 그누보드 5.4.2.8 버전부터 움직이는 GIF 이미지를 올리면 MP4나 WEBM으로 변환하여 보여줄 수 있습니다.https://sir.kr/g…

윈도우10 ffmpeg로 GIF 움짤을 MP4, WEBM으로 변환하는 방법

서버 1. 들어가며GIF 움짤을 하나씩 변환하려면 온라인 컨버터 사이트를 이용하면 편합니다.하지만 움짤이 몇백개가 넘어가면 힘들겠죠? ^^;;그래서 …

php 도커 이미지에 ffmpeg 추가하기

서버 1. 들어가며최근 그누보드5.4에 움직이는 gif 이미지를 mp4 동영상으로 변환하는 플러그인이 올라왔습니다.https://sir.kr/g5_p…

최근글


새댓글