자동 설치

자동 방식: 개인 계정에서 실행하는 스크립트 하나가 서버 전체(Apache + PHP 웹 스택, 데이터베이스, 보안 도구, cron)를 준비합니다. 이후에는 패널을 배포하고 SSL을 발급한 뒤 라이선스를 입력하면 됩니다. Ubuntu/Debian에서 동작합니다. 새 VPS에서는 모든 것을 처음부터 구성하고, 이미 구성된 서버에서는 추가 작업만 수행합니다(“구성된 서버” 프로필, 01단계). 아래 명령은 순서대로이니, 위에서 아래로 그대로 따라가기만 하면 됩니다. 새 VPS에서는 모든 단계를 차례로 그대로 적용할 수 있습니다. 서버가 이미 구성되어 있거나 호스팅 패널이 설치되어 있다면, 스크립트는 일부 작업을 의도적으로 사용자에게 남겨 둡니다 — 어떤 작업인지는 실행이 끝날 때 출력에 표시됩니다(출력 해석은 01단계 참조).

명령에 들어 있는 예시 자리표시자 값을 자신의 값으로 바꾸세요. monitor.example.com — 사용자의 도메인, 203.0.113.10 — 서버의 실제 IP, /var/www/monitor — 패널 루트(public/, assets/, config.php가 위치한 곳), DB 비밀번호는 직접 정하세요.
전체 세트(“완전 보호”)는 새 VPS를 대상으로 합니다. 깨끗한 Ubuntu/Debian에서는 보안 시스템을 처음부터 구성합니다 — Fail2ban(jail.local), root-crontab, UFW 규칙, Apache 설정. 서버가 이미 구성되어 있다면(운영 중인 패널, 사이트, 메일, 자체 jail) — “구성된 서버” 프로필을 선택하세요. 이 프로필은 추가 변경만 하며 방화벽, Fail2ban, 메일, SSH, sysctl은 건드리지 않습니다. 호스팅 패널이 감지되면 스크립트가 자동으로 이 모드로 전환됩니다. 첫 실행 전에 드라이 런(계정 내 체크박스)을 켜면 아무것도 변경하지 않고 어떤 작업이 수행될지 보여줍니다. 운영 서버에서는 만약을 위해 스냅샷을 만들어 두세요.

01. 개인 계정에서 받는 자동 설정 명령어

명령어는 본인 개인 계정 my.arciveo.com → “서버 설정” 섹션에서 받습니다(Arcivéo Security Monitor 등록 후 이용 가능). 이 명령어는 계정에 연결되어 있으며 개인 토큰이 포함됩니다.

스크립트가 서버 전체를 준비합니다: 웹 스택(Apache + PHP), 데이터베이스, SSL 도구, 전체 보안 도구 모음 및 cron 작업(Lynis, SMART, debsums, Logwatch, 일일 리포트, ipsum 업데이트).

1) 보안 수준을 선택하세요(명령어를 복사하기 전에 계정에서):

  • 완전 보호(권장) — UFW(방화벽), Fail2ban, CrowdSec + bouncer, ipsum(IP 차단 목록), Suricata(IDS/IPS), Falco, ModSecurity + OWASP CRS(WAF), PSAD, mod_evasive(안티 DoS), AIDE(파일 무결성), debsums, ClamAV + maldet(안티바이러스), Auditd, AppArmor, Monit, Lynis(감사), Logwatch, 자동 보안 업데이트.
  • 경량 — RAM 용량이 적은 VPS용: 무거운 구성 요소를 뺀 기본 모음.
  • 구성된 서버(호스팅 패널) — 패널(HestiaCP 등), 사이트, 메일이 이미 운영 중인 서버용: 추가적인 변경만 수행하며(도구 추가 설치, cron, sudo 규칙), 방화벽, Fail2ban, 메일, SSH, sysctl은 그대로 유지됩니다. 패널이 있는 서버에서는 스크립트가 이 모드를 자동으로 선택합니다.
