분류 설치

Docker compose로 멀티 사이트 운영하기

컨텐츠 정보

본문

3232235777_PFh9wdqu_3cd1ed550eb3a805dc7e73310a994e29ce636331.png



1. 들어가며 


기존에 올렸던 내용은 그누보드나 워드프레스를 선택해서 운영하는 방법입니다.


하지만 도커로 하나의 사이트만 운영하는 것은 뭔가 아쉽죠? ^^


목표는 그누보드, 워드프레스, 라이믹스 이렇게 3개를 동시 운영입니다.


부가기능은, redis, smtp, ffmpeg(gif파일을 mp4와 webm으로 변환), portainer로 도커 컨테이너 관리, phpmyadmin으로 쉬운 DB 관리, 다량의 DB 동시에 생성하기 등 입니다.


지난번에 작성했던 글들과 기본적인 개념은 똑같습니다.


도커를 아직 설치 안했다면


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


위 링크의 1,2번을 보고 설치하세요!



그리고 자신의 도메인 네임서버 셋팅을 총 6개 해줍니다.


도메인, www.도메인, rhymix.도메인, wp.도에인, port.도메인, pma.도메인 총 6개의 도메인이 자신의 서버 IP를 가리키게 합니다.


밑과 같은 형식으로 잡아주면 됩니다.


3232235777_vWbTKUti_b4bfa54b3b5664bf9ee27eb3ab424482324c4a15.png 


우선 폴더 구조부터 바꿔야 했습니다.



├── data # 자동생성 볼륨들
│   ├── acme.sh
│   ├── dataredis
│   ├── dbdata
│   └── portainer_data
├── db 
│   └── create-multiple-db.sh  # 다량의 DB 동시생성 스크립트
├── docker-compose.yml        # 도커 컴퓨터 파일
├── .env                             # 비번 등 중요정보 숨김파일
├── build
│   ├── Dockerfile                 # php 빌더를 위한 파일
│   └── docker-entrypoint.sh    # 3종 CMS 자동 설치 스크립트
├── nginx
│   ├── conf.d                      # nginx 설정파일 폴더
│   │   ├── basic                # 공통 설정파일
│   │   ├── options-ssl-nginx  # SSL 설정파일
│   │   ├── ssl-conf            # SSL 경로 설정파일
│   │   ├── phpmyadmin.conf  # phpmyadmin 설정파일
│   │   ├── portainer.conf     # portainer 설정파일
│   │   ├── gnuboard.conf    # 그누보드 설정파일
│   │   ├── gnuboard-rewrite  # 그누보드 짧은주소
│   │   ├── rhymix.conf        # 라이믹스 설정파일
│   │   ├── rhymix-rewrite    # 라이믹스 짧은주소
│   │   └── wordpress.conf   # 워드프레스 설정파일
│   ├── logs                         # nginx 로그 폴더
│   └── nginx.conf                  # nginx 설정파일
├── php
│   └── php.ini                      # php 설정파일
├── site                  # CMS 폴더 및 SSL인증서 저장 폴더
│   ├── gnuboard
│   ├── rhymix
│   ├── wordpress
│   └── ssl 
└── docker_upgrade.sh  # 도커 이미지 최신버전 업그레이드 스크립트


복잡해보이지만 필요한 내용들은 거의 다 담았습니다.


Nginx 부분 설정 파일이 많아서 좀 많아 보일 뿐입니다. ㅎㅎ



## 참고사항


깃허브에 여기에 필요한 파일을 모두 업로드 해두었으니, GIT 이 가능한 분은 깃허브을 참조하시면 매우 편합니다. (링크1에 있어요!)



2. 서버 시간 변경하기


가장 먼저 현재 돌아가고 있는 시스템의 timezone과 local time을 우리나라에 맞게 변경합니다.


우분투 20.04에서는 하나의 명령어로 서울 시간으로 바꿀 수 있습니다.



sudo timedatectl set-timezone Asia/Seoul


이제 현재 우분투 서버의 시간이 서울로 바뀌었습니다.


잘 바뀌었는지 확인하려면



timedatectl


위 명령어만 내리면 바로 확인 가능합니다.



# timedatectl
               Local time: Fri 2020-08-21 11:29:33 KST
           Universal time: Fri 2020-08-21 02:29:33 UTC
                 RTC time: Fri 2020-08-21 02:29:34
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no


위와 같이 KST와 서울로 표시되는 것을 확인할 수 있습니다.


이 정보를 도커 컨테이너에 모두 넣을 것입니다. 그러면 로그에서도 정확한 시간이 표시될 것입니다.



3. 폴더 생성 및 php 빌드 준비하기



mkdir build nginx-conf nginx-conf/logs php && chmod 777 site


먼저 필요한 폴더를 한방에 생성합니다.


그리고 빌드 폴더로 가서 도커파일을 만듭니다.



