자동 설치

자동 방식: 개인 계정에서 실행하는 스크립트 하나가 서버 전체(Apache + PHP 웹 스택, 데이터베이스, 보안 도구, cron)를 준비합니다. 이후에는 패널을 배포하고 SSL을 발급한 뒤 라이선스를 입력하면 됩니다. Ubuntu/Debian에서 동작합니다. 새 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 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 작업은 이미 설치되어 기본 상태로 작동합니다 — 추가로 설정할 것이 없습니다.

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. 패널 파일 업로드

자동 설정이 이미 패널 디렉터리 /var/www/monitor를 생성하고 Apache 사이트를 구성했습니다(DocumentRoot는 패널 루트로, PHP-FPM, .htaccessAllowOverride). 디렉터리와 vhost를 따로 만들 필요 없이 파일만 업로드하고 권한을 설정하면 됩니다.
패널 파일(배포 아카이브)은 구매 후 개인 계정 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단계) certbotServerName을 기록합니다. 다시 설치할 필요는 없습니다.
파일 권한을 설정하세요 — 필수 단계입니다. 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_dbmonitor_user는 예시 이름이며 원하는 대로 지정할 수 있습니다. 데이터베이스 이름, 사용자, 비밀번호를 기억해 두었다가 다음 단계에서 config.php에 입력하세요:

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

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_HOSTDB_CHARSET는 건드리지 마세요.
  • APP_URLhttps://를 포함한 패널의 전체 주소이며, 끝에 슬래시가 없어야 하고 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과 Apache 플러그인은 자동 설정으로 이미 설치되어 있습니다. 도메인 DNS는 이미 서버를 가리키고 있어야 합니다(02단계). 한 번의 명령으로 발급:

sudo certbot --apache -d monitor.example.com
certbot이 묻는 항목:
  1. Enter email address — 이메일 주소(인증서 만료 알림이 여기로 발송됩니다).
  2. Terms of Service … (Y)es/(N)oY.
  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/에 남아 있는 동안 패널은 빨간 배너로 경고합니다.
완료입니다. 보안 도구가 이미 작동 중입니다 — 대시보드에 바로 상태와 보안 점수가 표시됩니다. 각 도구에 대한 안내는 FAQ에서 확인하세요.
Arcivéo - Security Monitor © 2026