드라이 런. 계정에서 “드라이 런”을 체크하면, 명령어가 스크립트가 설치·변경할 내용만 보여 주고 아무것도 건드리지 않은 채 종료됩니다. 이미 구성된 서버에서 유용합니다: 먼저 드라이 런, 이후 체크 없이 실제 실행.

2) 서버에서 root 권한으로 계정의 명령어를 실행하세요 — 형식은 다음과 같습니다:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN" | sudo bash
명령어는 계정에 연결되어 있으므로 비밀로 유지하세요. 링크는 유효 기간이 제한되어 있으며, 만료된 경우 계정에서 “새 링크 받기”를 누르세요.
자동 설정 후 웹 서버는 Apache + PHP-FPM이며, 보안 도구와 cron 작업은 이미 설치되어 기본 상태로 작동합니다.

3) 마지막 출력을 읽어 보세요 — 사용자가 직접 해야 할 작업이 거기에 적혀 있습니다. 스크립트는 점검 블록과 “다음 단계 — 패널 설치” 목록을 출력하며 작업을 마칩니다. 일부 단계는 의도적으로 수행하지 않습니다. 어떤 단계인지는 선택한 프로필과 서버에서 발견된 환경에 따라 달라집니다. 아래 목록과 대조하여, 자신의 출력에 나타난 줄에 해당하는 항목만 수행하면 됩니다.

  • Control panel detected (…) — 사이트는 호스팅 패널 자체 기능으로 생성되며, 스크립트는 vhost를 만들지 않습니다. 03단계의 “호스팅 패널이 있는 서버” 갈래를 보세요.
  • No vhost created (no domain given) — 도메인이 없는 “구성된 서버” 프로필입니다. 이름 없는 vhost는 기본 사이트가 되어 사용자의 다른 사이트 요청까지 가로채므로 생성하지 않았습니다. 03단계의 “vhost 직접 만들기” 갈래를 보세요.
  • sudo rules NOT written — 스크립트가 패널이 어떤 계정으로 동작하는지 판별하지 못했습니다. 이는 흔한 상황입니다: 패널 파일은 자동 설정 이후에 업로드되므로 그 시점에는 판별할 근거가 없었습니다. 이 규칙이 없으면 모듈이 시스템 데이터를 볼 수 없습니다. 04단계의 “웹 서버용 sudo” 블록을 보세요.
  • ! Nginx does not read .htaccess — Apache 앞에 Nginx가 있으며, 차단 설정을 그 구성 파일에 자동으로 기록하지 못했습니다. 반드시 직접 처리하세요. 그러지 않으면 data/, keys/, database/, config.php가 .htaccess를 우회하여 외부에 노출됩니다. 03단계의 “Apache 앞에 Nginx가 있는 경우” 블록을 보세요.
  • UFW installed but inactive — 방화벽이 설치되었지만 꺼져 있습니다. 구성된 서버에서는 접속이 끊기지 않도록 스크립트가 직접 켜지 않습니다. 자신의 SSH 포트를 반드시 허용한 뒤 직접 켜세요:
    sudo ufw allow OpenSSH # 비표준 SSH 포트인 경우: sudo ufw allow 2222/tcp sudo ufw allow 80,443/tcp sudo ufw enable
  • Fail2ban installed but not running — 다음으로 시작하세요: sudo systemctl enable --now fail2ban.
  • Database server present … but not running — 04단계 전에 DBMS를 시작하세요: sudo systemctl enable --now mariadb(또는 설치된 것에 따라 mysql).
  • Certbot skipped — issue SSL in … — 인증서는 호스팅 패널의 Let's Encrypt 스위치로 발급됩니다. 06단계는 필요하지 않습니다.
점검 블록에 문제가 없다면 마지막 줄은 All checks passed입니다. !가 붙은 항목은 확인이 필요하며, 자세한 내용은 로그에 기록됩니다. 로그 경로는 스크립트가 맨 마지막에 출력합니다(Log: …).