cd build && nano Dockerfile


도커파일의 내용을 작성할 것입니다.


php 이미지는 워드프레스의 php:7.4-fpm-alpine 베이스에서 ffmpeg와 redis를 추가한 것입니다.



FROM woosungchoi/fpm-alpine:latest


VOLUME /var/www/html


COPY docker-entrypoint.sh /usr/local/bin/


ENTRYPOINT ["docker-entrypoint.sh"]


CMD ["php-fpm"]


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


이제 3종 CMS 자동설치 스크립트를 만들 수 있는데요.



nano docker-entrypoint.sh


위 명령어를 내린 후 



#!/bin/bash
set -euo pipefail


# 그누보드 최신버전 자동설치 스크립트 시작
if [ ! -e gnuboard ]; then
mkdir gnuboard \
&& cd gnuboard \
&& curl -o gnuboard.tar.gz -fSL https://github.com/gnuboard/gnuboard5/tarball/master \
&& tar -xf gnuboard.tar.gz -C ./ --strip-components=1 \
&& rm gnuboard.tar.gz && mkdir data \
&& chown -R www-data:www-data ./ \
&& chmod -R 777 data \
&& cd ..
fi
# 그누보드 자동설치 스크립트 끝


# 워드프레스 최신버전 자동설치 스크립트 시작
if [ ! -e wordpress ]; then
curl -o wordpress.tar.gz -fSL https://wordpress.org/latest.tar.gz \
&& tar -xvzf wordpress.tar.gz \
&& rm wordpress.tar.gz \
&& chown -R www-data:www-data wordpress \
&& chmod -R 777 wordpress/wp-content \
&& cd ..
fi
# 워드프레스 자동설치 스크립트 끝


# 라이믹스 최신버전 자동설치 스크립트 시작
if [ ! -e rhymix ]; then
mkdir rhymix \
&& cd rhymix \
&& curl -o rhymix.tar.gz -fSL https://github.com/rhymix/rhymix/tarball/master \
&& tar -xf rhymix.tar.gz -C ./ --strip-components=1 \
&& rm rhymix.tar.gz && mkdir files \
&& chown -R www-data:www-data ./ \
&& chmod -R 777 files \
&& cd ..
fi
# 라이믹스 자동설치 스크립트 끝


exec "$@"



위 내용을 넣습니다. 


위 내용은 /var/www/html 폴더 아래에 각각의 CMS 이름을 가진 폴더가 없으면 최신 버전을 다운받아서 압축 풀고, 권한 조정을 해줍니다.


자신에게 필요한 CMS만 선택해서 설치 가능하니 적절하게 빼셔도 됩니다.


아니면 같은 규칙으로 원하는 다른 CMS를 넣어도 됩니다.



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



chmod +x docker-entrypoint.sh && cd ..


위 명령어로 실행가능한 상태로 바꾼 후 기존 폴더로 돌아옵니다.


이제 빌드를 위한 준비는 끝났습니다.


지금 빌드를 하지 않고, docker-compose 시작할 때 빌드를 자동으로 하게 할 것입니다.



4. php설정파일 생성하기



nano php/php.ini


위 명령어로 php 설정파일 생성으로 들어갑니다.



short_open_tag = On
memory_limit = 256M
cgi.fix_pathinfo = 0
upload_max_filesize = 100M
post_max_size = 101M
max_execution_time = 360
date.timezone = Asia/Seoul
expose_php = off


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



5. 와일드카드 SSL 인증서 발급 및 경로 지정하기


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


위 글에 따라 자신의 도메인에 맞는 SSL 인증서를 먼저 발급 받습니다.




6. Nginx 설정 공통 파일 만들기


우선 3종 CMS에 공통적으로 들어가는 설정을 미리 생성해둡니다.



nano nginx/conf.d/basic


위 명령어로 작성을 시작합니다.



index index.php index.html index.htm;


location / {
       try_files $uri $uri/ /index.php$is_args$args;
       }


location ~ \.php$ {
       try_files $uri =404;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass php:9000;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
        }


location ~ /\.ht {
        deny all;
}


location = /favicon.ico {
        log_not_found off; access_log off;
}


location = /robots.txt {
        log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
}
include conf.d/options-ssl-nginx;
include conf.d/ssl-conf;


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



7. Nginx 설정파일 작성하기



nano nginx/nginx.conf


위 명령어로 작성을 시작합니다.



user  nginx;
worker_processes  auto;  # use "grep processor /proc/cpuinfo | wc -l" and type the number here, or stay with automatic configuration


error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;  # use "ulimit -n" and type the number here
}




