쇼핑몰 구축하기

짬짬이 시간날 때마다 어머니 귤이랑 만감류 판매 쇼핑몰 구축하기 프로젝트 시작.
이것저것 하면 머리가 많이 아프니 wordpress와 WooCommerce로 시작할 것.

  1. 도메인 구입: gyulim.com 등을 고민 중 inongbu.com 으로 구매
  2. 웹서버 직접 굴리는 것과 외부 업체에 맡기는 것 중에 나은 것 고민 우분투에 직접설치로 결정
    • 해킹에 대비
  3. 결제 서비스와 세금 문제 알아보기
    • 카드 결제 수수료
    • 가상계좌 시스템 알아보기
    • 환불 시스템 알아보기
  4. 택배 시스템과의 연계 방법 알아보기
  5. 고객 관리법 알아보기

Ubuntu 18.04에 JupyterHub 설치 및 설정 완성

Ubuntu 18.04에 설치하며, domain이 있는 경우에 한해서 설치하는 방법을 기술한다.
분명 1~2년 뒤에 ubuntu 갈아엎을 일이 생길텐데, 이 때 까먹어서 시간낭비하는 것을 방지하기 위해서 기록한다.

  1. 도메인을 구입한다.

    • 나는 바보같이 http://hosting.kr 에서 비싼 돈 내고 구입했으나, 구글링을 하면 미국에서 아주 싸게 구입할 수 있다. 아무튼 구입은 해야 한다.
    • IP주소 연결과 서브도메인 설정하기. 추가한 서브도메인은 www.ohmycarpenter.comjpt.ohmycarpenter.com 이다.
      • hosting.kr에서는 '네임서버(서브도메인) 설정 관리' 메뉴로 들어가서 설정해야 한다.
      • 나는 ohmycarpenter.com, www.ohmycarpenter, jpt.ohmycarpenter.com 모두 같은 IP로 밀어넣었다.
  2. Let's Encrypt 를 설치한다.

    • apt로 설치한다.
      sudo -H ./letsencrypt-auto certonly --apache -d ohmycarpenter.com -d www.ohmycarpenter -d jpt.ohmycarpenter.com
      sudo add-apt-repository ppa:certbot/certbot
      sudo apt-get install certbot
      sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
      ## pem 파일들 권한 조정한다.
    • 다음 명령어로 letsencrypt 인증서를 매월 1일마다 갱신하게 만든다.
      sudo crontab -e
      # 다음 줄을 추가한다.
      0 0 1 * * /bin/bash -l -c "certbot renew --quiet"
  3. Apache2 서버 설정을 한다.

    • 다음 명령어로 apache2 설치
      sudo apt install apache2
    • /etc/apache2/sites-available에 다음과 같이 네 개의 파일을 생성

      # file: http.jpt.ohmycarpenter.com.conf
      <VirtualHost *:80>
      ServerName jpt.ohmycarpenter.com
      Redirect / https://jpt.ohmycarpenter.com/
      ServerAlias jpt.ohmycarpenter.com
      </VirtualHost>
      # file: https.jpt.ohmycarpenter.com.conf
      <IfModule mod_ssl.c>
        <VirtualHost *:443>
          ServerName jpt.ohmycarpenter.com
          ServerAlias jpt.ohmycarpenter.com
      
            # configure SSL
          SSLEngine on
      
          SSLCertificateFile /some/where/ohmycarpenter.com/full_chain.pem
          SSLCertificateKeyFile /some/where/ohmycarpenter.com/priv_key.pem
          SSLProtocol All -SSLv2 -SSLv3
          SSLOpenSSLConfCmd DHParameters /etc/ssl/certs/dhparam.pem
          SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
      
          # Use RewriteEngine to handle websocket connection upgrades
          RewriteEngine On
          RewriteCond %{HTTP:Connection} Upgrade [NC]
          RewriteCond %{HTTP:Upgrade} websocket [NC]
          RewriteRule /(.*) ws://127.0.0.1:8000/\ [P,L]
      
          <Location "/">
          # preserve Host header to avoid cross-origin problems
          ProxyPreserveHost on
          # proxy to JupyterHub
          ProxyPass         http://127.0.0.1:8000/
          ProxyPassReverse  http://127.0.0.1:8000/
          </Location>
      </VirtualHost>
      </IfModule>
      # file: http.www.ohmycarpenter.com.conf
      <VirtualHost *:80>
      ServerName www.ohmycarpenter.com
      ServerAlias www.ohmycarpenter.com ohmycarpenter.com
      
      ServerAdmin webmaster@localhost
      Redirect / https://www.ohmycarpenter.com/
      
      ErrorLog ${APACHE_LOG_DIR}/error.log
      CustomLog ${APACHE_LOG_DIR}/access.log combined
      </VirtualHost>
      # file: https.www.ohmycarpenter.com.conf
      <IfModule mod_ssl.c>
      # <VirtualHost _default_:443>
      <VirtualHost *:443>
              ServerAdmin webmaster@localhost
      
              DocumentRoot /home2/www/wordpress
              ErrorLog ${APACHE_LOG_DIR}/error.log
              CustomLog ${APACHE_LOG_DIR}/access.log combined
      
              SSLEngine on
              SSLCertificateFile      /some/where/ohmycarpenter.com/cert1.pem
              SSLCertificateKeyFile /some/where/ohmycarpenter.com/priv_key.pem
              SSLCertificateChainFile /some/where/ohmycarpenter.com/chain1.pem
              SSLProtocol All -SSLv2 -SSLv3
              SSLOpenSSLConfCmd DHParameters /etc/ssl/certs/dhparam.pem
              SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
      
              ServerAdmin oh.donghyun77@gmail.com
              ServerName ohmycarpenter.com
              ServerAlias www.ohmycarpenter.com
      
              <Directory /home2/www/wordpress/>
              AllowOverride All
              </Directory>
      
              <FilesMatch "\.(cgi|shtml|phtml|php)$">
                              SSLOptions +StdEnvVars
              </FilesMatch>
              <Directory /usr/lib/cgi-bin>
                              SSLOptions +StdEnvVars
              </Directory>
      </VirtualHost>
      </IfModule>
      #위 네개의 파일에 대해 symbolic link를 만든다.
      ln -s /etc/apache2/sites-available/http.www.ohmycarpenter.com /etc/apache2/sites-enabled/http.www.ohmycarpenter.com
      ln -s /etc/apache2/sites-available/https.www.ohmycarpenter.com /etc/apache2/sites-enabled/https.www.ohmycarpenter.com
      ln -s /etc/apache2/sites-available/http.jpt.ohmycarpenter.com /etc/apache2/sites-enabled/httpjpt.ohmycarpenter.com
      ln -s /etc/apache2/sites-available/https.jpt.ohmycarpenter.com /etc/apache2/sites-enabled/https.jpt.ohmycarpenter.com
  4. wordpress 를 설치한다.

    • 웹사이트 돌아다니면서 가장 간단하게 설명해 놓은 것을 참조해서 설치한다.
    • wordpress 루트 디렉토리를 www-data user, group으로 한정 및 755로 권한 조정하고, wp-config.php 파일은 640으로 권한 조정
    • 필수 설치 플러그인: all in one wp security, cc-syntax-highlight, easy updates manager, jetpack, really simple ssl (돈 안 내도 됨), 고전 편집기, WP Githuber MD
    • All In One WP Security로 보안 테스트 및 설정한다.
  5. JupyterHub를 설치한다.

    • 다음 명령어로 TLJH를 설치한다.
      sudo apt install python3 python3-dev git curl
      sudo adduser jpthub_admin_id
      curl https://raw.githubusercontent.com/jupyterhub/the-littlest-jupyterhub/master/bootstrap/bootstrap.py | sudo -E python3 - --admin jpthub_admin_id
    • 다음 명령어로 아파치 서버와 jupyterhub를 시작한다.
      sudo systemctl start apache2
    • 다음 명령어로 jupyterhub 설정을 한다.
      sudo tljh-config set https.tls.key /some/where//ohmycarpenter.com/priv_key.pem
      sudo tljh-config set https.tls.cert /some/where/ohmycarpenter.com/chain.pem
      sudo tljh-config reload proxy
      sudo tljh-config set user_environment.default_app jupyterlab
      sudo tljh-config set limits.memory 40G
      sudo tljh-config add-item users.admin another_admin_id_existed_in_ubuntu
      sudo tljh-config reload
  6. Tensorflow 설치를 한다.

    • NVIDIA GPU driver 410, CUDA toolkit 10.0, cuDNN 7.4 를 매뉴얼을 따라서 설치한다. Tensorflow 버전마다 지원하는 CUDA가 다른 듯 하니 버전을 잘 살펴가면서 설치해야 할 듯. 참고 사이트: https://www.tensorflow.org/install/gpu
      apt로 cuda-10-0, cudnn-7-4-2, nvidia-driver-410 설치하면 tensorflow-2.0.0 설치 가능
    • pip로 tensorflow-gpu를 설치한다.
      sudo apt-get -y install python3-pip
      sudo pip3 install tensorflow-gpu==2.0.0 # 2.0.0 버전 설치 명기
  7. Jupyterhub에 jpt_admin_id로 로긴을 하고 python 필수 패키지들과 Anaconda, iRkernel을 설치한다.

    • New -> Terminal로 들어가서 다음 명령어로 python 패키지들 설치
      sudo -E pip3 install packages # keras, coffee, pandas, etc.
    • 다음 명령어로 Anaconda3 설치: 이미 R이 설치도어 있으면, 사실 iRKernel 설치하는데 Anaconda는 필요하지 않은 듯
      cd ~/tmp
      curl -O https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh
      bash Anaconda3-2019.10-Linux-x86_64.sh
      conda update --all
    • 다음 명령어로 R에서 다음 명령어를 넣어서 iRKernel을 설치
      install.packages('IRkernel')
      IRkernel::installspec() 
      ## remove unnecessary environment settings in $HOME/.Rprofile, such as options(device = "x11").
  8. JupyterHub에서 admin -> user 관리는 메뉴가 뜨기도 했다가 안 뜨기도 했다가 하는 듯. 나중에 버전 업데이트 되면서 고쳐지면 좋을 듯 하다.

Ubuntu 서버 작업해야 할 일들

  1. Let's Encrypt standalone과 apache 버전의 차이 공부 (완료)

    • apache 버전은 apache 가 실행 중에도 갱신 가능하고, standalone은 그렇지 않은 것으로 파악
  2. docker + jupyterhub + lets encrypt 해결할 것 (완료 2020/01/07)

  3. crontab + letsencrypt 갱신 (완료 2020/01/05)