자동 방식: 개인 계정에서 실행하는 스크립트 하나가 서버 전체(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 비밀번호는 직접 정하세요.
jail.local), root-crontab, UFW 규칙, Apache 설정. 서버가 이미 구성되어 있다면(운영 중인 패널, 사이트, 메일, 자체 jail) — “구성된 서버” 프로필을 선택하세요. 이 프로필은 추가 변경만 하며 방화벽, Fail2ban, 메일, SSH, sysctl은 건드리지 않습니다. 호스팅 패널이 감지되면 스크립트가 자동으로 이 모드로 전환됩니다. 첫 실행 전에 드라이 런(계정 내 체크박스)을 켜면 아무것도 변경하지 않고 어떤 작업이 수행될지 보여줍니다. 운영 서버에서는 만약을 위해 스냅샷을 만들어 두세요.
my.arciveo.com → “서버 설정” 섹션에서 받습니다(Arcivéo Security Monitor 등록 후 이용 가능). 이 명령어는 계정에 연결되어 있으며 개인 토큰이 포함됩니다.
스크립트가 서버 전체를 준비합니다: 웹 스택(Apache + PHP), 데이터베이스, SSL 도구, 전체 보안 도구 모음 및 cron 작업(Lynis, SMART, debsums, Logwatch, 일일 리포트, ipsum 업데이트).
1) 보안 수준을 선택하세요(명령어를 복사하기 전에 계정에서):
2) 서버에서 root 권한으로 계정의 명령어를 실행하세요 — 형식은 다음과 같습니다:
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 포트를 반드시 허용한 뒤 직접 켜세요:
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: …).
monitor.example.com 같은 주소로 대시보드를 열고 무료 SSL을 받으려면 도메인이 서버를 가리켜야 합니다. DNS 관리 패널(등록기관 또는 호스팅 업체)에서 A 레코드를 생성하세요:
몇 분 후(때로는 최대 한 시간) 도메인이 서버를 가리키는지 확인하세요:
/var/www/monitor를 생성하고 Apache 사이트를 구성했습니다(DocumentRoot는 패널 루트로, PHP-FPM, .htaccess용 AllowOverride). 스크립트 출력에서는 vhost … → DocumentRoot … 줄이 이에 해당합니다. 디렉터리와 vhost를 따로 만들 필요 없이 파일만 업로드하고 권한을 설정하면 됩니다.
“호스팅 패널이 있는 서버” 갈래(출력: Control panel detected (…)). 이런 서버에서는 사이트를 패널이 관리하므로 스크립트는 자체 vhost를 의도적으로 만들지 않습니다. 만들더라도 패널이 설정을 다시 생성할 때 곧바로 덮어써지기 때문입니다. 순서는 다음과 같습니다:
public_html에 통째로 업로드하세요. index.php, api/, assets/와 함께 서비스용 config.php, includes/, data/, tmp/, logs/, keys/, cron/, database/도 같이 있어야 합니다. 웹 루트 밖으로 옮길 필요는 없습니다. 서비스용 폴더는 배포판에 포함된 .htaccess로 차단되며, Nginx 환경에서는 스크립트가 도메인 설정에 기록한 차단 규칙으로 보호됩니다.config.php(05단계)를 진행합니다. 명령의 경로는 /home/계정/web/도메인/public_html로, 소유자는 www-data 대신 해당 도메인의 사용자로 바꾸세요.“vhost 직접 만들기” 갈래(출력: No vhost created (no domain given)). 이는 도메인을 전달하지 않은 “구성된 서버” 프로필에서만 발생합니다. 가장 간단한 방법은 도메인을 지정하여 계정의 명령을 다시 실행하는 것입니다:
재실행은 안전합니다: 이미 수행된 작업은 중복되지 않습니다. vhost를 직접 만들어야 한다면, 설치 스크립트가 기록하는 것과 동일한 설정은 다음과 같습니다:
ServerName은 필수입니다. 이름이 없는 vhost는 Apache의 기본 사이트가 되어 같은 서버의 다른 도메인 요청까지 처리하게 됩니다. 같은 이유로 구성된 서버에서는 000-default.conf를 비활성화하지 마세요. 이 사이트는 누군가의 운영 사이트로 개조되어 있을 수 있습니다. 새 VPS에서는 설치 스크립트가 알아서 제거하므로 여기서는 손댈 필요가 없습니다.
! Nginx does not read .htaccess). Nginx는 정적 파일을 디스크에서 바로 내보내며 .htaccess를 읽지 않습니다. Apache가 올바르게 차단하더라도 서비스용 폴더가 외부에 노출됩니다. 스크립트가 차단 규칙 파일을 미리 준비해 두었으니, 해당 사이트의 server{} 블록에 이를 포함시키고 Nginx를 다시 로드하세요:
my.arciveo.com → “다운로드”에서 받을 수 있습니다. 서버에 올리기 전에 아카이브를 압축 해제하세요.
배포 파일의 내용을 /var/www/monitor에 업로드하세요(내부에 public/, assets/, config.php 등이 위치하도록) — SFTP/SCP(FileZilla / WinSCP)로 하거나 로컬 컴퓨터에서 scp 명령으로 업로드합니다:
ServerName)을 바로 기록하려면 01단계의 자동 설정 명령에 도메인을 전달합니다: … | sudo bash -s -- monitor.example.com (또는 개인 계정의 “패널 도메인” 필드에 도메인을 입력). 도메인을 전달하지 않으면 패널은 모든 호스트와 IP에 응답하며, SSL 발급 시(06단계) certbot이 ServerName을 기록합니다. 다시 설치할 필요는 없습니다.
root로 올렸거나 SFTP로 업로드했다면 파일 소유자가 root여서 웹 서버(www-data)가 읽을 수 없고, 패널이 빈 화면이나 403 오류로 열립니다(로그: .htaccess unreadable / directory not executable). 아래 명령으로 해결됩니다:
SFTP 업로드 권한을 본인에게 열어 주세요. 위 명령 이후 모든 파일의 소유자는 www-data인데, FileZilla / WinSCP는 본인 계정으로 접속하므로 업로드가 SSH_FX_PERMISSION_DENIED(Permission denied)로 실패합니다. 두 가지 방법 중 하나를 선택하세요.
방법 A — 본인 계정에만 ACL 부여(권장). 쓰기 권한은 본인만 갖고, 웹 서버는 여전히 패널 코드를 덮어쓸 수 없습니다:
방법 B — www-data 그룹을 통해. 더 간단하지만 패널 파일에 대한 쓰기 권한을 웹 서버도 갖게 됩니다. PHP에 취약점이 생기면 코드가 교체될 수 있습니다. 명령 순서가 중요합니다 — config.php와 작업 폴더는 마지막에 잠급니다:
id deploy — 그룹 목록에 www-data가 나타나야 합니다. ls -ld /var/www/monitor — 권한 drwxrwsr-x이며, x 대신 s는 setgid가 설정되었다는 뜻입니다.
데이터베이스와 사용자를 생성한 뒤 스키마를 가져옵니다. DB 블록은 터미널에 통째로 붙여 넣으세요 (sudo mysql은 unix 소켓으로 root 로그인하므로 root 비밀번호가 필요 없습니다). monitor_db와 monitor_user는 예시 이름이며 원하는 대로 지정할 수 있습니다. 데이터베이스 이름, 사용자, 비밀번호를 기억해 두었다가 다음 단계에서 config.php에 입력하세요:
database/db.sql에서) 테이블과 admin 계정을 자동으로 생성합니다.
테이블이 생성되지 않았다면(패널이 DB 연결 오류를 표시하거나 로그인 폼 대신 빈 화면이 나오는 경우) 스키마를 직접 가져오세요. 명령은 패널 루트에서 실행하며, 값은 위 블록에서 가져옵니다:
$DBNAME / $DBUSER / $DBPASS 변수가 이미 사라졌다면(터미널 세션이 새로 시작된 경우) 명령에 값을 직접 넣거나, 위 블록의 같은 세 줄로 변수를 다시 지정하세요.
sudo rules NOT written 줄이 있었다면, 패널 계정을 판별할 근거가 없었으므로(파일이 아직 업로드되지 않은 상태) 규칙이 생성되지 않았습니다. 이 규칙이 없으면 방화벽, Fail2ban, CrowdSec 같은 섹션이 비어 있게 됩니다. 이제 파일이 제자리에 있으니, 계정을 명시하여 계정의 명령을 다시 실행하세요:
www-data는 해당 사이트의 PHP가 실행되는 사용자로 바꾸세요(호스팅 패널에서는 보통 도메인 소유자입니다). 다음과 같이 확인할 수 있습니다:
/etc/sudoers.d/monitor 파일이 존재하고 그 안에 본인 사용자가 포함된 줄이 있어야 합니다.
패널 루트에 있는 config.php(/var/www/monitor/config.php)는 직접 편집해야 하는 유일한 파일입니다. 패널의 모든 설정은 이 파일에서 define() 상수로 지정됩니다. 편집기로 여세요:
강조된 부분에 자신의 값을 넣고, 나머지는 그대로 두세요:
변경할 항목:
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 때문에 변경 사항이 적용되지 않습니다:
640(03단계에서 설정)과 루트 .htaccess의 명시적 차단으로 보호됩니다. 공개 저장소에 올리거나 실제 비밀번호가 담긴 채로 지원팀에 전달하지 마세요.
http://로는 로그인할 수 없습니다.
Certbot skipped — issue SSL in …). 인증서는 패널 자체의 웹 도메인에서 Let's Encrypt 스위치로 발급되며, 갱신도 패널이 담당합니다.
certbot과 Apache 플러그인은 자동 설정으로 이미 설치되어 있습니다. 도메인 DNS는 이미 서버를 가리키고 있어야 합니다(02단계). 한 번의 명령으로 발급:
패널을 www.로도 열어야 한다면 두 이름을 하나의 명령에 함께 지정하세요. 그러지 않으면 두 번째 주소에서 브라우저가 인증서 경고를 표시합니다:
Y.<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://로 리다이렉트됩니다.
https://monitor.example.com을 열고 admin / useradmin으로 로그인한 뒤 체크리스트를 진행하세요:
ARCIVEO-…를 본인 도메인에 활성화하고 키를 “설정” → “라이선스”에 붙여넣으세요. 자세히.public/start_db.php가 남아 있다면 삭제하세요: 인증 없이 데이터베이스를 재생성할 수 있게 합니다. 이 파일이 패널 루트나 public/에 남아 있는 동안 패널은 빨간 배너로 경고합니다.sudo /usr/local/bin/clamav-scan.sh)는 디스크와 CPU에 큰 부하를 주며 한 시간 이상 걸릴 수 있습니다. 운영 서버에서는 01:30의 야간 실행을 기다리는 편이 좋습니다. “디스크(SMART)”, “성능”, “보안 업데이트” 섹션은 각각 30분, 5분, 1시간 간격으로 자동으로 채워집니다.