Node 판
직접 관리하는 서버용: 기계 한 대, 상시 도는 서비스, 그 앞의 역방향 프록시.
Node 22, C 컴파일러, 로컬 디스크. 수십 명 규모라면 1코어로 충분합니다. MySQL 서버가 있으면 그것을 쓰고, 없으면 SQLite가 아무것도 요구하지 않습니다.
같은 제품의 두 판본입니다. 하나는 서버에서 서비스로 돌고, 다른 하나는 공용 호스팅에 올려두기만 하면 됩니다. 데이터베이스가 필수도 아니고, 외부 서비스도 필요 없습니다 — 다만 MySQL 서버가 있다면 그것도 씁니다. 한 시간을 잡으십시오.
유럽에 두고 저희가 맡습니다. 설치할 것이 없고, 다섯 사람까지 무료이며, 첫날부터 제품 전부입니다.
무료 형태는 SaaS에서 끝나지 않습니다. 다섯 사람까지라면 제품을 자기 자리에 두어도 —— 자기 파일, 자기 데이터베이스, 자기 백업 —— 한 푼도 들지 않습니다. 형태를 정하는 것은 인원 수이지, 인스턴스가 어디서 도는가가 아닙니다. 다섯 사람을 넘으면 구독이 필요하며, 인스턴스가 저희 쪽에서 돌든 그쪽에서 돌든 마찬가지입니다.
기능이 아니라 호스팅 환경이 선택을 결정합니다. 두 판본이 하는 일은 완전히 같습니다.
직접 관리하는 서버용: 기계 한 대, 상시 도는 서비스, 그 앞의 역방향 프록시.
Node 22, C 컴파일러, 로컬 디스크. 수십 명 규모라면 1코어로 충분합니다. MySQL 서버가 있으면 그것을 쓰고, 없으면 SQLite가 아무것도 요구하지 않습니다.
공용 호스팅용: 올릴 폴더 하나, 채울 파일 하나, 예약 작업 하나. 명령줄은 필요 없습니다.
PHP 8.1과 SQLite 확장. 설치할 의존성은 없습니다. Composer도, 패키지 관리자도 필요 없습니다. 데이터베이스 서버를 원한다면 PDO MySQL 확장도 함께.
두 판본은 같은 데이터베이스 구조와 같은 비밀번호 형식을 씁니다. 옮기는 일은 데이터베이스 파일 하나와 폴더 다섯 개를 복사하는 것뿐입니다. 변환 과정도 없고, 누구도 비밀번호를 바꿀 필요가 없습니다.
두 번째 선택이자, 바꾸기 어려운 유일한 선택입니다. 판본과는 무관합니다. 두 판본 모두 두 엔진을 받아들이고, 네 조합이 같은 시험을 통과합니다.
서버 디스크 위의 파일 하나. 설치할 것도, 관리할 것도, 지켜볼 것도 없습니다 — 인스턴스는 폴더 하나를 복사해 옮깁니다.
기본값이며 대부분의 경우 옳은 답입니다. 응용 서버 한 대와, 배포를 넘어 남는 로컬 디스크가 있다면.
데이터베이스 서버. 같은 기계에 두어도, 망의 다른 곳에 두어도 됩니다. 데이터는 전산 부서가 이미 백업하고 복제하고 감시하는 곳에 삽니다.
세 가지 이유로 고릅니다. 같은 데이터베이스에 여러 응용 서버, 그것을 요구하는 내부 규정, 또는 휘발성 응용 디스크 — 배포마다 새로 짓는 컨테이너.
가장 널리 퍼진 믿음이고, 틀렸습니다. SQLite는 프로세스 안에, MySQL은 소켓 너머에 삽니다. 저희가 이천 번의 연산으로 재어 보니 SQLite가 연산에 따라 2.5배에서 150배 빨랐고, 여덟 명이 동시에 쓰는 경우에도 비교를 견뎌 냈습니다. MySQL은 데이터가 어디에 살고 누가 관리하느냐 때문에 고르는 것이지, 응답 시간 때문이 아닙니다.
마법사를 열기에 딱 필요한 만큼. 자세한 것은 바로 뒤에, 한 걸음씩 —— 어떤 명령이 무엇을 왜 하는지와 함께.
직접 관리하는 서버에서 명령 셋. 마지막 명령이 설치 토큰을 만들고 인스턴스를 띄웁니다.
git clone <votre-dépôt> toutadmin
cd toutadmin && npm ci --omit=dev
INSTALL_TOKEN=$(openssl rand -hex 16) \
NODE_ENV=production node src/server.js
명령줄은 전혀 없습니다. 올려 둘 폴더 하나, 복사할 파일 하나, 열어 줄 쓰기 권한 하나.
# 1. déposer le dossier (racine web → public/)
# 2. cp config.sample.php config.php
# 3. chmod 770 data/
# 4. ouvrir https://votre-domaine/install
인스턴스는 빈 채로 떠서 스스로를 닫습니다. 설치가 끝나기 전에는 어떤 주소든 마법사로 가고, 끝나는 순간 마법사는 영영 사라집니다.
https://votre-domaine/install
처음 띄운 때부터 당신이 마법사를 지나기까지, 먼저 온 사람이 관리 계정을 만들어 버립니다. INSTALL_TOKEN이 그 창을 닫습니다. 그것이 없으면 마법사는 열리기를 거부합니다.
npm install이 아니라 npm ci를 쓰십시오. 잠금 파일이 적은 그대로 설치합니다. 서버에서 슬쩍 어긋난 버전은 아무도 이유를 모르는 장애가 됩니다.
git clone <votre-dépôt> /var/www/toutadmin
cd /var/www/toutadmin
npm ci --omit=dev
모든 설정은 환경 변수로 하며, 필수 항목은 하나도 없습니다. 포트를 열기 전에 INSTALL_TOKEN을 두십시오. 첫 구동부터 설치 마법사에 들어가기까지 사이에는 먼저 온 사람이 관리자 계정을 만들 수 있습니다.
cp .env.example .env
# PORT, NODE_ENV=production, INSTALL_TOKEN…
손으로 띄우면 터미널을 닫는 순간 멈춥니다. 서비스는 스스로 다시 일어나고, 자기 데이터 폴더에만 쓸 수 있습니다.
sudo systemctl enable --now toutadmin
journalctl -u toutadmin -f
응용 포트를 인터넷에 그대로 내놓지 마십시오. 프록시 뒤에서 본체가 보안 헤더를 직접 붙입니다. HSTS도 포함되며, 이미 암호화된 연결에서만 붙입니다.
sudo certbot --nginx -d intranet.exemple.fr
여기서 틀립니다. 서버가 폴더 전체를 내주면 데이터베이스를 누구나 내려받을 수 있게 됩니다. 계정도, 비밀번호 요약값도, 금고도 함께입니다.
# déposer le dossier ; la racine web pointe sur public/, pas sur le dossier
설정은 마법사가 쓰며, 그것도 맨 마지막에 씁니다. 파일이 없는 한, 중단된 설치는 아무것도 남기지 않은 것입니다. 거기에 인스턴스 고유의 키를 넣습니다. 서명을 봉인하고 데이터베이스의 비밀을 암호화하는 키이니, 나머지와 함께 백업해 두세요.
cp config.sample.php config.php
php -r "echo bin2hex(random_bytes(32));" # session_secret
SQLite는 데이터베이스 옆에도 파일을 씁니다. 쓸 수 있어야 하는 것은 폴더이지 파일만이 아닙니다. 제품의 나머지는 읽기 전용으로 두어도 됩니다.
chmod 770 data/ # le dossier, pas seulement la base
PHP 사이트는 요청이 있는 동안에만 살아 있습니다. 예약 작업이 만료된 계약을 닫고, 반복 청구서를 발행하고, 웹훅을 보내고, 백업을 만듭니다.
* * * * * /usr/bin/php /var/www/toutadmin/tools/cron.php
데이터베이스가 작을 때 곧바로 하나 만들고, 원격 보관처를 설정하십시오. 지켜야 할 서버에 그대로 남은 보관 파일은 아무것도 지키지 못합니다.
그 계정으로 로그인해 둘러보십시오. 동료의 눈으로 제품을 보는 유일한 방법이자, 가장 자주 건너뛰는 점검입니다.
이중 인증을 켠 뒤 휴대전화와 복구 코드를 함께 잃으면, 문을 열어 줄 수 있는 사람은 다른 관리자뿐입니다. 뒷문은 없습니다.
이 문서는 줄거리만 보여 줍니다. 나머지는 모두 문서에 있습니다. 앞단 서버 설정, 정확한 권한, 인증서, 복원, 갱신, 증상별 문제 해결 — 그리고 판본마다 하나씩, 두 안내서의 전문입니다.
처음 다섯 명은 언제나 무료입니다. 그 위로는 직원 한 명당 월 5 €. 사용해 보는 데 카드는 필요 없습니다.