http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;


    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';


    access_log  /var/log/nginx/access.log  main;


    sendfile        on;
    tcp_nopush     on;
    server_names_hash_bucket_size 128;


    keepalive_timeout  65;
    charset urtf-8;


    server_tokens off;
    proxy_hide_header X-Powered-By;
    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    client_max_body_size 100M;
    large_client_header_buffers 2 1k;


    client_body_timeout 12;
    client_header_timeout 12;
    send_timeout 10;


    gzip on;
	gzip_disable ¡°MSIE [1-6].(?!.*SV1)¡±;
	gzip_buffers 16 8k;
	gzip_comp_level 6;
	gzip_http_version 1.1;
	gzip_min_length 256; 
	gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/rss+xml text/javascript image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype image/x-icon;
	gzip_vary on;
	gzip_proxied any;
	gzip_static on;


    include /etc/nginx/fastcgi.conf;
    include /etc/nginx/conf.d/*.conf;
}


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



8. SMTP 구글 릴레이 메일서버를 위한 구글 앱 비밀번호 생성하기

(그누보드 전용)


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


위 링크 2번에 보면 구글 앱 비밀번호 생성하기가 있습니다.


그누보드에서 지메일로 편하게 인증메일을 보낼 수 있는 방법입니다.


지메일 계정과 앱 비밀번호를 밑에 넣을 것입니다.


SMTP 구글 릴레이 메일서버 및 그누보드에 적용 관련 자세한 내용은


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


위 링크를 참조하세요.


SMTP는 그누보드 전용이며, 워드프레스는 SMTP 구글 릴레이 플러그인, 라이믹스는 메일건 같은 API를 이용하는 것을 추천합니다.


그누보드를 사용하지 않는다면 넘어가면 됩니다.



9. 비번 등 민감한 정보 저장하는 .env 파일 생성하기



nano .env


위 명령어로 파일을 만듭니다.



MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_USER=dbuser
MYSQL_PASSWORD=dbuserpassword
MARIADB_MULTIPLE_DATABASES=gnuboard,wordpress,rhymix
LUA_Key=
LUA_Email=
CF_Key=
CF_Email=
GMAIL_USER=youremail@gmail.com
GMAIL_PASSWORD=abcdefghijklmopr


위 내용을 설명드리겠습니다.


MYSQL_ROOT_PASSWORD는 mariadb의 root 비밀번호를 지정하는 곳입니다.


MYSQL_USER=dbuser    는 그누보드, 워드프레스, 라이믹스 DB의 유저를 정하는 곳입니다. 


MYSQL_PASSWORD 는 DB 유저의 비번을 지정하면 됩니다.


MARIADB_MULTIPLE_DATABASES=gnuboard,wordpress,rhymix


위 내용은 자동으로 생성되는 DB의 이름입니다. 콤마로 원하는만큼 생성할 수 있습니다.


이름도 바꿔도 되는데요. 대문자와 _밑첨자까지 가능하지만, 가운데 대시(-)는 불가능합니다.


예를들어 MARIADB_MULTIPLE_DATABASES=gnuboard,wordpress,rhymix,DB_1,DB_21231,db2,db3


등등 계속 넣을 수 있습니다. 넣는만큼 자동으로 생성됩니다.


모든 DB의 유저는 dbuser입니다.



LUA_Key=
LUA_Email=
CF_Key=
CF_Email=


이 부분은 SSL 와일드카드 인증서 설정할 때 이미 넣었을 것입니다.




GMAIL_USER=youremail@gmail.com
GMAIL_PASSWORD=abcdefghijklmopr


위 부분은 그누보드 전용 SMTP 구글 릴레이 서버의 계정과 앱 비밀번호를 넣으면 됩니다. 8번에서 이미 받으셨죠? ^^


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



10. DB 여러개 생성하기 스크립트 만들기


phpmyadmin으로 수동으로 생성해도 되지만 스크립트로 편하게 만드는 방법이 있어 넣습니다.



nano db/create-multiple-db.sh


위 명령어로 작성을 시작합니다.



#!/bin/bash


set -e
set -u


function create_multiple_database() {
	local database=$1
	echo "  Creating multiple database '$database'"
	mysql -u root -p rootpassword <<MYSQL_SCRIPT
	    CREATE DATABASE $database;
        GRANT ALL PRIVILEGES ON $database.* TO 'dbuser'@'%' WITH GRANT OPTION;
        FLUSH PRIVILEGES;
MYSQL_SCRIPT
}


if [ -n "$MARIADB_MULTIPLE_DATABASES" ]; then
	echo "Multiple database creation requested: $MARIADB_MULTIPLE_DATABASES"
	for db in $(echo $MARIADB_MULTIPLE_DATABASES | tr ',' ' '); do
		create_multiple_database $db
	done
	echo "Multiple databases created"
fi



위 내용에서 꼭 수정해야 할 부분은 9번째 줄에 있는


rootpassword 입니다.


MariaDB의 root 비번으로 바꾸면 됩니다.


그리고 DB 유저를 변경했다면 11번째 줄에 있는 dbuser를 수정하면 됩니다.


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




11. Nginx SSL 관련 파일 받고 만들기


먼저 공통적으로 들어갈 SSL 옵션이 들어있는 파일을 다운 받습니다.



curl -sSLo nginx/conf.d/options-ssl-nginx https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf


위 명령어로 다운 받습니다.


그리고 SSL 인증서 경로 및 기타 설정파일을 만듭니다.



nano nginx/conf.d/ssl-conf




ssl_certificate /var/www/html/ssl/fullchain.pem;
ssl_certificate_key /var/www/html/ssl/privkey.pem;
ssl_trusted_certificate /var/www/html/ssl/chain.pem;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# enable strict transport security only if you understand the implications
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;



위 내용에서 HSTS 관련 부분은 정확하게 이해한 후 주석을 푸시면 됩니다.


주석을 안풀어도 상관없습니다.


인증서 경로는 6번에서 받은 인증서 바로 그 경로입니다.


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



12. 그누보드 Nginx 설정 작성하기



nano nginx/conf.d/gnuboard.conf


위 명령어로 그누보드 설정파일을 만듭니다.




server {
        listen 80;
        listen [::]:80;


        server_name example.com www.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com www.example.com;


        root /var/www/html/gnuboard;


        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/gnuboard-rewrite;
}


위 내용은 그누보드를 메인 도메인으로 설정하는 것입니다.


그누보드를 서브도메인으로 설정하고 싶다면



server {
        listen 80;
        listen [::]:80;


        server_name gnu.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name gnu.example.com;


        root /var/www/html/gnuboard;


        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/gnuboard-rewrite;
}


위와 같이 gnu를 앞에 붙이면 됩니다. gnu 대신 아무거나 됩니다.


와일드카드 인증서가 있기 때문에 서브도메인은 원하는대로 무한으로 설정 할 수 있습니다.


example.com www.example.com 부분은 당연히 자신에게 맞는 형식으로 바꿔야겠죠? 


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



이제 그누보드 짧은주소 설정파일을 만듭니다.



nano nginx/conf.d/gnuboard-rewrite


위 명령어로 작성합니다.



#### 그누보드5 nginx rules BEGIN #####
if (!-e $request_filename){
rewrite ^/content/([0-9a-zA-Z_]+)$ /bbs/content.php?co_id=$1&rewrite=1 break;
rewrite ^/content/([^/]+)/$ /bbs/content.php?co_seo_title=$1&rewrite=1 break;
rewrite ^/rss/([0-9a-zA-Z_]+)$ /bbs/rss.php?bo_table=$1 break;
rewrite ^/([0-9a-zA-Z_]+)$ /bbs/board.php?bo_table=$1&rewrite=1 break;
rewrite ^/([0-9a-zA-Z_]+)/write$ /bbs/write.php?bo_table=$1&rewrite=1 break;
rewrite ^/([0-9a-zA-Z_]+)/([^/]+)/$ /bbs/board.php?bo_table=$1&wr_seo_title=$2&rewrite=1 break;
rewrite ^/([0-9a-zA-Z_]+)/([0-9]+)$ /bbs/board.php?bo_table=$1&wr_id=$2&rewrite=1 break;
}
#### 그누보드5 nginx rules END #####


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



13. 라이믹스 Nginx 설정파일 작성하기



nano nginx/conf.d/rhymix.conf


위 명령어로 작성합니다.



server {
        listen 80;
        listen [::]:80;


        server_name example.com www.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com www.example.com;


        root /var/www/html/rhymix;


        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/rhymix-rewrite;
}


위 내용은 라이믹스를 메인 도메인으로 설정하는 것입니다.


라이믹스를 서브도메인으로 설정하고 싶다면



server {
        listen 80;
        listen [::]:80;


        server_name rhymix.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name rhymix.example.com;


        root /var/www/html/rhymix;


        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/rhymix-rewrite;
}


위와 같이 rhymix를 앞에 붙이면 됩니다. rhymix 대신 아무거나 됩니다.


example.com www.example.com 부분은 당연히 자신에게 맞는 형식으로 바꿔야겠죠? 


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



이제 라이믹스 짧은주소 리라이트 설정파일을 다운 받습니다.




curl https://raw.githubusercontent.com/rhymix/rhymix/master/common/manual/server_config/rhymix-nginx.conf > nginx/conf.d/rhymix_rewrite


위 명령어로 잘 받아집니다.



14. 워드프레스 Nginx 설정파일 만들기



nano nginx/conf.d/wordpress.conf


위 명령어로 작성합니다.



server {
        listen 80;
        listen [::]:80;


        server_name example.com www.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com www.example.com;


        root /var/www/html/wordpress;


        include /etc/nginx/conf.d/basic;
}


위 내용은 워드프레스를 메인 도메인으로 설정하는 것입니다.


워드프레스를 서브도메인으로 설정하고 싶다면



server {
        listen 80;
        listen [::]:80;


        server_name wp.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name wp.example.com;


        root /var/www/html/wordpress;


        include /etc/nginx/conf.d/basic;
}


위와 같이 wordpress를 앞에 붙이면 됩니다. wordpress 대신 아무거나 됩니다.


example.com www.example.com 부분은 당연히 자신에게 맞는 형식으로 바꿔야겠죠? 


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.




15. portainer 리버스프록시 설정 작성하기



nano nginx/conf.d/portainer.conf


위 명령어로 작성합니다.




server {
        listen 80;
        listen [::]:80;


        server_name port.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        server_name port.example.com;


        include /etc/nginx/conf.d/ssl-conf;
        include /etc/nginx/conf.d/options-ssl-nginx;


        #IP 차단 부분입니다. 밑의 내용을 수정 후 앞에 #을 빼면 IP차단 설정이 적용됩니다.
        #allow 111.112.333.444; #자신의 집 컴퓨터의 외부IP를 확인 후 넣고 앞에 #을 제거하면 됩니다.
        #allow 123.123.123.123; #두번째 허용 IP
        #allow 124.124.124.124; #세번째 허용 IP # 이렇게 허용 IP를 추가해준 후 앞에 #을 제거하면 됩니다.
        #deny all; # 위 아이피 이외에 모든 IP를 차단합니다. 차단이 필요없다면 앞에 #을 놔두면 됩니다.
        
        location / {
            proxy_pass         http://portainer:9000;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400;       
        }
}



port 서브도메인은 원하는대로 설정이 가능합니다.


example.com 부분은 당연히 자신에게 맞는 형식으로 바꿔야겠죠?


IP 차단 부분은 읽어보시면 이해가 될 것입니다.


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



16. phpmyadmin 리버스프록시 설정 작성하기



nano nginx/conf.d/phpmyadmin.conf


위 명령어로 작성합니다.



server {
        listen 80;
        listen [::]:80;


        server_name pma.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        server_name pma.example.com;
        server_tokens off;


        include /etc/nginx/conf.d/ssl-conf;
        include /etc/nginx/conf.d/options-ssl-nginx;


        #IP 차단 부분입니다. 밑의 내용을 수정 후 앞에 #을 빼면 IP차단 설정이 적용됩니다.
        #allow 111.112.333.444; #자신의 집 컴퓨터의 외부IP를 확인 후 넣고 앞에 #을 제거하면 됩니다.
        #allow 123.123.123.123; #두번째 허용 IP
        #allow 124.124.124.124; #세번째 허용 IP # 이렇게 허용 IP를 추가해준 후 앞에 #을 제거하면 됩니다.
        #deny all; # 위 아이피 이외에 모든 IP를 차단합니다. 차단이 필요없다면 앞에 #을 놔두면 됩니다.
        
        location / {
            proxy_pass         http://phpmyadmin;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;          
        }
}


port 서브도메인은 원하는대로 설정이 가능합니다.


example.com 부분은 당연히 자신에게 맞는 형식으로 바꿔야겠죠?


IP 차단 부분은 읽어보시면 이해가 될 것입니다.


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



17. docker-compose 파일 작성하기 


드디어 마지막 파일입니다.



nano docker-compose.yml


위 명령어로 작성합니다.




version: '3'


services:


  db:
    image: mariadb:latest
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./data/dbdata:/var/lib/mysql
      - ./db:/docker-entrypoint-initdb.d
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  redis:
    container_name: redis
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./data/dataredis:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes


  smtp:
    image: namshi/smtp
    container_name: smtp_relay
    restart: always
    env_file: .env


  php:
    depends_on:
      - db
    build:
      context: ./build
    container_name: php
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./site:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  nginx:
    depends_on:
      - php
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./site:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx/
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  acme.sh:
    image: neilpang/acme.sh
    container_name: acme.sh
    env_file: .env
    volumes:
      - ./data/acme.sh:/acme.sh
      - ./site:/var/www/html
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: acme.sh --cron --home "/acme.sh"


  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    #ports:
    #  - "80:80"
    environment:
      - PMA_HOST=db
    restart: always
    depends_on:
      - db
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: always
    #ports:
    #  - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer_data:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


가이드대로 따라왔다면 수정 할 부분은 없습니다.


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.



18. 모든 준비는 끝났습니다.



sudo docker-compose up -d


위 명령어만 내리면 그누보드, 워드프레스, 라이믹스, phpmyadmin, portainer가 자동으로 구동됩니다.


오라클 클라우드 무료 인스턴스 기준


mariadb, redis, smtp 다운 받는데 1분


php 빌드하는데 3분 15초


nginx와 phpmyadmin, portainer 다운 받는데 1분


최종 실행에 5분 30초 걸립니다.



Creating smtp_relay ... done
Recreating acme.sh  ... done
Creating portainer  ... done
Creating db         ... done
Creating redis      ... done
Creating phpmyadmin ... done
Creating php        ... done
Creating nginx      ... done


위와 같이 나오면 성공입니다.


이제 자신의 도메인으로 접속해보세요!


따로 서브도메인을 변경하지 않았다면


그누보드 : https://example.com


워드프레스 : https://wp.example.com


라이믹스 : https://rhymix.example.com


portainer : https://port.example.com


phpmyadmin : https://pma.example.com


위와 같은 형식으로 접속할 수 있습니다.



19. CMS 설치 방법


그누보드는 Host에 db, User에는 dbuser 또는 지정한 DB의 유저, Password는 DB의 비밀번호, DB는 gnuboard, TABLE명 접두사는 그대로 둡니다.


워드프레스는 데이터베이스 이름에 wordpress, 사용자명에 dbuser 또는 지정한 DB의 유저, 암호는 DB의 비밀번호, 데이터베이스 호스트는 db, 테이블 접두어는 그대로 두면 됩니다.


rhymix는 DB 종류에 mysql, DB 서버 주소에 db, DB 서버 포트에 3306, DB 아이디에 dbuser 또는 지정한 DB의 유저, DB 비밀번호는 DB의 비밀번호, DB 이름은 rhymix, 테이블 접두사는 그대로 두면 됩니다.



20. 사용하다가 또다른 사이트를 설치하는 방법


와일드카드 SSL 인증서가 있기 때문에 서브도메인을 무한대로 사용할 수 있습니다.


기본적으로 ./site/ 이하 폴더에 폴더를 생성하고 파일을 넣습니다. 


권한은 82로 해야 컨테이너의 www-data가 권한 문제없이 쓸 수 있습니다.


alpine 리눅스에서는 www-data가 82로 표현이 되더라구요. ㅎㅎ


컨테이너 내에서는 www-data라고 정확하게 표시가 됩니다.


아무튼 폴더를 생성하고 파일을 넣은 뒤, 예를들어 ./site/sample 이라는 폴더에 파일이 있다면


./nginx/con.d/ 이하에 sample.conf 라는 파일을 만들고



server {
        listen 80;
        listen [::]:80;


        server_name sample.example.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name sample.example.com;


        root /var/www/html/sample;


        include /etc/nginx/conf.d/basic;
}


위와 같이 넣어주면 됩니다. 핵심은 sample에 주목하세요.


그리고



sudo docker-compose up -d --force-recreate --no-deps nginx


위 명령어를 내리면 nginx를 재실행하여 설정이 반영됩니다.


도메인을 브라우저에 넣으면 접속이 될 것입니다.



21. portainer 설명


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


위 링크에 상세하게 설명해두었습니다.



22. 그누보드 권한 설정


그누보드는 data 폴더에는 707 권한을 주고, 나머지는 현재 계정에게 권한을 줘야 셋팅하기 편합니다.


그누보드 특성상 코어 쪽이나 스킨, 테마에 수정을 많이 해야되는데, 권한 문제가 생기면 불편합니다.



sudo chown -R $USER site/gnuboard
sudo chmod -R 707 site/gnuboard/data


위 두 명령어로 


모든 파일 및 폴더에 현재 로그인 되어있는 유저에게 권한을 주고,


데이터 및 이하의 폴더와 파일에 707 권한을 주면 관리하기 편합니다.


혹시 나리야 빌더를 사용 중이라면 /site/gnuboard/theme 이하에도 권한을 707로 주는 것이 좋습니다.



sudo chmod -R 707 site/gnuboard/theme


위 명령으로 707 권한을 줍니다.



23. 라이믹스 redis 캐시 사용 설정


관리자모드 -> 설정 -> 시스템 설정 -> 고급 설정 -> 캐시 사용 redis 선택


호스트 : redis


포트 : 6379


DB 번호 : 1



24. 워드프레스 redis 캐시 사용 설정


W3 Total Cache 기준 


redis 캐시 사용 설정 후


각 페이지마다 


Redis hostname:port / IP:port: 에 redis만 넣으면 됩니다.


redis:6379 를 넣어도 됩니다.




25. 도커 이미지 최신버전으로 업그레이드


php 이미지를 제외한 나머지 이미지는 모두 공식 이미지입니다.


특정 Tag를 지정하지 않았으므로 최신버전으로 지정되어 있는데요.



sudo docker-compose pull


위 명령어로 도커 컴포즈 파일에 있는 이미지의 최신버전을 다운 받습니다.



sudo docker pull woosungchoi/fpm-alpine


그리고 php 빌드에 필요한 woosungchoi/fpm-alpine도 업데이트합니다.



sudo docker-compose up --build -d


위 명령어를 내리면 업데이트 된 이미지는 재생성하고, `php`를 빌드하고 백그라운드에서 실행 될 것입니다.



.
.
.
.
Step 6/9 : VOLUME /var/www/html
 ---> Using cache
 ---> 2dd2db50ef41
Step 7/9 : COPY docker-entrypoint.sh /usr/local/bin/
 ---> Using cache
 ---> 96a9e02a075f
Step 8/9 : ENTRYPOINT ["docker-entrypoint.sh"]
 ---> Using cache
 ---> fe15a576da12
Step 9/9 : CMD ["php-fpm"]
 ---> Using cache
 ---> 3be53dd0ad5a
Successfully built 3be53dd0ad5a
Successfully tagged docker-multi-site_php:latest
portainer is up-to-date
smtp_relay is up-to-date
Starting acme.sh ...
redis is up-to-date
db is up-to-date
code-server is up-to-date
phpmyadmin is up-to-date
php is up-to-date
Starting acme.sh ... done


위와 같이 진행됩니다.


그리고 빌드가 새로 되면 기존에 있던 `php`이미지가 태그가 없는 상태로 남겨집니다.


태그가 없는 이미지는 정리해주면 좋겠죠?



sudo docker image prune -f


위 명령어로 태그가 없는 이미지가 삭제됩니다.



sudo docker-compose pull && sudo docker pull woosungchoi/fpm-alpine && sudo docker-compose up --build -d && sudo docker image prune -f


그리고 위 명령어로 모아서 실행해도 됩니다.



26. 도커 이미지 최신버전 업그레이드 자동 실행 설정



nano docker_upgrade.sh


위 명령으로 25번에서 했던 작업을 자동으로 실행해주는 스크립트를 만들 것입니다.



#!/bin/bash


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


cd /your/path/docker-multi-site/


$COMPOSE pull && $DOCKER pull woosungchoi/fpm-alpine && $COMPOSE up --build -d && $DOCKER image prune -f


6번째 줄에 있는 cd /your/path/docker-multi-site/ 부분을 


docker-compose.yml 파일이 있는 경로로 바꿉니다.


그리고 권한을 수정합니다.



chmod a+x docker_upgrade.sh


위 명령어로 도커 업그레이드 파일을 실행 가능하게 바꿉니다.


그리고 crontab에 하루에 한번 실행하게 추가해줍니다.



sudo crontab -e


위 명령어를 넣은 후 



30 12 * * * /your/path/docker-multi-site/docker_upgrade.sh >> /var/log/docker_upgrade_cron.log 2>&1


위와 같이 추가해줍니다. (위 셋팅은 매일 오후 12시 30분마다 실행)


/your/path/docker-multi-site/ 이 부분은 자신의 경로에 맞게 수정하세요!


컨트롤 + O, 엔터, 컨트롤 + X로 저장해줍니다.



27. SSL 인증서 자동갱신 작업하기



sudo crontab -e


위 명령어를 넣은 후



30 13 * * * docker start acme.sh >> /var/log/ssl_update_cron.log 2>&1
35 13 * * * docker exec nginx nginx -s reload >> /var/log/ssl_update_cron.log 2>&1


위와 같이 추가해줍니다.


컨트롤 + O, 엔터, 컨트롤 + X, 엔터로 저장해줍니다.



28. php 8.0으로 업그레이드하는 방법


현재(2020년 8월) php의 최신버전은 7.4입니다. 그리고 2020년 11월 중순에 8.0 정식 버전이 나올 것입니다.


그때 8.0으로 업그레이드 하고 싶다면 ./build/Dockerfile을 수정하면 됩니다.


Docker허브에서 직접 관리하고 있는 Wordpress Docker파일을 사용할 것입니다.


워드프레스 이미지의 Dockerfile 이 관리가 잘되고 있고 그누보드, 라이믹스와 호환이 잘되기 때문입니다.


https://github.com/docker-library/wordpress/tree/master


2020년 11월에 위 링크에서 `php8.0` 폴더가 생길 것입니다. (물론 그 이후에 8.1, 8.2가 나와도 같은 방식으로 업데이트하면 됩니다.)


들어가보면 apache, cli, fpm-alpine, fpm이 있을텐데요.


현재 가이드에서는 fpm-alpine을 사용하고 있습니다. 용량이 매우 적은 장점이 있습니다.


php8.0 폴더의 fpm-alpine 폴더에 들어가면 Dockerfile이 있을 것입니다.


해당 파일을 ./build 폴더에 덮어씁니다.


Dockerfile을 열어서 11번째 줄에 보면



# Alpine package for "imagemagick" contains ~120 .so files, see: https://github.com/docker-library/wordpress/pull/497
		imagemagick


위 내용이 있는데요.



# Alpine package for "imagemagick" contains ~120 .so files, see: https://github.com/docker-library/wordpress/pull/497
		imagemagick \
# For gnuboard ffmpeg gif2mp4webm
		ffmpeg


위 내용으로 바꿔줍니다. 이제 php 이미지에 ffmpeg가 설치될 것입니다.


추가로 php-redis도 설치해줍니다.


대략 34~38번째 줄을 보면



pecl install imagick-3.4.4; \
docker-php-ext-enable imagick; \


위 내용이 있는데



pecl install imagick-3.4.4 redis; \
docker-php-ext-enable imagick redis; \


위와 같이 redis를 추가해줍니다.


그러면 이미지 빌드할 때 php-redis가 설치됩니다.


그리고 기존 워드프레스를 제거하고 3종 CMS를 사용할 것이므로 


75번째 ~ 92번째 줄에 있는



ENV WORDPRESS_VERSION 5.5
ENV WORDPRESS_SHA1 03fe1a139b3cd987cc588ba95fab2460cba2a89e


RUN set -ex; \
	curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; \
	echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
	tar -xzf wordpress.tar.gz -C /usr/src/; \
	rm wordpress.tar.gz; \
	chown -R www-data:www-data /usr/src/wordpress; \
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
	mkdir wp-content; \
	for dir in /usr/src/wordpress/wp-content/*/; do \
		dir="$(basename "${dir%/}")"; \
		mkdir "wp-content/$dir"; \
	done; \
	chown -R www-data:www-data wp-content; \
	chmod -R 777 wp-content