02. 도메인 및 DNS

monitor.example.com 같은 주소로 대시보드를 열고 무료 SSL을 받으려면 도메인이 서버를 가리켜야 합니다. DNS 관리 패널(등록기관 또는 호스팅 업체)에서 A 레코드를 생성하세요:

유형: A 이름: monitor (서브도메인 → monitor.example.com) 또는 @ (도메인 루트 → example.com) 값: 203.0.113.10 ← 서버의 IP TTL: 3600

몇 분 후(때로는 최대 한 시간) 도메인이 서버를 가리키는지 확인하세요:

dig +short monitor.example.com # 서버의 IP가 반환되어야 합니다 # 또는 dig가 없으면: getent hosts monitor.example.com
SSL 인증서(6단계)는 도메인에 대해서만 발급되므로, 인증서 발급 전에 DNS가 서버를 가리키고 있어야 합니다.

03. 패널 파일 업로드

일반적인 경우(새 VPS). 자동 설정이 이미 패널 디렉터리 /var/www/monitor를 생성하고 Apache 사이트를 구성했습니다(DocumentRoot는 패널 루트로, PHP-FPM, .htaccess용 AllowOverride). 스크립트 출력에서는 vhost … → DocumentRoot … 줄이 이에 해당합니다. 디렉터리와 vhost를 따로 만들 필요 없이 파일만 업로드하고 권한을 설정하면 됩니다.
vhost가 생성되지 않는 두 가지 경우가 있으며, 스크립트가 작업 종료 시 이를 명시적으로 알려 줍니다. 이 경우에는 먼저 아래의 해당 갈래를 수행한 뒤에 파일을 업로드하세요.

“호스팅 패널이 있는 서버” 갈래(출력: Control panel detected (…)). 이런 서버에서는 사이트를 패널이 관리하므로 스크립트는 자체 vhost를 의도적으로 만들지 않습니다. 만들더라도 패널이 설정을 다시 생성할 때 곧바로 덮어써지기 때문입니다. 순서는 다음과 같습니다:

  1. 호스팅 패널(HestiaCP 등)에서 웹 도메인을 생성하세요 — 패널의 DocumentRoot는 그대로 둡니다.
  2. 배포 파일을 해당 도메인의 public_html에 통째로 업로드하세요. index.php, api/, assets/와 함께 서비스용 config.php, includes/, data/, tmp/, logs/, keys/, cron/, database/도 같이 있어야 합니다. 웹 루트 밖으로 옮길 필요는 없습니다. 서비스용 폴더는 배포판에 포함된 .htaccess로 차단되며, Nginx 환경에서는 스크립트가 도메인 설정에 기록한 차단 규칙으로 보호됩니다.
  3. SSL은 패널 자체의 Let's Encrypt 스위치로 발급됩니다 — 06단계는 건너뛰세요.
  4. 이후에는 권한(이 단계 아래), 데이터베이스(04단계), config.php(05단계)를 진행합니다. 명령의 경로는 /home/계정/web/도메인/public_html로, 소유자는 www-data 대신 해당 도메인의 사용자로 바꾸세요.

“vhost 직접 만들기” 갈래(출력: No vhost created (no domain given)). 이는 도메인을 전달하지 않은 “구성된 서버” 프로필에서만 발생합니다. 가장 간단한 방법은 도메인을 지정하여 계정의 명령을 다시 실행하는 것입니다:

curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo bash -s -- monitor.example.com

재실행은 안전합니다: 이미 수행된 작업은 중복되지 않습니다. vhost를 직접 만들어야 한다면, 설치 스크립트가 기록하는 것과 동일한 설정은 다음과 같습니다:

