사용자 도구

사이트 도구


freebsd:start

이 글은 있는 그대로 제공하며, 누구든지 이를 바탕으로 FreeBSD설치를 할 때, 이에 따른 어떠한 책임도 지지 않겠다는 것과 이로 인해서 생겨나는 질문에 따로 답변을 따로 하지 않을 것임을 미리 알려드립니다 -2021년 1월 10일 김민수.

직지프로젝트 서버에 FreeBSD 운영체제 설치하기

참고한 문서와 누리집

2021/01/05 23:00

독립 서버 관련 서비스 제공자

Kimsufi

2010년 미국 집에서 독립서버를 운영하다가 유럽 벨기에로 이사를 오면서 알아봤던 독립서버 회사로 OVH가 있었다. 그래서 그 회사에 서버 운영을 맞기고 유럽으로 넘어왔는데, 그간 OVH가 자기이름은 계속 유지하면서 사업 다각화 측면에서 Kimsufi (이하 킴서피) 라고 하는 자회자를 하나 차린 듯 한데, 킴서피는 개인 소비자를 상대로 OVH 보다 저렴한 서버를 제공하는 듯 했다. 직지서버는 자동으로 킴서피로 옮겨졌다. 이유야 어찌되었는 나로서는 이게 최적이었는데, 가격 대비 성능 면에서 예전에 사용했던 한국 회사보다 경제적이었고, FreeBSD를 설치할 수 있기 때문이다. :-( 2022.12월 기준으로 Kimsufi 는 FreeBSD를 지원하지 않는다. 아울러, Kimsufi 모회사인 OVH 에서 제공하는 독립서버에서도 더 이상 FreeBSD를 지원하지 않는다. 이건 개인적으로 좀 큰 일인데?

참고로 내가 FreeBSD에 대한 글을 쓰는 이유 중 하나는 이제 거의 개인 서버화한 직지프로젝트 서버가 돌아가는 월 유지비를 절감하기 위해서 시작한 KS-11 [(2.66GHz Xeon CPU/16GB 주기억장치에 2TB 보조기억장치)]에서 KS-3[(1.86GHz Atom CPU/4GB 주기억장치에 2TB 보조 기억장치)] 서버 이전에 대한 기록을 남기기 위해서다. 물론 그 이전에 배운 것들과 간간히 기록해 놓은 문서들을 참조했다.

경험한 사람들은 알겠지만, 컴퓨터로 하는 일을 기록하는 것은 대게 난삽하다. 대부분의 일이 문제풀이 과정이 되어 가고, 그 문제를 풀어가는 난잡한 과정은 그 기록이 쉽지 않기 때문이다. 여기에 기록한 FreeBSD에 관련한 글을 읽을 때 이 점을 참고하기 바란다.

Funio

이 회사는 도메인 관리만을 위해서 쓰는 회사다. 처음에는 DNS 까지 개인 서버에서 돌렸으나, 이건 그냥 회사에 일년 사용료 내고 쓰는 것이 최적이라는 결론에 도달했다.

뱀꼬리

안 읽어도 서버 설정하는데 큰 문제 없는 내용...^^a

2021/01/10 16:45

서버 새로 설치 후에 아무 생각 없이 그저 기계적으로 하는 일

킴서피는 FreeBSD를 설치한 후에 자동으로 전자우편을 보내서 root와 초기 비밀번호를 알려준다. Putty라는 SSH 접속 프로그램을 이용해서 root와 비밀번호를 써서 새 서버에 IP주소를 이용해서 접속한다.

Root로 접속후에 제일 먼저 비밀번호 번경.

passwd

그런 다음에 root로 전환이 가능한 관리자 권한이 있는 첫 사용자를 만든다.

adduser
Username   : userid
Password   : *****
Full Name  : Name Family-Name
Uid        : wxyz
Class      :
Groups     : wheel
Home       : /home/userid
Home Mode  :
Shell      : /bin/csh

이제 /etc/ssh/sshd_config 문서에서 다음 줄에 있는 내용으로 변경한다. 즉, PermitRootLogin yes를 no 로 바꾼다.

PermitRootLogin no

나 자신이 내 서버에 접속을 못하게 될 수도 있기 때문에 반드시 새로만든 사용자로 계정으로 접속을 확인한다.

ssh -l userid localhost
...
Are you sure you want to continue connecting (yes/no)? yes
Password for userlid@hostid: 
...
su 
Password: 

내가 새로 만든 사용자 계정과 비번으로 root로 전환 가능한 것을 확인하였으면 안심하고 새서버에 필요한 연장들을 설치하면 된다.

접속 환경이 root 인것을 확인하였으면 다음을 실행하여 /usr/ports를 깐다.[(배운게 도둑질이라고, 난 /usr/ports에서 설치하는 거에 익숙해서 pkg install 같은 다른 방법은 잘 쓰지 않는다(쓰지 못한다).)]

portsnap fetch extract 
2021/01/04 19:52

각종 배포판 중에서 설치할 판 수 결정하기

FreeBSD 11.4-RELEASE

2020년 말, 2021년 초 프리비에스디 배포판 정보판수 지원계획에 의하면 FreeBSD 11.x와 12.x 판수에 대한 배포일과 지원종료일은 다음과 같다.

Branch Release Release Date C Expected EoL
stable/12 n/a n/a June 30, 2024
releng/12.2 12.2-RELEASE October 27, 2020 12.3-RELEASE + 3 months
releng/12.1 12.1-RELEASE November 4, 2019 January 31, 2021
stable/11 n/a n/a September 30, 2021
releng/11.4 11.4-RELEASE June 16, 2020 September 30, 2021

현재 킴서피에서 제공하는 설치판수는 11.4이고, 기존 서버에 설치된 판수는 11.3이다. 서버 전문 회사에서 어련히 알아서 판수를 골라줬을까 생각하고[(이건 단순 생각이 아니라 직접 경험한 것이다. 딴에는 미리 12.x 로 올리면 나중에 편하겠다 싶어서 12.x로 올리려고 해 봤는데 수많은 오류들을 보면서, 이를 해결하려고 애쓴 시간과 노력을 통해 배운 것도 없지는 않겠지만, 연말에 이틀 정도 아까운 시간 낭비를 한 후에 11.4에서 일단 머물기로 결정을 했다. 사실 서버 운영체제는 한 두 수 정도 천천히 적덩하다고 본다.)] 이 11.4 판수를 설치하기로 한다. 참고로 기존에 있던 2018년 8월 27일부터 써왔던 것인데, 11.0에서 시작해서 계속해서 갱신을 해서 현재 11.3으로 돌아간다. 서버 이전에 핵심적인 요소는 아니지만, 문서의 완결성을 위해서 기존 서버에서 돌아가는 FreeBSD를 11.3에서 11.4로 올리는 과정을 https://www.freebsd.org/releases/11.4R/installation.html#upgrade에 의거해서 간단히 소개한다. 대부분 설명이 sudo를 설치해서 실행하라고 하지만, 어차피 나 혼자 쓰는 서버, root 계정에서 실행했다.

# freebsd-update fetch
# freebsd-update install
# freebsd-update upgrade -r 11.4-RELEASE // 2022 년 12월 11.4 에서 13.1-RELEASE 로 실행해서도 성공적으로 '업'했다.
# freebsd-update install
# shutdown -r now
# freebsd-update install

MySQL 5.7 / PHP 7.4 / Apache 2.4

기존 서버에서 돌아가는 MySQL 판수는 5.6, PHP 7.2다.

지난 몇 년 동안 직지프로젝트가 비록 문을 닫은 것처럼 보이지만, 실상 속에서는 Wordpress:워드프레스로 변신 중이기 때문에 워드프레스가 요구하는 조건을 확인하는 것이 중요하다. 이 위에 더해서 Nextcloud, 혹은 ownCloud 설치에 필요한 판수를 확인하는 것도 중요하다.

그래서 MySQL은 5.7을 선택해서 설치하기로 했고, 이 판수는 2020년 12월 기준으로 FreeBSD ports에서 최신판인 8.0 바로 아래 판수이다. 한판수 늦게 가자는 생각을 적용해서 PHP 는 7.4를 선택했다. 이 또한 가장 최신 판수인 8.0보다 하나 아래 판 수다.

Apache는 서버를 돌리는 것을 가능하게 해 주는 프로그램인데, 이건 예전에 Apache 1.x 에서 Apache 2.x 로 판 수 올린 다음에 그냥 계속해서 사용하는 거라서 뭐 고민의 여지 없이 그냥 현재 최신 판수인 Apache 2.4를 선택.

다른 패키지 판수도 신경을 써서 결정을 해야하겠지만, 이 세 가지는 서버를 돌리기 위한 핵심 중의 핵심이라서 정성스럽게, 이런 저런 상황을 고려해서 선택하는 것이 좋다.

설치 순서는 MysQL, PHP, PHP-EXTENSION, 그리고 MOD_PHP 순서로 했고, 이걸 성공적으로 마치고 나면 Apache는 자동으로 설치가 된다. 이제부터 설치만 하면 되는데, /etc/make.conf 에는 다음과 같은 내용을 넣는 것이 좋다. 이 설정이 없으면 딸림 패키지를 설치할 때 마다 일일히 개별 설정을 내가 선택해 줘야 하는데, 이 줄 하나면 기본 설정값으로 사용자 입력 없이도 모든 패키지가 한 번에 설치가 된다.

BATCH="YES"

물론 나중에 PHP 설치 할 때에는 특정 패키지에서는 이 설정을 빼줘야 하는 경우도 있었는데, 이는 사용자로 하여금 특정 라이선스 조건을 수락하는 것을 확실히 하기 위해서였고, 이 또한 저 설정 문서를 바꾸는 것 보다는 그 특정 패키지 ports 에서 그것만 따로 설치하고 나서 다시 원래 하던 PHP 설치를 하면 된다.

대략적으로 계획하는 설치할 패키지와 설치 순서는 다음과 같다. 처음 세 개 패키지에 대해서는 딸림 패키지 청소한 목록을 밝혀서 FAMP (FreeBSD, Apache, MySQL, PHP)가 얼마나 많은 패키지들을 필요로 하는지를 보여주겠지만, 다른 것들에 대해서는 이 청소목록은 생략한다.

  1. MySQL 5.7 설치
  2. PHP 7.4 설치
  3. MOD_PHP7.4 설치
  4. Apache 2.4 설치 (이건 MOD_PHP7 설치 시 자동으로 설치가 되었다는…)
  5. Certbot 설치
  6. Postfix 설치
  7. Dovecot 설치
  8. Roundcube 설치
  9. ProFTPd 설치
  10. fail2ban 설치
  11. Wordpress 설치
  12. Matomo 설치
  13. phpMyAdmin 을 설치해서 PHP/MySQL/Apache 연동을 최종 확인.
  14. Piwigo 설치
  15. ownCloud 설치 [(난 사실 Nextcloud를 설치하려고 했는데 오류가 발생해서 설치 못하고 ownCloud는 FreeBSD는 불안정하다 불만을 나타내면서도 설치는 바로 되어버렸다는.. 이런 것을 우연이라고 할지, 인연이라고 할지… 결국 ownCloud를 쓰게 되었다.)]
  16. - VNC (virutal network computing) 설치
2021/01/06 18:41

서버 이전을 통해서 달성하고자 하는 목표

이번 서버 이전은 2020년 12월 25일부터 2021년 1월 4일에 걸쳐서 진행했고, 이 문서는 예전에 일기장에 썼던 기록들과 이번 경험을 함께 정리해서 기록으로 남겼다.

현재 돌아가는 서버를 그대로 이전

이는 Wordpress, Questions2Answers, 그리고 MoinMoin DoKu 위키[(지금 쓰는 위키가 DokuWiki 인 것을 보면 알겠지만, 난 2021년 이후로 한때 열성적으로 사용했던 MoinMon Wiki를 쓰지 않기로 했다)], ProFTPd 로 돌아가는 서비스를 옮기는 것을 뜻한다.

예전에 올렸다가 방치했던 직지서버 정적 HTML 자료들 복원

이건 좀 중장기 프로젝트다.

Mailman 이전/혹은 신철

이건 이번에 보니 mailman2 가 python 2.7과 함께 거의 사망직전이고, mailman3는 아직 안정적이지 않아 보이고, 설치에 대한 자료가 많지 않아서 이 또한 중장기 프로젝트가 될 듯 하다.

Roundcube을 이용해서 새로 Webmail 설치

그동안 늘 추진하다가 성공하지 못했는데, 이번에는 꼭 성공하자.

Piwigo를 이용해서 온 가족들이 쓸 수 있는 사진첩 설치

가족 사진첩이 없는 것은 아니다. Envira Gallery라는 워드프레스 플러그인을 이용해서 만들었는데, 이 플러그인이 일년 단위로 사용요금를 내는 유료 플러그인이어서 일단 일년만 사용료내고 설치한 그대로 계속 쓰려고 했었는데 그간 워드프레스와 PHP 등 관련 무른모 판수가 올라가면서 어느 순간부터 버벅거리면서 동작을 제대로 안한다. 더욱 결정적으로 플러그인이 너무 무거워서 그런지 체감 속도가 너무 느려서 가족들이 쓰지를 않는다는 점이다. 이번에 설치하는 사진첩은 가족들이 쓸 수 있을 만큼 좀 더 빠르고 편하면서도 경제적인 것으로 설치하려고 한다.

ownCloud 혹은 Nextcloud를 이용해서 개인 클라우드 설치

VNC 설치

경제적인 이득

물론 새 서버 사양에 해당하는 성능을 얻게 되겠지만, 이를 통해서 월 14.52 유로를 절약할 수 있다. 한 달에 전자책 한 두 권을 살 수 있는 금액이다!

2021/01/10 16:36

Network File System(NFS)으로 옛서버에서 새서버로 문서 복사하기

Network File System (NFS)에서 설명하는 내용을 바탕으로 옛서버에서 새서버로 중요한 문서들을 복사할 때 필요한 요점들을 정리한 것이다.

두 서버에서 모두 root 계정으로 작업했다.

옛서버, 보안상 이 IP 주소를 192.168.1.37 이라고 가정하자

/etc/rc.conf 내용 일부

##########
# NFS  
rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_enable="YES" 
mountd_flags="-r"    #  Mount	the file system read-only (even the super-use may not write it).

/etc/exports 내용 일부

/home   -maproot=root 192.168.1.41 # 아래에서 설정할 새서버 주소
/usr    -maproot=root 192.168.1.41 # 아래에서 설정할 새서버 주소

다음 명령어 실행

service nfsd start
service mountd reload
새서버, 보안상 이 IP 주소를 192.168.1.41 이라고 가정하자

/etc/rc.conf 내용 일부

##########
# NFS Client
nfs_client_enable="YES"

다음 명령어 실행

service nfsclient start
mount 192.168.1.37:/home /mnt
copy -Rp /mnt/filestocopy /localdir/
2021/01/06 18:40

MySQL 5.7 설치와 자료 이전

예전에는 한 번 MySQL 5.6 에서 MySQL 5.6으로 옮기는 경우였는데, 그 때에는 옛서버에서 mysql data folder (예를 들어 /var/db/msyql) 전체를 서버에서 서버 문서 복사해서 새로운 서버에서 mysql을 설치해서 기동하면 아주 자연스럽게 돌아갔다.

이번에는 좀 더 일반적인 방법[(사실 예전 방식을 시도 안해본 것은 아니지만, 이유를 알 수 없는 이유로 한 번은 되었다가 또 한 번은 안 되고, 결국 가장 안전한 방법으로 자료이전을 하기로 한다)]으로 새 서버에 MySQL을 새로 설치하고, 그 관련 자료를 예전 서버로부터 이전해 보려고 한다.

옛 서버 쪽: MySQL 5.6 판, 이미 돌아가고 있음
mysqldump -u root -p --databases db1 db2 db3 > /home/dump.sql 

혹은,

mysqldump -u root -p –all-databases > /home/dump.sql
새 서버 쪽: MySQL 5.7 판, 설치한 후에 돌려야 함
cd /usr/ports/database/mysql57-server
make config
make all install clean

설치한 다음에 나오는 중요한 정보

설치후에 나오는 이 중요한 정보는 'pkg info -D -x pkgname (예로 mysql57-server)'하면 다시 볼 수 있다.

여기서 정말 중요한 정보는 설정문서에 대한 정보다.

/usr/local/etc/mysql/my.cnf  

여기에서 datadir=/var/db/mysql 위치를 다른 공간으로, 예를 들면 /mydir/mysql로 변경하려면, 이 '/var/db/mysql'을 다 찾아서 '/mydir/mysql'로 바꿔주면 된다[(vi 에디터에서는 ':%s/\/var\/db\/mysql/\/mydir\/mysql/g' 하면 된다.)]. 아래 설명에서는 기본값인 /var/db/mysql 로 설정한 예를 보여준다.

설치한 다음에 딸려서 설치된 패키지들 청소한 화면

/etc/rc.conf 내용 [(db 폴더 위치는 기본값을 썼다., 이 위치를 변경하고 싶다면 /usr/local/etc/mysql/my.cnf 내용을 변경하면 된다.)]. 5.7 판수에서 중요한 변화는 MySQL 환경변수를 지정하는 설정문서가 만들어져 있다는 거다.

##########  
# MySQL
mysql_enable="YES"

자료초기화하고 MySQL 기동한 후에 자료를 이전한다. 초기화를 할 때 root 비밀번호가 임시로 만들어 진다.

/usr/local/libexec/mysqld --initialize --user=mysql --datadir=/var/db/mysql
 100
 100 200
 100 200
[Warning] InnoDB: New log files created, LSN=45790
 100
[Warning] InnoDB: Creating foreign key constraint system tables.
mysqld: Error on delete of './auto.cnf' (Errcode: 2 - No such file or directory)
[Warning] World-writable config file './auto.cnf' has been removed.
[Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 0ca0253b-4ee1-11eb-b0ab-0125907bb316.
[Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
[Warning] CA certificate ca.pem is self signed.
[Note] A temporary password is generated for root@localhost: hphj!CFAp4>r

자료초기화가 성공적으로 끝나면 다음을 실행한다. 명령어 끝에 '&' 빼먹지 말자!

mysqld_safe --user=mysql --datadir=/var/db/mysql &

서버 기동을 확인하였으면 임시로 받은 root 비밀번호를 본인이 기억하기 쉬운 것으로 바꾸어주면 좋다. 그러고 나서 다음과 같은 명령어로 옛 서버에 있는 자료를 새 서버로 옮겼다. 새로 설치를 하는 경우에는 이런 이전을 할 필요가 없다.

mysql -u root -p < /mnt/dump.sql

그런 다음에 사용자는 다음과 같은 방식으로 일일이 새로 더해주었다[(내 경우에는 사용자 정보를 저장하고 있는 mysql db는 이전하지 않았다)].

msyql -u root -p
use mysql;
create user 'myuser1'@'localhost' identified by 'topseceret';
grant all privileges on mydb1.* to 'myuser1'@'localhost';
flush privileges;
exit;

모든 게 잘 되면 좋지만 잘 안되는 경우를 위해서 참고적으로 두 가지를 더 알아두니 좋았다.

MySQL root 비번 번경 방법

https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html 참고.

mysqld_safe --skip-grant-tables --datadir=/var/db/mysql &
mysql
[(none)]use mysql;
[mysql] flush privileges;
[mysql] ALTER USER 'root'@'localhost' identified by 'newtopsecret';
[mysql] flush privileges;
[exit] exit
MySQL 데몬 죽이는 법

https://superuser.com/questions/983969/how-to-kill-mysql-with-moving-pid 참고.

ps aux | grep mysql 

실행 결과를 보니 MySQL이 분명히 돌아가고 있는데, 무슨 pid 파일이 없다면서 MySQL 서버를 새로 시작할 수가 없었다.

pkill mysql

또 한 번은 다음 명령어로 MySQL을 죽였다.

killall -9 mysql
killall -9 mysqld
killall -9 mysqld_safe  
2021/01/09 20:23

PHP 7.4 설치 (Apache도 설치됨)

PHP 7.4 핵심 설치

cd /usr/ports/lang/php74
make config
make all install clean

설치한 다음에 딸려서 설치된 패키지들 청소한 화면

PHP 7.4 확장 모듈 설치

cd /usr/ports/lang/php74-extensions/
make config
make all install clean
... ... ... 
===>  php74-pecl-pdflib-4.1.4_1 License PDFlib needs confirmation, but BATCH is defined.
*** Error code 1

이 오류를 만나면 /etc/make.conf 에서 BATCH=“YES”를 주석처리[(BATCH 앞에 # 더함)] 한 다음에 이 pdflib 패키지만 따로 설치한다. 다른 방법으로, make config 에서 이 pdflib 를 빼고 일차로 설치한 다음에, BATCH=“YES”를 주석처리하고 /usr/ports/print/pecl-pdflib 에 가서 이 것만 따로 설치할 수도 있다.

cd /usr/ports/print/pecl-pdflib
make config
make all install clean

이에 따른 몇 개 패키지는 BATCH=“YES” 기능을 껐기 때문에 일일이 선택사항을 골라서 정해줘야 한다. 그냥 기본설정값으로 설치를 해 준다. Pecl-pdflib 설치가 끝나면 다시 /etc/make.conf 에 BATCH=“YES” 기능을 켜고[(BATCCH 앞에 # 지움)], php74-extension 설치를 계속한다.

cd /usr/ports/lang/php74-extensions
make all install clean 

설치한 다음에 딸려서 설치된 패키지들 청소한 화면

PHP 7.4 아파치 용 확장 모듈 설치

cd /usr/ports/www/mod_php74
make config
make all install clean

2022년에 더함. mod_php82를 설치하고 나서 apachectl start 를 해도 기동이 안되는 경우가 있어서 검색을 해 봤다. https://forums.freebsd.org/threads/apache24-with-mod_php82-wont-start-up.86779/page-2#post-586761 에 의하면 다음과 같이 해결할 수 있었다. 내 경우에는 mod_php82 였는데, 똑 같이 따라해서 해결을 할 수 있었다.

pkg delete mod_php74
pkg install gcc
cd /usr/ports/www/mod_php74/
bash
export CC=/usr/local/bin/gcc
make install clean
exit
/usr/local/etc/rc.d/apache24 start

설치한 다음에 나오는 중요한 정보

설치한 다음에 딸려서 설치된 패키지들 청소한 화면

이제 환경을 설정하는 문서를을 내 입맛에 맞게 변경한다.

/usr/local/etc/php.ini 설정

각 변수들이 뭔지 필요하다면 검색을 해보면 알 수 있겠지만, 다른 값들은 몰라도 일단 다음 값을 확인하고 본인에게 필요한 값들[(내 경우에는 영화 한 편 올리는데 보통 4G 정도 용량이 필요하다)]로 설정한다.

max_execution_time = 360
default_charset = "UTF-8"
file_uploads = On
upload_max_filesize = 4096M 
max_file_uploads = 16
2021/01/10 09:24

Apache 2.4 설정 HTTP

아파치가 mod_php74 설치할 때 자동으로 설치가 되었지만, 처음 시작을 위한 따로 설정을 해줘야한다.

/usr/local/etc/apache24/modules.d/020_mod_ssl.conf 생성

없으면 새로 만들고, 이미 있다면 다음 내용을 확인한다.

Listen 443
SSLProtocol ALL -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog  builtin
SSLSessionCacheTimeout  300

/usr/local/etc/apache24/httpd.conf 설정

아파치 설정에서는 최소한 다음 설정들을 확인한다. 최근에 보안이 보장된 연결이 추세이기 때문에 아래 설정은 보안접속(https)을 지원하도록 한다.

LoadModule authn_socache_module  libexec/apache24/mod_authn_socache.so
LoadModule socache_shmcb_module  libexec/apache24/mod_socache_shmcb.so
LoadModule ssl_module            libexec/apache24/mod_ssl.so
LoadModule php7_module           libexec/apache24/libphp7.so

# Third party modules
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf

ServerAdmin webmaster@my.domain

<IfModule dir_module>
    DirectoryIndex index.htm index.html index.php index.cgi
</IfModule>

# PHP
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

#####
# default setting; used by *.domain
<VirtualHost *:80>
    ServerAdmin webmaster@my.domain
    DocumentRoot "/usr/local/www/apache24/data"
    ErrorLog "/var/log/httpd-error.log"
    CustomLog "/var/log/httpd-access.log" combined
    <Directory "/usr/local/www/apache24/data">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
    Alias /icons/   "/usr/local/www/apache24/icons/"
    <Directory "/usr/local/www/apache24/icons">
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

이렇게 설정을 했으면, apachectl start 해서 아파치 서버를 시작한다. 오류가 없이 실행이 되면 나만을 위한 웹서버가 돌아가는 거다.

2021/01/09 20:25

py-certbot 1.10 설치

/usr/ports/security/py-certbot
make config
make all install clean

설치한 다음에 나오는 중요한 정보

이 패키지는 보안연결서버를 인증해줄 때 사용한다. 먼저 /etc/periodic.conf 를 새로 만들어나, 있는 문서에 다음 내용을 더해준다. 이렇게 설정하면 일주일 간격으로 인증기간을 자동으로 연장해 준다.

weekly_certbot_enable="YES"

'sockstat' | grep http 를 실행해서 port 80과 443이 보이면 다음 명령을 실행해서 내가 돌리는 서버인 my.domain를 인증받는다.

certbot certonly --webroot -w /usr/local/www/apache24/data -d my.domain

제대로 실행이 되고 인증을 받았다면 다음과 같은 보안문서들이 저장된다.

/usr/local/etc/letsencrypt/live/my.domain/cert.pem
/usr/local/etc/letsencrypt/live/my.domain/privkey.pem
/usr/local/etc/letsencrypt/live/my.domain/fullchain.pem

이 단계는 반드시 성공해야 한다. 나중에 이 인증서들로 아파치전자우편을 보안연결을 통해서 접속하는 서버로 만들 것이기 때문이다.

참고로 하나의 문서로 다수의 가상서버를 인증 받을 수 있는데, 혹시라도 그 중 하나를 인증취소하려면 다음과 같이 하면 된다.

certbot delete --cert-name example.com
2021/01/10 09:25

Apache 설정 HTTPS

Apache 2.4 설정 HTTPpy-certbot 1.10 설치를 마쳤으면, 이제 /usr/local/etc/apache24/httpd.conf 에 보안연결이 가능한 가상 서버 호스트를 설정할 차례다.

#####
# default setting for https; used by *.domain
<VirtualHost *:443>
    ServerAdmin webmaster@my.domain
    DocumentRoot "/usr/local/www/apache24/data"
    ErrorLog "/var/log/httpd-error.log"
    CustomLog "/var/log/httpd-access.log" combined	

    SSLEngine On
    SSLCertificateFile "/usr/local/etc/letsencrypt/live/my.domain/cert.pem"
    SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/my.domain/privkey.pem"
    SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/my.domain/fullchain.pem"

    <Directory "/usr/local/www/apache24/data">
		Options Indexes FollowSymLinks
		AllowOverride None
		Require all granted
	</Directory>
	Alias /icons/	"/usr/local/www/apache24/icons/"
	<Directory "/usr/local/www/apache24/icons">
		AllowOverride None
		Require all granted
	</Directory>
</VirtualHost>

'apachectl restart' 해서 아파지 서버를 재기동한다. 웹브라우저에서 https://my.domain이 접속되면 성공한 것이다.

2021/01/09 20:26

Postfix 3.5 설치하기

cd /usr/ports/mail/postfix
make config
make all install clean

설치한 다음에 나오는 중요한 정보

설치한 다음에 나오는 메시지대로 다음을 실행한다.

mkdir -p /usr/local/etc/mail
install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /usr/local/etc/mail/mailer.conf
sysrc postfix_enable="YES"
sysrc sendmail_enable="NONE" 

/etc/periodic.conf 설정

daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO

/usr/local/etc/postfix/main.cf 설정

내가 운영하는 서버가 my.domain 이라는 이름을 가지고 있다고 가정한다. 다음 항목들을 다시 한 번 확인하고 내 상황에 맞게 설정한다.

myhostname = mail.my.domain
mydomain = my.domain
myorigin = my.domain
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/

/etc/aliases (/etc/mail/aliases) 변경

userid 가 내 계정이라고 하면 root 를 이 계정으로 바꿔준다.

root: userid

이렇게 aliases 문서를 변경하였으면 'newaliases'를 실행해서 변경사항을 /etc/aliases.db 로 갱신한다.

이렇게 모든 설정을 마친 다음에 'postfix start'를 실행해서 오류가 없이 돌아가면 나만의 메일서버가 만들어진 거다. 그리고 메일이 제대로 배달되는지 확인하려면 `sendmail -bv userid` 해 보면 된다.

2021/01/09 20:28

DOVECOT 2.3 설치

cd /usr/ports/mail/dovecot
make config
make all install clean

설치한 다음에 나오는 중요한 정보

Dovecot 설치 목적

Dovecot은 인터넷상에서 전자우편을 주고 받을 수 있게 해 주는 소프트웨어인데, 이를 통해서 https://webmail.jikji.org에서 보여주는 바와 같이 userid@jikji.org(여기 보인 설정 예에서는 userid@my.domain)를 가진 사용자가 인터넷 상에서 전자우편을 주고 받을 수 있는 환경을 구축한다. 아래 환경 설정은 이 목적을 달성하기 위해 webmail 무른로로 Roundcube를 염두에 두고 만든 것이다.

/etc/rc.conf 성정

sysrc dovecot_enable="YES"

/usr/local/etc/dovecot 생성 및 각 문서 설정 값 변경

cp -R /usr/local/etc/dovecot/example-config/* /usr/local/etc/dovecot
/usr/local/etc/dovecot.conf

다음 내용을 확인한다.

protocols = imap pop3 lmtp
/usr/local/etc/conf.d/10-logging.conf

다음 내용을 확인한다.

log_path = /var/log/dovecot.log
/usr/local/etc/conf.d/10-auth.conf

다음 내용을 확인한다.

auth_mechanisms = plain login
!include auth-passwdfile.conf.ext

/usr/local/etc/conf.d/auth-passwdfile.conf.ext

다음 내용을 확인한다.

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /usr/local/etc/dovecot/users
}


userdb {
  driver = passwd-file
  args = username_format=%u /usr/local/etc/dovecot/users
}

이제 /usr/local/etc/dovecot/users 문서를 만들어 준다. 이 문서에 들어있는 사용자 정보를 바탕으로 Roundcube를 통해 웹에서 전자우편을 주고 받는 것을 가능하게 할 수 있다.

여러 사람이 쓸 거 아니고 나만 쓸 거기 때문에 간단하게 다음과 같이 했다.

fgrep -v '*' /etc/master.passwd | cut -d : -f 1-4,8-10 > /usr/local/etc/dovecot/users
chmod 640 /usr/local/etc/dovecot/users
chown postfix:dovecot /usr/local/etc/dovecot/users

이렇게 하고 나서 /usr/local/etc/dovecot/users 를 열어서 필요 없는 사용자는 지우고, 내 계정(예를 들어 userid 라고 하자)만 남긴다. 그런 다음에 userid 뒤에 내 도메인을 더해준다, 즉 userid@my.domain. 이렇게 변경을 하였으면 문서를 저장하고 빠져 나온다.

/usr/local/etc/conf.d/10-mail.conf

다음 내용을 확인한다. uid/gid 설정은 사용자에 맞춰서 정해준다.

mail_location = maildir:~/Maildir
namespace inbox {
    inbox = yes
}
mail_privileged_group = mail
first_valid_uid = 1001
first_valid_gid = 0

/usr/local/etc/conf.d/10-mater.conf

다음 내용을 확인한다.

service imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}


service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0666
    user = postfix
    group = postfix
  }
}


service auth {
  unix_listener auth-userdb {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  user = dovecot
}


service auth-worker {
  user = postfix
}

/usr/local/etc/dovecot/conf.d/10-ssl.conf

다음 내용을 확인한다.

ssl = yes


ssl_cert = < /usr/local/etc/letsencrypt/live/my.domain/fullchain.pem
ssl_key = < /usr/local/etc/letsencrypt/live/my.domain/privkey.pem

/usr/local/etc/dovecot/conf.d/15-mailbox.conf

다음 내용을 확인한다.

# NOTE: Assumes "namespace inbox" has been defined in 10-mail.conf.
namespace inbox {
  # These mailboxes are widely used and could perhaps be created automatically:
  mailbox Drafts {
    auto=create
    special_use = \Drafts
  }
  mailbox Junk {
    auto=create
    special_use = \Junk
  }
  mailbox Trash {
    auto=create
    special_use = \Trash
  }

  # For \Sent mailboxes there are two widely used names. We'll mark both of
  # them as \Sent. User typically deletes one of them if duplicates are created.
  mailbox Sent {
    auto=create
    special_use = \Sent
  }
  #mailbox "Sent Messages" {
  #  special_use = \Sent
  #}
}

이 밖에 나머지 문서들과 설정값들은 기본값으로 남겨 두었다. 계속해서 다음 장에 있는 postfix 관련 설정 변경을 한다.

2021/01/09 13:52

DOVECOT + Postfix

Dovecot을 시작하기 전에, /usr/local/etc/postfix/main.cf에 다음 사항을 확인한다.

# TLS, SASL, Dovecot
smtpd_use_tls = yes
broken_sasl_auth_clients = yes
smtpd_tls_security_level = encrypt
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /usr/local/etc/letsencrypt/live/my.domain/fullchain.pem
smtpd_tls_key_file = /usr/local/etc/letsencrypt/live/my.domain/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_recipient_restrictions = permit_sasl_authenticated,
                               permit_mynetworks,
                               reject_sender_login_mismatch,
                               reject_unauth_destination,
                               reject_rbl_client rbl.maps.vix.com,
                               reject_rbl_client bl.spamcop.net,
                               reject_rbl_client dnsbl.sorbs.net,
                               reject_rbl_client rhsbl.sorbs.net,
                               reject_rbl_client dnsbl.njabl.org,
                               reject_rbl_client cbl.abuseat.org,
                               reject_rbl_client sbl-xbl.spamhaus.org
smtpd_relay_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
tls_random_source = dev:/dev/urandom


# MISC, as per https://askubuntu.com/questions/1045309/undefined-parameters-in-etc-postfix-master-cf to avoid warning
smtpd_restriction_classes = mua_sender_restrictions, mua_client_restrictions, mua_helo_restrictions
mua_client_restrictions = permit_sasl_authenticated, reject
mua_sender_restrictions = permit_sasl_authenticated, reject
mua_helo_restrictions = permit_mynetworks, reject_non_fqdn_hostname, reject_invalid_hostname, permit

그리고 /usr/local/etc/postfix/master.cf 에서 다음 내용을 확인한다.

smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o receive_override_options=no_header_body_checks
  -o smtpd_client_auth_rate_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o smtpd_soft_error_limit=99
  -o smtpd_hard_error_limit=100
  -o smtpd_error_sleep_time=0s

여기까지 설정하였으면 전자우편 관련 서버를 재기동한다.

postfix reload

이제 마지막으로 다음 명령을 차례로 실행해서 dovecot이 제대로 실행되면 성공한 것이다.

cd /usr/local/etc/dovecot
postmap users
chown postfix:dovecot users*
service dovecot start

이제 사용자가 접속이 가능한지, 즉 이 서버를 이용해서 전자우편을 주고 받을 수 있는지를 확인한다.

doveadm auth test userid@my.domain
Password:
passdb: userid@my.domain auth succeeded
 extra fields:
     user=userid@my.domain

이 아래 내용은 https://blog.andreev.it/?p=1604, 그리고 https://obsigna.com/articles/1539726598.html에 있는 내용을 많이, 그리고 고맙게 참조한 사이트에서 알려주는 내용인데, 이를 실행하면 전자우편 서버들이 제대로 돌아가는지를 확인해 볼 수 있다.

telnet localhost 110 시험해 보기

telnet localhost 143 시험해 보기

계속해서 보안접속 가능한 서버도 다음 명령어로 확인해 볼 수 있다.

openssl s_client -starttls smtp -connect localhost:587

그 다음에 아래 처럼 화면에 보이는 내용을 입력해본다. 기본적으로 ehlo, mail from:, 그리고 quit.

 ehlo my.domain
 mail from:userid@my.domain
  250 2.1.0 Ok
 quit
  250 2.0.0 Bye
 closed
 

이제 postifx와 dovecot이 서로 연동하는지를 아래 명령으로 확인한다.

doveadm auth test -a /var/spool/postfix/private/auth userid@my.domain mytopsecret
passdb: userid@my.domain auth succeeded.
    user=userid@my.domain
2021/01/10 09:38

Roundcube 1.4 설치

cd /usr/ports/mail/roundcube/
make config
make all install clean

설치한 다음에 나오는 중요한 정보

아래 설정을 Roundcube가 운래 설치된 /usr/local/www/roundcube 를 가정하고, http://my.domain/roundcube 주소로 인터넷에서 접속할 수 있는 상황을 가정지만, 이 공간은 원하는 대로 바꿀 수 있으며, 인터넷 주소또한 가상호스트(예를 들어 https://webmail.jikji.org)를 이용해서 원하는 주소로 바꾸어 줄 수 있다.

/usr/local/www/roundcube/config/config.inc.php 설정

cd /usr/local/www/roundcube/config cp -Rp config.inc.php.sample config.inc

config.inc 에서 다음 내용을 확인한다.

$config['db_dsnw'] = 'mysql://roundcube:mytopsecret@localhost/roundcube';

$config['default_host'] = 'tls://my.domain';
$config['smtp_server'] = 'tls://mail.my.domain';
// SMTP port. Use 25 for cleartext, 465 for Implicit TLS, or 587 for STARTTLS (default)
$config['smtp_port'] = 587;

// This key is used to encrypt the users imap password which is stored
// in the session record. For the default cipher method it must be
// exactly 24 characters long.
// YOUR KEY MUST BE DIFFERENT THAN THE SAMPLE VALUE FOR SECURITY REASONS
$config['des_key'] = '123465789AA987654321ABCD';

$config['enable_installer'] = true;

이제 database roundcube와 MySQL DB 사용자 roundcube를 만들어 준다.

mysql -u root -p 
[(none)] create database roundcube;
[(none)] use mysql;
[mysql] create user 'roundcube'@'localhost' identified by 'mytopsecret';
[myql] grant all privileges on roundcube.* to 'roundcube'@'localhost';
[mysql] flush privileges;
[mysql] exit

이렇게 한 다음에 마지막으로 http://my.domain/roundcube/installer 주소로 들어가서 지시하는 대로 설치를 한다. 설치를 마치면 /usr/local/www/roundcube/config/config.inc.php 에 있는 다음 줄을 주석처리한다.

#$config['enable_installer'] = true;

더 확실하게 하려면 설치 디렉토리를 삭제한다.

rm -rf /usr/local/www/roundcube/installer 

다음과 같은 로그인 화면을 http://my.domain/roundcube/에서 볼 수 있으면 성공한 것이다. ;#; screenhunter_1876_jan._09_15.12.jpg ;#;

2021/01/09 14:25

ProFTPD 1.3 설치

cd /usr/ports/ftp/proftpd
make config
make all install clean

설치한 다음에 나오는 중요한 정보

/usr/local/etc/proftpd.conf

요즘들어서는 ftp를 많이 쓰지 않지만, 서버를 관리하다 보면 필요할 때가 종종 있다. 하지만, 무명FTP는 가급적 꺼놓고, 접속할 수 있는 IP 주소를 지정하는 것이 좋다.

DefaultRoot ~ !wheel
<Limit LOGIN>
	Order deny,allow
	Allow from xy.164.125.218 # home
	Allow from wzy.113.254.11 # office
</Limit>

<IfModule mod_lang.c>
	#LangDefault ko_KR
	LangEngine on
	UseEncoding utf-8 utf-8
	LangPath /usr/share/locale
</IfModule>
2021/01/10 09:21

py-fail2ban 0.11 설치

cd /usr/ports/security/py-fail2ban
make config
make all install clean

설치한 다음에 나오는 중요한 정보

아래 설정은 https://phrye.com/tools/fail2ban-on-freebsd/를 보고 따라한 것이다.

먼저 /usr/local/etc/ipfw.rules 를 다음 내용으로 만들어 준다.

# Initial setting
/bin/sh /etc/rc.firewall open

# fail2ban IPs
if ! ipfw table 1 info > /dev/null 2>&1; then
  ipfw table 1 create
  ipfw table 1 flush
fi
ipfw add 1 deny ip from "table(1)" to me

그런 다음 /usr/local/etc/fail2ban/jail.local 를 만든다.

cd /usr/local/etc/fail2ban
cp -Rp jail.conf jail.local

jai.local 에 다음 내용을 확인한다.

[sshd]
enabled = true
mode = aggressive
action = ipfw-table[name=SSH,port=ssh,protocol=tcp]
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
findtime = 600
bantime = 3600

이제 /usr/local/etc/fail2ban/action.d/ipfw-table.local 을 다음과 같은 내용으로 만든다.

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = ipfw table 1 add <ip>
actionunban = ipfw table 1 delete <ip>

마지막으로 /etc/rc.conf 에 아래 명령어로 fail2ban과 방화벽에 관한 내용을 더한다.

sysrc fail2ban_enable="YES"
sysrc firewall_enable="YES"
sysrc firewall_type="OPEN"
sysrc firewall_script="/usr/local/etc/ipfw.rules"

이제 이 설정을 실행한다. 실행 전에, 방화벽 설정을 경험상 현재 접속한 계정에서 튕겨져 나가져 접속을 다시 못할 수도 있으니 설정에 주의에 주의를 요한다.

service ipfw start
service fail2ban start

마지막으로 제대로 설치되어 주어진 일을 하는지는 다음 명령어로 실행해서 알아볼 수 있다.

fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 9
|  |- Total failed:     9
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 3
   |- Total banned:     3
   `- Banned IP list:   207.119.191.239 71.221.84.13 75.170.123.224

그리고 ipfw show 에서 다음 줄이 보이연 제대로 작동하는 거다.

00001      0         0 deny ip from table(1) to me
2021/01/10 09:07

WordPress 5.5 설치

cd make all install clean
make config
make all install clean

설치한 다음에 나오는 중요한 정보

어쩌다보니 현재 직지서버는 개인적인 것과 원래 직지프로젝트 관련한 것들 포함해서 몇 개의 워드프레스가 돌아간다. 따라서 다수의 워드프레스 누리집을 돌리기 위한 설정을 해 줘야 하는데, 이건 설치한 후에 그 디렉토리를 다른 장소로 복사하는 것으로 시작한다.

site1/wp-config.php 설정

cp -Rp /usr/local/www/wordpress /other_directory/site1

그리고 설정 문서 만들어 용도에 맞게 설정하기.

cd /other_directory/site1
cp -Rp wp-config-sample.php wp-config.php

wp-config.php 에서 다음 내용을 확인

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wp_site1');

/** MySQL database username */
define('DB_USER', 'wp_site1');

/** MySQL database password */
define('DB_PASSWORD', 'mytopsecret1');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/**
 * 워드프레스 데이타베이스 문서 전치어.
 *
 * 아래 예를 든 대로 'wp_'를 사용하면 여러 워드프레스 사이트를 하나의 DB 처럼 관련할 수 있다.
 * 이름은 당연히 숫자, 글자, 그리고 밑줄(_)로만 구성되어 있어야 한다.
 */
$table_prefix  = 'wp_';

MySQL 자료광 설치

자료광은 Database를 나름 우리말로 풀어 써본 것으로, 이제 워드프레스를 사이트를 담아낼 자료광을 만들어 준다. 여기에서 보여주는 설치 순서, 즉 MySQL 자료광을 만들고, Apache 서버를 설정하고, 해당 서비스를 제공하는 가상서버에 접속하여 설정을 한 다음에, 보안 서버 인증을 받아 보안 서버로 변경 하는 것은 요즘 많은 패키지들을 설치하는 데 공통으로 쓰인다.

wp_site1 자료광 만들기
mysql -u root -p 
[(none)] create database wp_site1;
[(none)] use mysql;
[mysql] create user 'wp_site1'@'localhost' identified by 'mytopsecret1';
[myql] grant all privileges on wp_site1.* to 'wp_site1'@'localhost';
[mysql] flush privileges;
[mysql] exit

Apache 가상 서버 설정

httpd.conf 에 가상서버 설정을 더해주기

/usr/local/etc/apache24/httpd.conf 제일 마지막 부분에 다음 사항을 추가한다.

Include etc/apache24/vhosts/*.conf
/usr/local/etc/apache24/vhost 만들어주고, 그 안에 가상 서버 문서 설치
cd /usr/local/etc/apache24/
mkdir vhosts
cd vhosts
vi site1.conf 
site1.conf 설정하기

이 일을 시작하기 전에 funio.com 에서 site1 을 A domain 으로 더했다.

#####
# site1.my.domain;  
<VirtualHost *:80>
#    ServerName site1.my.domain
#    Redirect / https://site1.my.domain/
#</VirtualHost>

#<VirtualHost *:443>
    ServerAdmin webmaster@my.site
    DocumentRoot "/other_directory/site1"
    ServerName site1.my.domain
 
#    SSLEngine On
#    SSLCertificateFile "/usr/local/etc/letsencrypt/live/site1.my.domain/cert.pem"
#    SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/site1.my.domain/privkey.pem"
#    SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/site1.my.domain/fullchain.pem"

    <Directory "/other_directory/site1">
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
	<IfModule mod_rewrite.c>
	    RewriteEngine On
	    RewriteBase /
	    RewriteRule ^index\.php$ - [L]
	    RewriteCond %{REQUEST_FILENAME} !-f
	    RewriteCond %{REQUEST_FILENAME} !-d
	    RewriteRule ^(.*)$ /index.php/$1 [L]
	</IfModule>
	<IfModule mod_url.c>
	    CheckURL on
    	    ServerEncoding UTF-8
	</IfModule>
    </Directory>
</VirtualHost>

이제 아파치를 재기동 한다.

apachectl restart
http://site1.my.domain 접속해서 워드프레스 설치

이건 화면에서 보이는대로 따라하면 된다는^^.

https://site1.my.domain 설정

워드프레스 설치가 끝났으면 다음 명령을 실행해서 새로 만든 사이트를 보안접속할 수 있게 해줄 인증문서를 만든다.

certbot certonly --webroot -w /other_directory/site1 -d site1.my.domain

성공적으로 실행이 되었으면 Apache 서버 설정 문서를 다시변경한다. 기본적으로 위 설정문서에서 주석처리 했던 부분을 다시 살려 주는 거다.

https를 위해 site1.conf 새로 설정하기
#####
# site1.my.domain;  
<VirtualHost *:80>
    ServerName site1.my.domain
    Redirect / https://site1.my.domain/
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@my.site
    DocumentRoot "/other_directory/site1"
    ServerName site1.my.domain
 
    SSLEngine On
    SSLCertificateFile "/usr/local/etc/letsencrypt/live/site1.my.domain/cert.pem"
    SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/site1.my.domain/privkey.pem"
    SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/site1.my.domain/fullchain.pem"

    <Directory "/other_directory/site1">
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
	<IfModule mod_rewrite.c>
	    RewriteEngine On
	    RewriteBase /
	    RewriteRule ^index\.php$ - [L]
	    RewriteCond %{REQUEST_FILENAME} !-f
	    RewriteCond %{REQUEST_FILENAME} !-d
	    RewriteRule ^(.*)$ /index.php/$1 [L]
	</IfModule>
	<IfModule mod_url.c>
	    CheckURL on
    	    ServerEncoding UTF-8
	</IfModule>
    </Directory>
</VirtualHost>

Apache를 재기동 한다.

apachectl restart

이제 https://site1.my.domain에 접속해서 새로 만들어진 워드프레스 누리집을 즐긴다. 아래 접속 화면은 직지지기 날적이(일기장) 워드프레스 초기 화면인데, 워드프레스 자체도 여러가지 플러그인 설정을 해주어야 하는데, 이건 사용자가 자신이 원하는 것을 하나씩 배워나가면서 설치하는 게 어떨가 싶다. ;#; ;#;

2021/01/10 15:08

PhpMyAdmin 4.9 설치

cd /usr/ports/databases/phpmyadmin
make config
make all install clean

설치한 다음에 나오는 중요한 정보

이건 관리자용 연장이므로 접속하는 환경을 단속하는 것이 중요하다. 다음과 같은 문서를 /usr/local/etc/apache24/vhost/admin.conf 로 만들어 준다.

/usr/local/etc/apache24/vhost/admin.conf

설정 문서 중 일부 내용.

    Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"

    <Directory "/usr/local/www/phpMyAdmin/">
		Options None
		AllowOverride Limit

		Require local
		Require ip xy.225.181.63      # home
		Require ip xyz.164.119.217    # office
    </Directory>

apachectl restat 로 아파치 재기동 하고, https://my.domain/phpmyadmin 로 접속을 한다.

2021/01/10 10:52

Matomo 3.14 설치

cd /usr/ports/www/matomo/
make config
make all install clean

설치한 다음에 나오는 중요한 정보

이건 관리자용 연장이고, 특정 문서 사용자 접속 통계를 알려준다.

나는 보안에 민감한 편인데, 많은 사람들이 사회관계망에서 자기 정보를 그냥 넘겨주는 것을 잘 이해하지 못한다. 직지서버는 사용자들이 어떤 정보를 많이 찾는지, 어떤 검색을 하는지에 관심이 있고, 그 정보를 Google 같은 회사를 이용하지 않고 자제척으로 얻고 싶어서 이 연장을 설치한다. Matomo 는 다음과 같은 정보를 수집한다고 한다.

User IP address (see also: IP anonymisation)
Date and time of the request
Title of the page being viewed (Page Title)
URL of the page being viewed (Page URL)
URL of the page that was viewed prior to the current page (Referrer URL)
Screen resolution being used
Time in local user’s timezone
Files that were clicked and downloaded (Download)
Links to an outside domain that were clicked (Outlink)
Pages generation time (the time it takes for webpages to be generated by the webserver and then downloaded by the user: Page speed)
Location of the user: country, region, city, approximate latitude and longitude (Geolocation)
Main Language of the browser being used (Accept-Language header)
User Agent of the browser being used (User-Agent header)

How should I write my privacy notice for Matomo Analytics under GDPR?, 그리고 How to not process any personally identifiable information (PII) with Matomo, and what it means for you에 의거해서 직지서버에서 돌아가는 Matomo는 법적 고지를 하지 않아도 되도록 설정을 했다. 즉, 민감한 개인 정보를 처리하지 않는다.

마토모에 접속하기 위해서는 다음과 같은 내용을 /usr/local/etc/apache24/vhost/admin.conf 로 만들어 준다. /usr/local/etc/apache24/vhost/admin.conf 설정 문서 중 일부 내용.

	Alias /matomo /usr/local/www/matomo/
	#
	# chmod +w /usr/local/www/matomo/matomo.js
	# chown www:www /usr/local/www/matomo/matomo.js

	AcceptPathInfo On
	<Directory /usr/local/www/matomo>
		AllowOverride None
		Options Indexes FollowSymLinks
	</Directory>

apachectl restat 로 아파치 재기동 하고, https://my.domain/matomo로 접속을 한다.

2021/01/10 11:29

Piwigo 2.10 설치

cd /usr/ports/www/piwigo/
make config
make all install clean

설치한 다음에 나오는 중요한 정보

이 설정은 사실 워드프레스 설치의 반복이므로 자세한 설명은 생략한다.

아이들 어릴 때 사진 찍는 거에서 시작을 해서 방대한 양의 사진이 있고, 아이들이 이 사진들을 보면서 본인들의 기억을 환기하고는 하는데, 한 때에는 구글포토를 쓰다가 이건 어느 순간부터 안쓰기 시작했고[(사실 이제 나는 구글을 경계한다.)], 언제부터인가는 iCloud 를 사용하고 있는데[(Apple이 제공하는 이 서비스에 대해서는 심경이 사실 복잡한데, Apple이 닫혀있는 운영체제라고 생각하기에 애초부터 안썼기 때문인데, 최근들어 '닫혀있음이 주는 열려있음' 또 다른 자유의 하나로 느끼고 어릴적부터 가졌던 Apple에 대한 반감을 내려놓았다. 이제 Apple iPhone을 쓰는 처지에 별 수 없는 상황이 되었지만, 태생적으로 어디에 의존하는 거 안 좋아하기에 내가 만든 서버에서 모든 것을 다 해결하려고 한다.)], 아이들과 함께 같이 쓰기는 하지만, 한 달에 그냥 9.99 유로를 지불하고 있고, Apple로 하여금 기계어 연습을 하는 자료를 제공하고 있다는 느낌을 지울 수 없다.

지난 연말부터 시작한 서버이전의 한 응용으로 이 사진첩을 성공적으로 설치했고, 이를 통해 2021년 1월 말부터 iCloud는 2TB에서 50GB 용량으로 강등했다. 이로써 한 달에 9유로를 절약할 수 있게 되었고, 이 정도 액수면 전자책 한 권 정도를 매월 새로 살 수 있는 액수다^^a. 올 초부터 사진을 새로 이 사진첩 누리집에 열심히 올리고 있는데, 2000부터의 사진을 올리는 중이고, 1월 10일 현재 2010년 사진을 올리고 있다. 동시에 iCloud에서는 사진들을 지우고 있다.

사족이지만, 난 2004년 정도인가, 집에 있는 PC 한 대가 날라갔었다. 물론 중요한 문서들은 복사본이 늘 있지만, 그 때 그 해에 찍어서 복사본을 채 만들지 않는 많은 사진들을 통채로 날린 기억이 있다. 정말 눈물이 핑 돌았고, 자료 복구회사에 돈을 주고라도 살리고 싶었지만, 복구하지 못할 시에도 책임은 없고, 돈은 돌려주지 않는다는 조건에 눈물을 머금고 셋째 출생과 백일사진이 담겨 있던 그 해 사진을 보내야만 했었다. 출생사진과 백일 사진이 없지는 않은데, 그건 그나마 서버에 올렸던 사진들이었다.

그 이후로는 복사본을 만들고, 서버에도 올리고 하면서 추억을 담고 있는 사진은 이중, 삼중으로 보관을 한다. 세상이 하도 많이 바뀌어서 집에 보관하는 것보다 서버(요즘은 클라우딩이라고들 많이 한다)에 올리는 게 더 자료보관에 안정감을 주는 세상이 되었는데, 개인이 돌리는 서버라고 해서 그 안정감을 주지 못하는 건 아니다.

내 나이 이제 오 십이 넘었고, 나 죽어 내가 남긴 자료는 구굴이나 페이스북, 애플이 가지고 있는 것보다 내가 운영했던 서버에 남겨지기를 더 바라고, 내 아이들이 그 필요성을 보면 화석화한 모습으로나마 서버유지 비용이을 내면서 유지를 할 것이고, 그럴 필요가 없다면 이 또한 사라질 것이다. 그게 더 자연스럽고, 자연의 모습에 가깝다고 느낀다.

2021/01/10 12:19

ownCloud 10.6 설치

cd /usr/ports/www/owncloud/
make config
make all install clean

설치한 다음에 나오는 중요한 정보

이 패키지는 사실 원래 설치 계획에 없었던 것인데, Nextcloud가 한 번에 제대로 설치가 되지 않았을 뿐 아니라, 검색을 하면 보통 쉽게 문제가 풀릴 수도 있는데 이번에는 그렇지가 않아서 차선책으로 설치를 했다. OwnCloud가 놀랍게도 한 번에 바로 설치가 되어서 그냥 이 패키지를 개인 클라우드로 쓰기로 한다.

설치 방식은 워드프레스 설치하는 것과 동일하다. 가상서버를 이용해서 https://owncloud.my.site로 접속하고, 실제로 클라우드는 이동통신기 단말기에서 주로 쓰기 때문에 가족들에게 계정을 만들어 주고 일인 당 256GB를 쓸 수 있게 설정을 해 주었다.

설치 후 처음 접속에 다음 화면이 보이면 성공한 거다. ;#; ;#;

그런 다음에 이동통신 단말기에서 ownCloud 앱을 찾아 설치한 다음에 새로 만든 사용자 계정정보로 접속해서 사용한다.

데스크탑에서도 데스크탑 앱 설치하기에서 보이는 대로 앱을 깔아서 쓸 수 있는데, 현재까지 사용해본 바로는 개인/가족 저장 공간으로 쓰기에는 아주 대 만족이다.

2021/01/10 15:17

Nextcloud 20.0 설치 - 안했다!

cd /usr/ports/www/nextcloud
make config
make all install clean

설치한 다음에 나오는 중요한 정보

이 패키지를 설치하고 나서 제일 처음 만난 오류는 ERR_TOO_MANY_REDIRECTS. 이 문제는 구글 검색으로 https://help.nextcloud.com/t/err-too-many-redirects-20-0-3-to-20-0-4/101930/21 같은 정보를 봐도 잘 못풀겠고, 지금은 어서 찾았는지도 모르지만, 다음 설정을 아파치 설정 문서에 넣으줘서 문제를 해결했다.

Header edit Set-Cookie ^(.*)$ "$1; HttpOnly; Secure; SameSite=None" 

하지만, 이 이후에도 접속이 안되어서 아래 명령어로 관리자 비밀번호까지 바꾸어주었는데도 계속해서 인식하지 못하는 사용자라고 해서 결국 설치 포기.

$ sudo -u www php /var/www/nextcloud/occ user:resetpassword admin
Enter a new password:
Confirm the new password:
Successfully reset password for admin
2021/01/07 22:55

Jupyter 설치하기

https://jupyter.org/, https://jupyter-notebook.readthedocs.io/en/stable/public_server.html, https://www.cl.cam.ac.uk/teaching/1617/L41/2016-2017-l41-labsetup.pdf, 그리고 https://project.altservice.com/journals/diff/3768?detail_id=5595 를 바탕으로 설치했다.

이건 어느 날 하루 반도체 소자 공부하다가 수식적인 것이 필요해서 장난한 번 처볼까 하고 설치한다.

cd /usr/ports/www/py-notebook
make config
make all install clean

이건 다른 패키지와 달리 설치후에 “어찌 어찌 했다”, 또는 “뭐 해라”, 이런 말이 없다. 암튼 Unix/Linux 쓰는 사람들은 좀 까칠한(?) 데가 있다니까는. 검색해서 찾은 설명서에서 일러주는 대로 다음과 같이 했다.

pw add user -n jupyter -m -s /bin/sh -c "Jupyter Notebook"
su jupyter
$ jupyter notebook --generate-config
$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /home/you/.jupyter/jupyter_notebook_config.json

/home/jupyter/.jupyter/jupyter_notebook_config.py 에서 다음 사항을 확인했다. 비밀번호는 위에서 만들어진jupyter_notebook_config.json 에서 “p=” 다음에 있는 정보를 이 설정문서 “sha1:” 다음에 넣어주었다.

c.NotebookApp.ip ='*'
c.NotebookApp.open_browser = False
c.NotebookApp.notebook_dir = '/tmp'
c.NotebookApp.port = 8888
c.NotebookApp.password = u'sha1:****'
c.NotebookApp.allow_password_change = False
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
c.NotebookApp.keyfile = u'/absolute/path/to/your/certificate/mykey.key'

그런 /usr/local/etc/rc.d/jypyter 를 다음과 같은 내용으로 만들었다.

#!/bin/sh
#
# PROVIDE: jupyter
# REQUIRE: LOGIN
#
# Add the following lines to /etc/rc.conf to enable jupyter notebook server
#
#
# jupyter_enable (bool): Set to "NO" by default,
# Set it to "YES" to enable jupyter notebook server

. /etc/rc.subr

name=jupyter
command=/usr/local/bin/jupyter
rcvar=jupyter_enable

load_rc_config $name

jupyter_enable="${jupyter_enable-"NO"}"
jupyter_user="${jupyter_user-"jupyter"}"
jupyter_pidfile="${jupyter_pidfile:-"/var/run/jupyter/jupyter.pid"}"

# /etc/rc.subr use $pidfile (not ${name}_pidfile)
pidfile="${jupyter_pidfile}"

start_cmd="su - ${jupyter_user} -c '${command} notebook' &"
stop_cmd="${name}_stop"
status_cmd="${name}_status"
getval_cmd="${name}_getval"

jupyter_stop()
{
jupyter_pid=$(pgrep -f "jupyter-notebook")

echo "Stopping ${name}."
kill -s TERM "$(cat "${jupyter_pidfile}")"

echo "Stopping ${name}."
kill -s TERM "${jupyter_pid}"

rm ${jupyter_pidfile}
}

jupyter_status()
{
# Try its best to find the service's status
if [ -f "${jupyter_pidfile}" ]
then
jupyter_pid="$(cat "${jupyter_pidfile}")"
fi

if [ -z "${jupyter_pid}" ]
then
jupyter_pid=$(pgrep -f "jupyter-notebook")
[ -n "${jupyter_pid}" ] && echo "${jupyter_pid}" > "${jupyter_pidfile}"
fi

if [ -n "${jupyter_pid}" ]
then
echo "${name} running with pid: $jupyter_pid"
else
echo "${name} not running? (pid not found)"
fi
}

command_args=" >/dev/null 2>&1 &"

load_rc_config $name
run_rc_command "$1"

그런 다음에 프로그램이 돌아가고 있다는 사실을 기록하는 폴더 만들어 주고, 위에서 만든 스크립트는 실행가능하게 한다.

mkdir /var/run/jupyter
chown jupyter /var/run/jupyter
chmod +x /usr/local/etc/rc.d/jupyter

이제 /etc/rc.conf 에 Jypyter 를 실행할 것이라는 것을 설정한다.

sysrc jupyter_enable=YES

그리고 나서 다음을 실행한다.

service jupyter start

http://my.domain:8888/ 에 접속하면 된다.

2021/01/21 08:11 · minsookim

Jupyterhub 설치하기

이건 FreeBSD port가 따로 없기 때문에 다음의 과정을 통해서 설치했다.

cd /usr/ports/devel/py-pip
make config
make all install clean

cd /usr/ports/www/node
make config
make all install clean

cd /usr/ports/www/nmp
make config
make all install clean

pip install jupyterhub jupyterlab
pip install ipywidgets
npm install -g configurable-http-proxy
cd /usr/ports/math/py-matplotlib 
make config
make all install clean
pip install schrodinger
/usr/ports/multimedia/py-ffmpeg-python
make config
make all install clean
pip install ase f90wrap
cd /usr/ports/devel/git
make config
make all install clean

pip install qutip

설치 후에 https://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb에서 알려주는 대로 따라한 첫 화면. 작동한다!

2021/01/28 16:18 · minsookim

늘상 하는 법적 고지

  • 여기에서 사용한 그림, 특히 FreeBSD 로고는 다음 문장에 의거하여 사용하였다.

Any individual, organization, or company may, without explicit permission from the Foundation, use the FreeBSD Marks to show support for the Project or as part of a notice to users that a product incorporates the FreeBSD operating system. Trademark Usage Terms and Conditions

  • Matomo;마토모는 특정 누리집을 방문하는 기록을 분석하는 도구인데, General Data Protection Regulation (GDPR)같이 국제법이 정하는 바에 따른 민감한 개인 정보를 처리 않도록 설정을 바꾸었기에 이 글을 포함한 누리집을 포함해서 다른 직지 누리집을 방문하는 사용자에에게 알리거나 허락을 요구하지 않아도 된다. 하지만, 직지지기 김민수 스스로가 개인 정보 보호에 무척이나 민감하고, 사회관계망에서 상품 그림 하나 봤다고 나랑 연동된 거의 모든 계좌에서 그 그림에 관련된 광고가 동시 다발적으로 뜨는 것을 경험하고 나서 “이건 해도 해도 너무 하지 않냐”, 를 몇 번이나 되네이며 사회관계망 계좌를 열고 닫기를 몇 번이나 한 경험 상[(2021년 1월부터 이통기기에서 Facebook 앱을 지웠다. 우연인지 모르겠지만, 그 이후에 12월에 나왔다는 Facebook is a doomsday machine(페이스북은 지구 최후의 날의 기계)이라는 제목의 기사를 Audm을 통해서 들었다. 내가 앱을 삭제한 것에 더욱 더 큰 힘을 실어준다.)], 내가 운영하는 서버에서 미래 자료를 보다 가치있게 만들기 위해서 이렇게 수동적으로 관찰하는 것도 방문자에게 알려주지 않으면 안 될 거 같다. 직지서버가 이처럼 방문자 개인 정보보호에 애쓰고, 무명화해서 처리하는 자료조차 싫다면 직지누리집(jikji.org/jikji.net/jiji.in) 전체를 방문하지 않으면 된다. 사실 표면에 보이는 정보는 이제 그렇게 많지도 않다.
2021/01/10 14:27
freebsd/start.txt · 마지막으로 수정됨: 2021/02/02 11:30 저자 minsookim