위 내용을 지워줍니다.


그리고



# fix work iconv library with alpine
# Huge thanks to chodingsana!
RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community<a> --allow-untrusted gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php


위 내용을 넣습니다. iconv 에러 관련 회원가입시 오류를 해결해줍니다.


저장 후 사용하면 됩니다.


그리고 위에 있는 자동 업그레이드 설정 부분에서 7.4로 되어 있는 것을 8.0 또는 자신이 원하는 버전으로 바꾸면 됩니다.

관련자료

댓글 15개 / 2페이지

우성짱님의 댓글의 댓글

넵.. 로컬 사용자를 위한 설정도 만들어봐야겠네요.

로컬은 한번도 안해봐서... 시간이 좀 걸릴 것 같습니다.

우성짱님의 댓글의 댓글

만약에 SSL이 문제가 된다면

그누보드 파일 기준으로


nano nginx/conf.d/gnuboard.conf


위 명령어로 설정파일에 들어갑니다.

그리고


server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;

        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com www.example.com;

        root /var/www/html/gnuboard;

        include /etc/nginx/conf.d/basic;
        include /etc/nginx/conf.d/gnuboard-rewrite;
}


위 내용을


server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;

        root /var/www/html/gnuboard;

index index.php index.html index.htm;

location / {
       try_files $uri $uri/ /index.php$is_args$args;
       }