sudo mkdir -p /var/www/monitor # PHP-FPM 소켓은 자동으로 판별합니다 — 서버마다 PHP 버전이 다릅니다. PHPSOCK=$(ls -1 /run/php/php*-fpm.sock 2>/dev/null | head -1) sudo tee /etc/apache2/sites-available/arciveo-monitor.conf > /dev/null <<'EOF' <VirtualHost *:80> ServerName monitor.example.com DocumentRoot /var/www/monitor <Directory /var/www/monitor> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch "\.php$"> SetHandler "proxy:unix:__PHPSOCK__|fcgi://localhost" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/arciveo-monitor_error.log CustomLog ${APACHE_LOG_DIR}/arciveo-monitor_requests.log combined </VirtualHost> EOF sudo sed -i "s#__PHPSOCK__#${PHPSOCK}#" /etc/apache2/sites-available/arciveo-monitor.conf sudo a2ensite arciveo-monitor.conf sudo apache2ctl configtest sudo systemctl reload apache2
여기서 ServerName은 필수입니다. 이름이 없는 vhost는 Apache의 기본 사이트가 되어 같은 서버의 다른 도메인 요청까지 처리하게 됩니다. 같은 이유로 구성된 서버에서는 000-default.conf를 비활성화하지 마세요. 이 사이트는 누군가의 운영 사이트로 개조되어 있을 수 있습니다. 새 VPS에서는 설치 스크립트가 알아서 제거하므로 여기서는 손댈 필요가 없습니다.
Apache 앞에 Nginx가 있는 경우(출력: ! Nginx does not read .htaccess). Nginx는 정적 파일을 디스크에서 바로 내보내며 .htaccess를 읽지 않습니다. Apache가 올바르게 차단하더라도 서비스용 폴더가 외부에 노출됩니다. 스크립트가 차단 규칙 파일을 미리 준비해 두었으니, 해당 사이트의 server{} 블록에 이를 포함시키고 Nginx를 다시 로드하세요:
include /etc/nginx/snippets/arciveo-deny.conf;
sudo nginx -t && sudo systemctl reload nginx # 확인: 파일 내용이 아니라 403이 반환되어야 합니다 curl -sI https://monitor.example.com/config.php | head -1
패널 파일(배포 아카이브)은 구매 후 개인 계정 my.arciveo.com → “다운로드”에서 받을 수 있습니다. 서버에 올리기 전에 아카이브를 압축 해제하세요.

배포 파일의 내용을 /var/www/monitor에 업로드하세요(내부에 public/, assets/, config.php 등이 위치하도록) — SFTP/SCP(FileZilla / WinSCP)로 하거나 로컬 컴퓨터에서 scp 명령으로 업로드합니다:

