서버 재설치 feat. docker

mysql을 8.0으로 업데이트 하면서 기존 데이터 베이스가 날아갔고, 다시 복구되지도 않았다. 이번 기회에 서버를 재설치 하고 요즘 뜨는 docker로 서비스를 돌리기로 해다. 의지는 있지만 docker 기본 개념과 철학을 잘 이해하지 못한 상태에서 apache, mysql을 연동하는데 너무나 어려웠다.

  • docker container는 한 개 daemon만 실행한다.
  • 여러 daemon이 필요하면 container를 새로 만든다.
  • docker build 옵션 중 cmd ,entrypoint는 마지막 한 개만 유효하다.
  • docker run에 –link 옵션으로 다른 container를 연결하면 hosts 파일에 container 이름이 추가된다. 다른 container에 이름으로 접근할 수 있다.
  • docker run 중 -p 옵션으로 포트를 설정하지 않으면 expose 옵션으로 열린 포트를 외부에서 접근할 수 없다.
  • mysql docker image에 bind-address 옵션이 없고, 넣어도 역할을 하지 않는다.
  • link 옵션 대신 network으로 추가할 수 있는데, 힘들어서 못 하겠다.
  • mysql 로 MYSQL_ROOT_PASSWORD로 실행한 후 mysql < file.sql로 복구한 뒤, flush priviliges로 복구 파일 password를 적용시켜야 한다. 파일에 저장된 root password로 데이터 베이스 비밀번호를 초기화 할 수 있다.
  • https 설정시 lets encrypt로 받은 키를 configure file에 default에 넣지 않고 별도 virtual host를 설정하면SSL_ERROR_RX_RECORD_TOO_LONG 가 뜬다.
  • apache에서 database에 접근하기 위한 사용자 이름, 패스워드를 별도 파일을 만들어 접근할 때, docker container에 넣어 줘야 한다.

이 밖에도 수 많은 시행 착오가 있었다. 게다가 가장 최근 백업 파일이 두 달 전 파일이었다. 주중에 한 번씩 백업 하도록 수정했다. 설정하기는 힘들었어도 사용해 보니 편하다. 간단한 업데이트로 서버를 재설장 한다는게 말도 안되지만 잦은 빈도로 발생한다. phpmyadmin도 설치해야 하는데, 지금 엄두가 안 난다.

두 달치 기록을 날리고 값진 경험을 했다. 아직도 복구 중…

bash 스크립트로 사진정보를 mysql로 업데이트(버전 업)

기존 파일을 조금 업데이트 했다.

카톡 등 다른 사람에게 받은 사진에서 정보를 추출할 수 없다. 아쉬운대로 기록한 날을 찾아 기록했다.

       date=$(eval "awk 'BEGIN{FS=\" \";}/DateTimeOriginal/{print \$4}' temp")
        time=$(eval "awk 'BEGIN{FS=\" \";}/DateTimeOriginal/{print \$5}' temp")

        #2018-9-29 삽입.
        #파일 중, null로 date가 입력되는 파일에 파일 생성 날자로 강제로 삽입.
        if [ -n $date]
        then
            date=$(ls $CMD -lh --full-time | awk '{print $6}')
            echo "date is", $date
        fi


        if [ -n $time]
        then
            time=$(ls $CMD -lh --full-time | awk '{print $7}'| cut -d "." -f 1)
        fi

        #

        #latitudeRef=$(eval "awk 'BEGIN{FS=\" \";}/GPSLatitudeRef/{print \$4}' temp")
        latitude=$(eval "awk 'BEGIN{FS=\" \";}/GPSLatitude/{print \$4}' temp")
        #longitudeRef=$(eval "awk 'BEGIN{FS=\" \";}/GPSLongitudeRef/{print \$4}' temp")
        longitude=$(eval "awk 'BEGIN{FS=\" \";}/GPSLongitude/{print \$4}' temp")

mysql 중복 데이터 삭제

매번 인터넷에서 찾다쓰다, 귀찮아 나중에 한번에 쓰기 위해 기록한다.

아래 사이트를 참조했다.

지운 후, rollback
https://stackoverflow.com/questions/11011384/how-to-test-an-sql-update-statement-before-running-it

inner join
http://rapapa.net/?p=311

중복 데이터 찾기
http://ra2kstar.tistory.com/26

사진을 database에 추가하면, 가끔? 중복 데이터가 생긴다.어디가 문제인지 모르겠으나, 중복되는 경로를 지우고 싶다.

myphpadmin으로 임시 테이블을 작성하면 세션이 끝나면서 죽어버려 사용할 수 없다. 터미널로 연결하여 사용했다.

#임시 테이블 작성..
CREATE TEMPORARY TABLE if not EXISTS `toDelete` AS SELECT *, count(*) as `counter` from `picture` GROUP by `경로` HAVING `counter` >='2';

#inner join으로 id중복되는 id를 찾음.
select `picture`.* from `picture` inner join `toDelete` on `picture`.`id` = `toDelete`.`id` limit 10;

#백업 시작..
start transaction;

#삭제.
delete `picture`.* from `picture` inner join `toDelete` on `picture`.`id` = `toDelete`.`id`;

#확인 후,
commit

#rollback

 

WordPress로 에버노트 대신하기

워드 프레스 템플릿으로 에버노트 대신하기