location ~ \.php$ {
       try_files $uri =404;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass php:9000;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
        }

location ~ /\.ht {
        deny all;
}

location = /favicon.ico {
        log_not_found off; access_log off;
}

location = /robots.txt {
        log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
}
        include /etc/nginx/conf.d/gnuboard-rewrite;
}


위와 같이 변경하면 SSL 인증서 없어도 접속 가능합니다.

다른 사이트들도 같은 형식으로 바꾸면 됩니다.
Total 32 / 1 Page
RSS
Keep Network의 ECDSA & Beacon nodes 구글 클라우드에 설치하기 댓글 2

설치 Keep Network의 test Keep token으로 ECDSA 및 Beacon nodes를 구글 클라우드에서 직접 구축할 수 있습니다.다른…

중국 황금방패 뚫는 VPN 3대장 직접 설치하기 댓글 6

설치 중국에서 해외 사이트에 접속할 때 황금방패로 막혀있는 경우가 많습니다.보통 유료로 VPN에 가입해서 사용하거나, 무료 VPN 서비스를 사용할텐데…

윈도우10에 우분투 설치하는 방법

설치 윈도우10에는 WSL(Windows Subsystem For Linux)이 있어서 우분투 센토스 등을 설치할 수 있습니다.방금 설치해보니 정말 …

Docker compose로 워드프레스 편하게 설치하는 방법 댓글 2

설치 들어가며Wordpress(워드프레스)는 현재 전세계에서 가장 많이 쓰이는 CMS입니다.php, mysql, 웹서버로 구성됩니다.SSL 인증서 설…

그누보드 이미지 및 동영상 캐시 서버 구축 방법 댓글 9

설치 그누보드의 /data 폴더에 있는 이미지 및 동영상을 캐시 서버에서 트래픽을 나눌 수 있는 방법입니다.이미지나 동영상이 많아서 트래픽이 많이…

Docker compose로 그누보드 편하게 설치하는 방법 댓글 9

설치 들어가며그누보드는 이 홈페이지가 돌아가고 있는 국산CMS입니다.현재 5.4버전이 개발 중이며 사용자도 많습니다.그누보드는 php, mysql, …

최근글


새댓글