scp -r ./monitor/* deploy@203.0.113.10:/var/www/monitor/
vhost에 도메인(ServerName)을 바로 기록하려면 01단계의 자동 설정 명령에 도메인을 전달합니다: … | sudo bash -s -- monitor.example.com (또는 개인 계정의 “패널 도메인” 필드에 도메인을 입력). 도메인을 전달하지 않으면 패널은 모든 호스트와 IP에 응답하며, SSL 발급 시(06단계) certbot이 ServerName을 기록합니다. 다시 설치할 필요는 없습니다.
파일 권한을 설정하세요 — 필수 단계입니다. root로 올렸거나 SFTP로 업로드했다면 파일 소유자가 root여서 웹 서버(www-data)가 읽을 수 없고, 패널이 빈 화면이나 403 오류로 열립니다(로그: .htaccess unreadable / directory not executable). 아래 명령으로 해결됩니다:
# 웹루트 전체의 권한을 정규화합니다: root가 만든 디렉터리는 # 웹 서버(www-data)가 접근할 수 없어 — 이 조치 없이는 패널이 빈 페이지나 403을 반환합니다. cd /var/www/monitor # 작업 폴더는 chown 이전에 생성합니다 — 그렇지 않으면 새 디렉터리가 root:root로 남고 # chmod 750에서 웹 서버(www-data)가 쓸 수 없습니다. sudo mkdir -p data/lynis data/logwatch tmp logs sudo chown -R www-data:www-data /var/www/monitor sudo find /var/www/monitor -type d -exec chmod 755 {} \; sudo find /var/www/monitor -type f -exec chmod 644 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 750 data tmp logs

SFTP 업로드 권한을 본인에게 열어 주세요. 위 명령 이후 모든 파일의 소유자는 www-data인데, FileZilla / WinSCP는 본인 계정으로 접속하므로 업로드가 SSH_FX_PERMISSION_DENIED(Permission denied)로 실패합니다. 두 가지 방법 중 하나를 선택하세요.

방법 A — 본인 계정에만 ACL 부여(권장). 쓰기 권한은 본인만 갖고, 웹 서버는 여전히 패널 코드를 덮어쓸 수 없습니다:

sudo apt install -y acl # 패널 디렉터리 전체에 대한 본인 계정의 쓰기 권한: sudo setfacl -R -m u:deploy:rwX /var/www/monitor # 같은 규칙을 기본값으로 — 이후에 생성되는 파일과 폴더에 적용: sudo setfacl -R -d -m u:deploy:rwX /var/www/monitor

방법 B — www-data 그룹을 통해. 더 간단하지만 패널 파일에 대한 쓰기 권한을 웹 서버도 갖게 됩니다. PHP에 취약점이 생기면 코드가 교체될 수 있습니다. 명령 순서가 중요합니다 — config.php와 작업 폴더는 마지막에 잠급니다:

sudo usermod -aG www-data deploy # 그룹 쓰기 권한 + setgid(2 비트): SFTP로 올린 파일이 www-data 그룹에 # 남습니다 — 그렇지 않으면 패널이 파일을 덮어쓸 수 없습니다. sudo find /var/www/monitor -type d -exec chmod 2775 {} \; sudo find /var/www/monitor -type f -exec chmod 664 {} \; sudo chmod 640 /var/www/monitor/config.php sudo chmod 2750 /var/www/monitor/data /var/www/monitor/tmp /var/www/monitor/logs
방법 B 이후에는 FileZilla에서 다시 연결하세요(서버 → 연결 끊기, 그다음 다시 로그인). 새 그룹은 새로 로그인할 때만 적용되며, 그전까지는 여전히 권한이 없습니다. 확인: id deploy — 그룹 목록에 www-data가 나타나야 합니다. ls -ld /var/www/monitor — 권한 drwxrwsr-x이며, x 대신 s는 setgid가 설정되었다는 뜻입니다.

04. 데이터베이스

데이터베이스와 사용자를 생성한 뒤 스키마를 가져옵니다. DB 블록은 터미널에 통째로 붙여 넣으세요 (sudo mysql은 unix 소켓으로 root 로그인하므로 root 비밀번호가 필요 없습니다). monitor_db와 monitor_user는 예시 이름이며 원하는 대로 지정할 수 있습니다. 데이터베이스 이름, 사용자, 비밀번호를 기억해 두었다가 다음 단계에서 config.php에 입력하세요:

# 1. 데이터베이스. 데이터베이스 이름, 사용자, 비밀번호는 아래에서 한 번만 지정하면 모든 줄에 대입됩니다. # 블록은 터미널에 통째로 붙여 넣으세요; sudo mysql은 unix 소켓으로 root 로그인합니다 # (root 비밀번호 불필요). 대화형 `sudo mysql -u root -p`를 복사·붙여넣기로 # 사용하지 마세요 — 붙여 넣을 때 SQL 줄이 비밀번호 입력으로 넘어가 사라집니다. DBNAME='monitor_db' # ← 데이터베이스 이름, 그대로 둬도 됨 DBUSER='monitor_user' # ← 데이터베이스 사용자, 그대로 둬도 됨 DBPASS='CHOOSE_A_PASSWORD' # ← 비밀번호, 직접 지정 sudo mysql <<SQL CREATE DATABASE IF NOT EXISTS $DBNAME CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS '$DBUSER'@'localhost' IDENTIFIED BY '$DBPASS'; GRANT ALL ON $DBNAME.* TO '$DBUSER'@'localhost'; FLUSH PRIVILEGES; SQL # 확인 ($DBNAME가 표시되어야 함): mysql -u "$DBUSER" -p"$DBPASS" -e "SHOW DATABASES;" # 이 세 값을 config.php → DB_NAME, DB_USER, DB_PASS에 입력하세요.
보통은 스키마를 가져올 필요가 없습니다 — DB가 비어 있으면 브라우저에서 처음 접속할 때 패널이 (database/db.sql에서) 테이블과 admin 계정을 자동으로 생성합니다.

테이블이 생성되지 않았다면(패널이 DB 연결 오류를 표시하거나 로그인 폼 대신 빈 화면이 나오는 경우) 스키마를 직접 가져오세요. 명령은 패널 루트에서 실행하며, 값은 위 블록에서 가져옵니다:

# 스키마 가져오기: cd /var/www/monitor && mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" < database/db.sql # 확인 — 테이블 목록이 표시되어야 합니다: mysql -u "$DBUSER" -p"$DBPASS" "$DBNAME" -e "SHOW TABLES;"
$DBNAME / $DBUSER / $DBPASS 변수가 이미 사라졌다면(터미널 세션이 새로 시작된 경우) 명령에 값을 직접 넣거나, 위 블록의 같은 세 줄로 변수를 다시 지정하세요.
웹 서버용 sudo. 보통은 자동 설정이 규칙을 이미 기록해 두므로 모듈이 시스템 데이터를 즉시 확인합니다. 다만 스크립트 출력에 sudo rules NOT written 줄이 있었다면, 패널 계정을 판별할 근거가 없었으므로(파일이 아직 업로드되지 않은 상태) 규칙이 생성되지 않았습니다. 이 규칙이 없으면 방화벽, Fail2ban, CrowdSec 같은 섹션이 비어 있게 됩니다. 이제 파일이 제자리에 있으니, 계정을 명시하여 계정의 명령을 다시 실행하세요:
curl -fsSL "https://my.arciveo.com/install.php?token=YOUR_TOKEN&profile=existing" | sudo ARCIVEO_USER=www-data bash -s -- monitor.example.com
www-data는 해당 사이트의 PHP가 실행되는 사용자로 바꾸세요(호스팅 패널에서는 보통 도메인 소유자입니다). 다음과 같이 확인할 수 있습니다:
ps -o user= -C php-fpm8.3 | sort -u # 버전은 자신의 환경에 맞게 바꾸세요 # 또는: ps aux | grep -m3 '[p]hp-fpm'
재실행 후 확인: /etc/sudoers.d/monitor 파일이 존재하고 그 안에 본인 사용자가 포함된 줄이 있어야 합니다.

05. config.php 설정

패널 루트에 있는 config.php(/var/www/monitor/config.php)는 직접 편집해야 하는 유일한 파일입니다. 패널의 모든 설정은 이 파일에서 define() 상수로 지정됩니다. 편집기로 여세요:

sudo nano /var/www/monitor/config.php

강조된 부분에 자신의 값을 넣고, 나머지는 그대로 두세요:

// --- 데이터베이스 (04단계에서) --- define('DB_HOST', 'localhost'); // 그대로 두기 define('DB_NAME', 'db_name'); // 04단계에서 만든 값 define('DB_USER', 'user'); // 04단계에서 만든 값 define('DB_PASS', 'db_password'); // 04단계에서 지정한 값 define('DB_CHARSET', 'utf8mb4'); // 그대로 두기 // --- 애플리케이션 --- define('APP_URL', 'https://monitor.example.com'); // 패널 주소, 끝에 슬래시 없이 define('TIMEZONE', 'Asia/Seoul'); // 사용자의 시간대 // --- 세션 시간 --- define('SESSION_LIFETIME', 28800); // 재로그인까지 유휴 시간, 초 (28800 = 8시간)

변경할 항목:

  • DB_NAME, DB_USER, DB_PASS — 04단계에서 DB를 만들 때 지정한 데이터베이스 이름, 사용자, 비밀번호와 정확히 동일하게(예시를 그대로 뒀다면 monitor_db / monitor_user). DB_HOST와 DB_CHARSET는 건드리지 마세요.
  • APP_URL — https://를 포함한 패널의 전체 주소이며, 끝에 슬래시가 없어야 하고 www도 없어야 합니다. 라이선스를 활성화하는 도메인(07단계)과 일치해야 하며, 그렇지 않으면 키가 거부됩니다.
  • TIMEZONE — 사용자의 시간대입니다(목록은 timedatectl list-timezones). 패널이 날짜를 표시하는 방식에만 영향을 주며, cron 작업의 실행 시간에는 영향을 주지 않습니다(그쪽은 시스템 시간대를 따릅니다).
  • SESSION_LIFETIME — 몇 초간 활동이 없으면 패널이 재로그인을 요청할지 지정합니다(기본값 8시간). 예: 3600 = 1시간, 86400 = 하루.
  • 오류 로깅 블록(display_errors, log_errors, error_log)은 기본값 그대로 두세요.

파일을 저장하고(Ctrl+O, Enter, 이어서 Ctrl+X) PHP-FPM을 재시작하세요. 그렇지 않으면 OPcache 때문에 변경 사항이 적용되지 않습니다:

sudo systemctl restart php*-fpm
config.php는 비밀 파일입니다(DB 비밀번호가 들어 있음). 이 파일은 웹 루트이기도 한 패널 루트에 있지만, 권한 640(03단계에서 설정)과 루트 .htaccess의 명시적 차단으로 보호됩니다. 공개 저장소에 올리거나 실제 비밀번호가 담긴 채로 지원팀에 전달하지 마세요.
모든 매개변수에 대한 자세한 설명은 FAQ에 있습니다: “config.php 파일 — 패널의 모든 설정”.

06. SSL(HTTPS) 발급

대시보드는 HTTPS로만 동작합니다. 로그인 세션은 보안 쿠키를 사용하며, WebAuthn(2FA)은 표준상 HTTPS에서만 동작합니다. http://로는 로그인할 수 없습니다.
호스팅 패널이 있는 서버에서는 이 단계가 필요하지 않습니다(스크립트 출력: Certbot skipped — issue SSL in …). 인증서는 패널 자체의 웹 도메인에서 Let's Encrypt 스위치로 발급되며, 갱신도 패널이 담당합니다.

certbot과 Apache 플러그인은 자동 설정으로 이미 설치되어 있습니다. 도메인 DNS는 이미 서버를 가리키고 있어야 합니다(02단계). 한 번의 명령으로 발급:

sudo certbot --apache -d monitor.example.com

패널을 www.로도 열어야 한다면 두 이름을 하나의 명령에 함께 지정하세요. 그러지 않으면 두 번째 주소에서 브라우저가 인증서 경고를 표시합니다:

sudo certbot --apache -d monitor.example.com -d www.monitor.example.com
두 번째 이름은 그 이름에도 이 서버를 가리키는 A 레코드가 있을 때만 추가하세요(02단계). 그렇지 않으면 Let's Encrypt가 검증하지 못해 기본 도메인을 포함한 인증서 전체가 발급되지 않습니다.
certbot이 묻는 항목:
  1. Enter email address — 이메일 주소(인증서 만료 알림이 여기로 발송됩니다).
  2. Terms of Service … (Y)es/(N)o — Y.
  3. Share email with the EFF … (Y)es/(N)o — 선택 사항입니다.
이후 certbot이 알아서 인증서를 발급하고 <VirtualHost *:443>를 작성하며, http→https 리다이렉트와 자동 갱신을 설정합니다. 마지막에 Successfully enabled HTTPS가 표시됩니다.
발급에 실패하면 dig +short monitor.example.com가 서버 IP를 반환하는지, 그리고 80/443 포트가 열려 있는지 확인하세요(sudo ufw allow 80,443/tcp).

발급 후: https://monitor.example.com는 자물쇠 표시와 함께 열리고, http://는 https://로 리다이렉트됩니다.

07. 로그인 및 초기 설정

https://monitor.example.com을 열고 admin / useradmin으로 로그인한 뒤 체크리스트를 진행하세요:

  1. admin 비밀번호 변경 — 메뉴의 “사용자” 섹션.
  2. WebAuthn(2FA) 활성화 — “WebAuthn 키” → 키/passkey 등록(HTTPS 필요). 두 개를 한 번에 등록하세요: 유일한 키를 분실하면 그 키로 로그인할 수 없게 됩니다. 자세히.
  3. IP로 접근 제한 — “설정” → “IP 접근 제한”(활성화 전에 본인 IP를 입력하세요, 그러지 않으면 접근이 차단됩니다).
  4. 라이선스 입력 — 개인 계정의 활성화 코드 ARCIVEO-…를 본인 도메인에 활성화하고 키를 “설정” → “라이선스”에 붙여넣으세요. 자세히.
  5. 알림 설정 — “설정”에서 Telegram 및/또는 이메일. 자세히.
  6. 설치 프로그램 삭제 public/start_db.php가 남아 있다면 삭제하세요: 인증 없이 데이터베이스를 재생성할 수 있게 합니다. 이 파일이 패널 루트나 public/에 남아 있는 동안 패널은 빨간 배너로 경고합니다.
  7. 첫 검사를 직접 실행 — 그러지 않으면 밤이 될 때까지 일부 섹션이 비어 있습니다(아래 블록 참조).
“Lynis 감사”와 “Logwatch”가 처음에 비어 있는 이유. 자동 설정은 도구를 설치하고 cron 작업을 등록했을 뿐, 검사 자체를 실행하지는 않았습니다. 검사는 일정에 따라 진행됩니다: Lynis 03:00, Logwatch 06:00, debsums 04:30, ClamAV 01:30. 그때까지 해당 섹션은 아직 리포트가 없다고 정확히 표시합니다. 하루를 기다리지 않으려면 한 번 직접 실행하세요:
# Lynis 감사 — 첫 번째 리포트(몇 분 소요): sudo /usr/local/bin/lynis-scan.sh # 하루치 Logwatch 리포트: sudo /usr/local/bin/logwatch_daily.sh # 패키지 무결성(debsums) — 큰 서버에서는 오래 걸립니다: sudo /usr/local/bin/debsums-scan.sh
Lynis는 패널에서 직접 실행할 수도 있습니다 — “Lynis 감사” 페이지의 “감사 실행” 버튼이 같은 스크립트를 백그라운드로 수행하고 리포트를 자동으로 갱신합니다. 이후에는 모두 일정에 따라 진행되므로 직접 실행할 필요가 없습니다.
첫 번째 안티바이러스 검사(sudo /usr/local/bin/clamav-scan.sh)는 디스크와 CPU에 큰 부하를 주며 한 시간 이상 걸릴 수 있습니다. 운영 서버에서는 01:30의 야간 실행을 기다리는 편이 좋습니다. “디스크(SMART)”, “성능”, “보안 업데이트” 섹션은 각각 30분, 5분, 1시간 간격으로 자동으로 채워집니다.
완료입니다. 각 도구에 대한 안내는 FAQ에서 확인하세요.
이 서버에 자체 도메인을 가진 사이트가 하나 더 필요하다면 FAQ를 참고하십시오: “이 서버의 두 번째 사이트(도메인 하나 더)”.