에버노트를 한 5년정도 잘 사용했었다. 작년에 에버노트의 내용을 백업하기 위해 database에 접근했으나, 에버노트 제작사에서 접근을 허용하지 않았다. 관련 프로그램들이 있었으나, 잘 되지 않았고, 데이터가 너무 많은지 파일을 받는데 한계가 있었다. 내가 만든 데이터인데 내가 제대로 소유를 못하고 있다고 생각하니 씁씁했다. 이번 기회에 에버노트를 떠나기로 하고, WordPress로 만든 블로그에 에버노트를 대신할 기능을 추가했다. 기능은 부족하지만, 나름 써보니 괜찮은 듯 하다. 텍스트는 어느 정도 입력, 조회, 수정이 가능했었고, 오늘 몇번의 시행착오 끝에 한개의 사진을 추가 가능하도록 했다.

페이지로 php를 제공하는 템플릿 만들기

워드프레스는 기본으로 php를 사용할 수 없다. 다행히? 사용자가 page에서 템플릿을 만든다면 사용할 수 있다. 작업을 조회/수정/입력하는 템플릿을 3개를 만들었다.

작업 조회하는 php

이 템플릿은 mysql에 접근하여 완료되지 않은 작업을 표시한다. 사용자가 작업을 추가할 경우, 그룹ID를 할당하는데, 이 그룹ID를 기준으로 작업을 표시한다. mysql의 database는 두 개를 만들었는데 하나는 작업 내용이고, 하나는 이미지 파일의 경로이다. 조회를 눌렀을 때, grpId로 그림의 경로가 있으면 이를 화면에 표시한다.

wordpress 설치 디렉토리 중 wp-content가 내용을 담당하고 있다. 사용하는 theme의 경로로 이동한 다음 다음 3개의 파일을 만들었다.
myJob.php, myJobInsert.php, myJobModify.php
아래 Template Name을 원하는 내용으로 변경하고 page를 만들 때 이를 선택하면 해당 파일의 php 기능을 사용할 수 있다.

<?php /* Template Name: myJob*/ ?>
<?php
get_header(); ?>

<div id="main-content" class="main-content">

<?php
    if ( is_front_page() && twentyfourteen_has_featured_posts() ) { 
        // Include the featured content template.
        get_template_part( 'featured-content' );

    }   
?>

대략 아래와 같이 작업을 한다.
1. 로그인이 되어 있는지 확인
2. mysql user와 password를 시스템에서 읽어옮
3. 데이터 베이스에 연결
4. query를 날림..쿼리는 대략 다음과 같이 했다.

$query="select * from
        (select * from  
        (select* from `workList` order by `id` desc, `업데이트일` desc) as target 
group by `grpId`)
as target2 where year(`완료일`) = '0000' order by `마감일` asc";

php에서 template table을 만들 수 있으나, 셰션이 끊기면 임시 테이블도 없어진다. 귀찬고 데이터도 얼마 되지 않아 select를 중첩했다.
5. query의 결과를 html로 표시해 주는 부분
6. 이미지가 있으면 이미지도 같이 표시

작업을 입력하는 php

이 템플릿은 그룹ID를 할당하여 작업을 입력한다. 오늘 사진도 한장 입력을 할 수 있도록 수정했다. submit 버튼을 누르면 가장 마지막의 GrpId로 오늘 날자를 업데이트 날자로 하여 새로 항목을 만든다. 파일을 업로드 했다면, 파일 경로를 내용에 대한 데이터와 연결한다.

템플릿은 위와 같은 방법을 만들었다. html에서 form을 설정하여 해당 내용을 $_POST로 데이터 베이스에 변수로 들어가도록 했다.
1. 로그인 확인 및 데이터베이스에 연결
2. 가장 마지막의 grpId를 확인
3. +1을 하여 사용할 grpId로 설정
4. 오늘 날자, 오늘 날자+14일을 확인하여 업데이트일, 목표일로 자동 설정
5. form으로 해당하는 내용을 표시
6. 이미지를 입력할 경우, 파일 이름과 경로를 설정
7. 사용자가 submit 버튼을 누르면 내용과 이미지의 경로를 데이터베이스에 입력하고, 이미지를 설정한 경로에 업로드

작업을 수정하는 php

조회된 작업 중, 수정을 원하는 부분이 있으면 grpId를 확인해야 한다. 작업을 수정한는 페이지에서 Id를 입력하여 내용을 표시한 다음, 내가 원하는 내용으로 업데이트한다. 조회 버튼을 눌렀을 경우, 가장 나중에 작업된 내용이 표시된다.

mysql을 사용한 견적 산출 방법

필요 조건..
1. 최소 아이템을 입력으로
2. 업데이트는 빈번하게..
3. 한번 입력한 아이템은 다른 곳에서 사용할 수 있도록..

임시 테이블을 만들어서, (각 경우에 따른, 주제어반/보조제어반+메이커 조합)
어느 아이템이 들어갈지 정함..
이 임시 테이블에 수량에 대한 항목이 정해져 있어야 됨..

모든 테이블에서 해당하는 아이템을 뽑아내면, 사용 가능할 것 같음..

select * from `cost`;

create temporary table `주제어반_ABPLC` (`ItemID` int, `수량` int);


#제어반을 구성하기 위한 ID/수량 매핑

insert into `주제어반_ABPLC` values (7,1),(13,5),(17,1),(20,3);

select * from `주제어반_ABPLC`;

drop temporary table `주제어반_ABPLC`;


#각 항목에서 해당하는 ITEM, 수량을 산출하기 위한 식..

select '주제어반',`cost`.`모델명`, `cost`.`세부사양`,`cost`.`제작사`,`주제어반_ABPLC`.`수량`,`cost`.`개당가격` from `cost`
 inner join `주제어반_ABPLC` on `cost`.`ItemID`=`주제어반_ABPLC`.`ItemID`;

단점은 만들 임시 테이블이 너무 많음..