거기 안전한 자전거 HackMD 서버 구축

TL;DL


  • HackMD란?
  • 네. HackMD
  • 매우 편리합니다

  • HackMD의 코코가 안 된다
  • 이미지를 붙이면 imgur 에 업로드 됨
  • 소위 URL을 아는 모든 사람이 볼 수있는 상태

  • 노트는 개인이 될 수 있지만 설정을 잊어 버리면 위의 상태가됩니다

  • 하고 싶은 일
  • 클라우드 서버에 HackMD 서버를 설정
  • SSL/TLS 지원
  • Basic 인증 가능


  • 사용하는 것


  • GitHub HackMD 소스 코드

  • GitHub Docker HackMD
  • 이것을 찾았으니까 하려고 했다


  • Nginx
  • 역방향 프록시, Basic 인증용


  • Let's encrypt
  • SSL 인증서 취득 용

  • Docker, docker-compose

  • 절차



    서버 준비


  • 내가 Azure + Ubuntu 16.04에서했습니다.
  • Docker를 사용하기 때문에별로 중요하지 않다고 생각합니다

  • Port 80, 443을 열어 둔다
  • FQDN을 얻는다

  • 다양한 파일 준비



    최종 dirctory 내용
    $ ls -la
    -rw-r--r-- 1 suecharo suecharo  432 Jul 30 10:10 config.json
    -rw-rw-r-- 1 suecharo suecharo  764 Aug  1 10:48 docker-compose.yml
    -r--r--r-- 1 root   root   46 Jul 30 09:27 .htpasswd
    -rw-r--r-- 1 suecharo suecharo 1228 Jul 30 09:28 nginx.conf
    

    docker-compose.yml



  • GitHub Docker HackMD 에 있다 docker-compose.yml 그럼 하고 싶은 일이 없었기 때문에 재기록했다
  • 설정 파일적으로 HTTPS 화는 할 수 있을 것 같지만, Basic 인증이 어려울 것 같았다

  • 일단 database와 app_data는 docker volume을 사용하여 지속됩니다.
  • HackMD 자체의 container는 포트를 열지 않고 docker network를 사용하여 상호 작용합니다.
  • Let 's encrypt를 호스트에서 원하지 않으려면 Nginx container에서 수행해야합니다.

    docker-compose.yml
    version: '3'
    services:
      app:
        image: hackmdio/hackmd:latest
        restart: always
        environment:
          - HMD_DB_URL=postgres://hackmd:hackmdpass@database:5432/hackmd
        volumes:
          - ${PWD}/config.json:/hackmd/config.json
          - app_data:/hackmd
      database:
        image: postgres:9.6-alpine
        environment:
          - POSTGRES_USER=hackmd
          - POSTGRES_PASSWORD=hackmdpass
          - POSTGRES_DB=hackmd
        volumes:
          - database:/var/lib/postgresql/data
        restart: always
      nginx:
        image: nginx:latest
        restart: always
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /etc/letsencrypt:/etc/letsencrypt
          - ${PWD}/.htpasswd:/etc/nginx/.htpasswd
          - ${PWD}/nginx.conf:/etc/nginx/nginx.conf
    
    volumes:
      database:
      app_data:
    

    .htpasswd


  • Basic 인증용
  • $ apt install -y apache2-utils
    $ sudo htpasswd -c -b ${HackMD_dir}/.htpasswd ${user_name} ${Password}
    $ sudo chmod 444 ${HackMD_dir}/.htpasswd
    

    Let's Encrypt


  • certbot 사용

  • 공식 페이지


  • nginx.conf


  • nginx.conf 의 쓰는 방법 자체는 종교가 있을 것 같기 때문에 어디까지나 일례로서
  • ${your_fqdn}를 취급하고 싶은 server의 것으로 바꾼다

  • nginx.conf
    user nginx;
    worker_processes auto;
    error_log  /var/log/nginx/error.log warn;
    pid /run/nginx.pid;
    
    events {
        worker_connections 1024;
    }
    
    http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        access_log /var/log/nginx/access.log;
        sendfile on;
        keepalive_timeout 65;
        server_names_hash_max_size 1024;
        client_max_body_size 10M;
    
        server_tokens off;
    
        # include /etc/nginx/conf.d/*.conf;
    
        server {
            listen 80;
            server_name ${your_fqdn};
            return 301 https://$host$request_uri;
        }
    
        server {
            listen 443 default ssl;
            server_name ${your_fqdn};
            ssl_certificate /etc/letsencrypt/live/${your_fqdn}/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/${your_fqdn}/privkey.pem;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
    
            charset utf-8;
            auth_basic 'Secret Zone';
            auth_basic_user_file /etc/nginx/.htpasswd;
    
            location / {
                proxy_pass http://app:3000;
            }
        }
    }
    

    conf.json



  • GitHub Docker HackMD 에 있는 docker-compose.yml 에서는 imgur 에 이미지가 날아가 버린다
  • 설정 항목 자체는 GitHub HackMD 소스 코드의 README에 포함되어 있습니다

  • config.json
    {
        "production": {
            "allowAnonymous": false,
            "allowAnonymousEdits": false,
            "defaultPermission": "editable",
            "email": true,
            "db": {
                "username": "hackmd",
                "password": "hackmdpass",
                "database": "hackmd",
                "host": "database",
                "port": "5432",
                "dialect": "postgres"
            },
            "imageUploadType": "filesystem"
        }
    }
    

    기동·동작 확인


    $ docker-compose up -d
    
  • 처음에는 docker-compose 부팅 순서 문제로 네트워크 오류가 발생하는 경우가 많습니다.
  • 다시, docker-compose up -d 를 하면 된다

  • 브라우저에서 https://${your_fqdn}/에 액세스

  • 좋은 웹페이지 즐겨찾기