오래된 Raspberry PI 3가 가지고 놀기엔 너무 느리다고 자주 느끼게 되었다. 느린 H/W가 내 시간을 좀 먹고 있다는 생각은 언제나 새로운 지름을 위한 훌륭한 친구다. 뿐만 아니라 여러 최신 버전의 라이브러리들이 설치되지 않는 일이 종종 발생했다. 이제 장비 업그레이드가 필요한 시점이라고 생각하고 RP5를 사게되었다.

RP3에서 가장 중요한 서비스인 MoniWiki는 제일 먼저 반드시 Migration해야 하는 녀석이었다. MoniWiki는 내가 필요한 용도에 딱 맞는 맘에 드는 위키엔진이다. 하지만 그 사용자가 많지 않아 사실 프로젝트가 종료되었다고 생각하곤 했다. 아주 가끔 사이트에 들어가보면 어디가 공홈인지 구분하기 힘들었다. 여기 저기서 코드를 받아서 사용할 때도 있었다. 지금은 github에 자리를 잡은 것 같고 메인 저자가 감사하게도 질문에 대한 답변도 달아주시고 가끔 코드작업도 해주시는 거 같아 고마울 따름이다. 하지만 그러다보니 한 번씩 업그레이드나 이관 작업을 할 때면 항상 예상보다 더 시간을 쓰게 된다. (물론 오래된 개발자임에도 php를 모르는 내가 큰 원인이기도 하다. 경제적 자유를 얻게되는 그 날 다른 language로 포팅작업을 해볼까?) 그래서 이번엔 그 기록을 좀 남겨두려한다.

나는 RP3에서 nginx + php7-fpm 으로 MoniWiki를 사용하고 있었다. 모니위키는 데이터를 파일에 저장하기 때문에 심플하고 포팅과 장기 보관 안전성 측면에서 개인용으로 쓰기에는 적합하다. nginx와 php만 필요하기 때문에 매우 저렴한 웬만한 호스팅 서비스에서도 부담없이 돌릴 수 있다. 그리고 Raspberry Pi는 핸드폰 충전기 전원 정도밖에 쓰지 않는 장비이다. (편집증으로 인해) 개인 데이터를 클라우드에 올리기를 꺼림칙하게 생각하는 나에게 RP는 책상 위 MoniWiki 서버로 알맞는 기계였다. (나에게: 언젠가 MoniWiki의 장점에 대해서도 길게 한 번 써보자)

RP5에서 nginx를 설치하고 php를 설치했다. 최신 8 버전 php-fpm이 설치됐다. 그리고 MoniWiki도 git clone을 받아 모든 걸 최신 버전으로 맞췄다. 여기까진 깔끔했는데 이제 MoniWiki를 설정할 때부터 문제가 발생하기 시작했다. 일단 php8 최신버전에서 없어지거나 deprecated된 많은 함수들이 MoniWiki에서 사용되고 있었기 때문에 뭔가 화면은 뜨는데 제대로 동작하지 않는 부분들이 있었다. php에 대한 나의 지식이라는 것은 MoniWiki 설치할 때만 spot으로 공부했던 정도라 다시 log를 보고 code를 grep으로 찾아서 perplexity 도움을 받아가며 echo 명령으로 지저분한 디버깅 코드를 넣어 조금씩 고쳐가다가 도저히 내가 하기엔 너무 많은 시간을 써야할 것 같다는 생각이 들어 결국 다른 길을 찾게 되었다.

php7을 설치하려고 했다. 근데 RP에서 php7 설치는 최신 버전과는 달리 커맨드 한 줄로 쉽게 되지는 않았다. 결국 시도하다 보니 직접 소스 빌드까지 해야하는 상황까지 왔다. RP OS를 쓰고 있어서 그런지 build 과정이 깔끔히 진행되지 않고 여러 오류가 발생하더라. 물론 이 c와 configure, make도 익숙한 툴이 아니라서 이걸 파다가는 이번 주말도 다 넘길것 같았다. 그래 docker가 있었지..

nginx와 php7-fpm 도커를 docker-compose로 구성하기로 맘먹고 시도했다. 그 내용을 간단히 기록해 두고자 한다. 그리고 나중엔 이 구성으로 docker hub에 나도 올려서 미미하나마 기여를 해야겠다.

작업경로는 /home/user1/www/myserver.com 이다. 그 아래 html/moniwiki/.. 가 있다.


먼저 nginx와 php7-fpm을 위한 파일이다. /home/user1/www/myserver.com/docker-compose.yml
version: '3.9'

services:
    nginx:
        image: nginx:latest
        ports:
          - '80:80'
          - '443:443'
        volumes:
          - ./html:/var/www/html
          - ./nginx-default.conf:/etc/nginx/conf.d/default.conf
          - /home/user1/prv/ssl-certs/certificate-all.crt:/etc/cert/ssl-certs/certificate-all.crt
          - /home/user1/prv/ssl-certs/private.key:/etc/cert/ssl-certs/private.key
          - /var/log/nginx:/var/log/nginx
        environment:
          TZ: Asia/Seoul

    php-fpm:
        image: php:7-fpm
        volumes:
          - ./html:/var/www/html
          - ./php-fpm-conf-add.ini:/usr/local/etc/php/conf.d/php-fpm-conf-add.ini
        environment:
          TZ: Asia/Seoul


다음은 nginx 설정 파일이다. /home/user1/www/myserver.com/nginx-default.conf
server {
	root /var/www/html;
	index index.html;
	server_name myserver.com;
       	error_log  /var/log/nginx/error.log;
       	access_log /var/log/nginx/access.log;

	location / {
		try_files $uri $uri/ =404;
	}

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

	listen [::]:443 ssl ipv6only=on; # managed by Certbot
	listen 443 ssl; # managed by Certbot
	ssl_certificate /etc/cert/ssl-certs/certificate-all.crt;
	ssl_certificate_key /etc/cert/ssl-certs/private.key;
}

server {
	if ($host = myserver.com) {
		return 301 https://$host$request_uri;
	}

	listen 80 default_server;
	listen [::]:80 default_server;

	server_name myserver.com;
	return 404;
}

그리고 php에 timezone을 지정하기 위한 파일이다 /home/user1/www/myserver.com/php-fpm-conf-add.ini
date.timezone = "Asia/Seoul"


그리고 이 docker-compose 를 서비스로 등록했다. 아래 파일을 먼저 만든다 /etc/systemd/system/docker-compose-myserver.com-nginx-php.service
[Unit]
Description=myserver.com nginx and php-fpm Docker Compose Application Service
Requires=docker.service
After=docker.service
StartLimitIntervalSec=60

[Service]
WorkingDirectory=/home/user1/www/myserver.com
ExecStart=/usr/bin/docker-compose up
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

그리고 서비스로 등록한다.
sudo systemctl enable docker-compose-myserver.com-nginx-php.service 

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2024-04-21 10:27:49
Processing time 0.2069 sec