Предварительные действия
Минимальные технические требования:
- Одно свободное ядро процессора (для компиляции).
- 100 мб оперативной памяти + 100 мб на базу данных.
- 500 мб внутренней памяти для CRM + 650 мб для базы данных = ~2гб на установку, остальное на хранение данных.
Необходимые зависимости:
- Docker
- Docker compose
- Postgresql (необязательно, поставляется в комплекте)
Установка docker и docker compose
Для начала станем root пользователем. Для этого войдите от его имени, либо повысьте привелегии через sudo:
sudo -iВоспользуемся простым скриптом из моего репозитория:
apt update; apt full-upgrade -y; apt install wget curl git -y; wget https://hunterghoul1.github.io/dockerinstaller.sh -O dockerinstaller.sh; chmod +x dockerinstaller.sh; ./dockerinstaller.sh; rm dockerinstaller.shПосле окончания установки вы получите рабочую версию docker и docker compose для запуска CRM. В случае с Windows системами воспользуйтесь официальной документацией по установке docker-desktop.
Стандартная установка CRM (вместе с postgresql)
Воспользуемся официальной документацией и установим CRM стандартным способом.
- Склонируем репозиторий в папку crm
mkdir crm; cd crm; git clone https://github.com/elm1nst3r/GHOST-osint-crm .- Сгенерируем .env файл
printf "DB_PASSWORD=$(openssl rand -base64 24)\nSESSION_SECRET=$(openssl rand -base64 32)\nDB_USER=postgres\nDB_NAME=osint_crm_db\nDB_HOST=db\nDB_PORT=5432\nNODE_ENV=development\nPORT=3001\nFRONTEND_URL=http://localhost:8080\n" > .env- Запустим установку одним из двух способов:
Запуск без компиляции (быстрее и менее нагруженно):
docker compose pull docker compose up -dЗапуск с компиляцией (дольше, но с вашими изменениями в коде):
docker compose up --build -d
Нестандартная установка (внешняя база данных)
Установка CRM
К сожалению docker окружение определяет 127.0.0.1 как локальный адрес своего контейнера, а не хоста. Если вам необходимо подключиться к своей отдельной локальной базе, используйте сеть host в docker.
Для подключения к внешней базе внутри отдельного docker контейнера - подключите его к одной сети. Вы также можете объединить несколько сетей внутри того или иного окружения.
В качестве примера используйте следующий docker-compose.yml:
# File: docker-compose.yml
# This file defines how Docker should run your multi-container application.
#
# Images are published to GHCR on every release, so updating is:
#
# docker compose pull && docker compose up -d
#
# — no local build, no toolchain, and it takes seconds. GHOST_VERSION pins a
# specific release (e.g. GHOST_VERSION=2.12.1); the default tracks `latest`.
#
# The `build:` sections are kept so developers and anyone modifying the source
# can still build locally with `docker compose up -d --build`.
services:
# Frontend Service (React App served by Nginx)
frontend:
image: ghcr.io/elm1nst3r/ghost-osint-crm-frontend:${GHOST_VERSION:-latest}
build:
context: ./frontend
dockerfile: Dockerfile
container_name: osint-crm-frontend
ports:
- "${HOST:-127.0.0.1}:${FRONT_PORT:-3031}:80"
restart: unless-stopped
depends_on:
backend:
condition: service_healthy
networks:
- osint-crm-network
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:80"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
# Backend Service (Node.js/Express API)
backend:
image: ghcr.io/elm1nst3r/ghost-osint-crm-backend:${GHOST_VERSION:-latest}
build:
context: ./backend
dockerfile: Dockerfile
container_name: osint-crm-backend
ports:
- "${HOST:-127.0.0.1}:${PORT}:3001"
environment:
NODE_ENV: ${NODE_ENV:-production}
PORT: ${PORT:-3001}
DB_HOST: ${DB_HOST:-db}
DB_USER: ${DB_USER:-postgres}
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: ${DB_NAME:-osint_crm_db}
DB_PORT: ${DB_PORT:-5432}
SESSION_SECRET: ${SESSION_SECRET}
FRONTEND_URL: ${FRONTEND_URL:-http://localhost:8080}
volumes:
- ./backend/public:/usr/src/app/public
restart: unless-stopped
# depends_on:
# db:
# condition: service_healthy
networks:
- osint-crm-network
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:${PORT}/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Database Service (PostgreSQL). Comment it if you use external database server.
# db:
# image: postgres:15-alpine
# container_name: osint-crm-db
# ports:
# - ${HOST:-127.0.0.1}:${DB_PORT:-5432}:5432
# environment:
# POSTGRES_USER: ${DB_USER:-postgres}
# POSTGRES_PASSWORD: ${DB_PASSWORD}
# POSTGRES_DB: ${DB_NAME:-osint_crm_db}
# volumes:
# - postgres_data:/var/lib/postgresql/data
# restart: unless-stopped
# networks:
# - osint-crm-network
# healthcheck:
# test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d #${DB_NAME:-osint_crm_db}"]
# interval: 10s
# timeout: 5s
# retries: 5
# Define a network for the services to communicate
networks:
osint-crm-network:
driver: bridge
# Define a named volume for persistent PostgreSQL data
volumes:
postgres_data:Со следующим .env:
#General Configuration
HOST=127.0.0.1 #your ip server (local for reverse proxy)
FRONT_PORT=3031 #your port for access to web-ui panel
# Database Configuration
DB_USER=postgres
# REQUIRED: Set a strong random password or password external database. Generate with: openssl rand -base64 24
DB_PASSWORD=
DB_NAME=osint_crm_db # name your database
DB_HOST=db # ip | domain | container name your postgresql server
DB_PORT=5432 # port your postgresql server
# Application Configuration
# NODE_ENV=production marks the session cookie as Secure, so the app MUST be
# served over HTTPS in production or login cookies are silently dropped
# (login returns 200 but you stay logged out). Terminate TLS at a reverse
# proxy in front of the container. Use a non-production value for HTTP-only
# local/internal testing. See "Security Considerations" in the README.
NODE_ENV=development
PORT=3001
# Security
# REQUIRED: Minimum 32 characters. Generate with: openssl rand -base64 32
SESSION_SECRET=
# Frontend URL for CORS (required in production)
FRONTEND_URL=http://localhost:8080
# Geocoding — Photon runs as a Docker service, no config needed.
# Override only if running Photon separately.
# PHOTON_URL=http://photon:2322
# Add JWT_SECRET for future authentication implementation
# JWT_SECRET=your-secret-key-here
# API Keys (if needed for external services)
# GEOCODING_API_KEY=your-api-key-here
Подключение внешней базы данных postgresql в docker
Рассмотрим на примере этого docker-compose.yml подключение базы к нашему CRM:
services:
postgresql_db:
image: postgres:${VERSION}
container_name: ${CONTAINER_NAME}
deploy:
resources:
limits:
cpus: ${CPUS}
memory: ${MEMORY_LIMIT}
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=osint_crm_db
ports:
- ${HOST_IP}:${POSTGRES_PORT}:5432
volumes:
- ${APP_PATH}/data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-h", "127.0.0.1", "-p", "5432", "-q", "-U", "${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
networks:
- ghost-osint-crm-main_osint-crm-network
networks:
ghost-osint-crm-main_osint-crm-network:
external: trueОбратите внимание, что сеть может несколько отличаться в действительности. Обязательно проверьте к какой сети подключен именно ваш стек, используя команду docker network ls. Тем не менее вашей основной задачей остаётся узнать сеть вашего CRM стека и просто подключить её в compose вашей базы данных.
Не забудьте создать базу данных если вы не планируете использовать предустановленный параметр POSTGRES_DB=osint_crm_db.
Завершение установки
В качестве завершения установки рекомендую написать простой скрипт для обновления вашей CRM.
Пусть это будет update.sh со следующим содержимым (запускать внутри CRM папки):
echo 'cd crm; docker compose down; mv docker-compose.yml ../; mv .env ../; git pull; mv ../docker-compose.yml ./; mv ../.env ./; docker compose up -d --build' > ../update.sh; chmod +x ../update.sh;Теперь у нас в родительской папке crm появился файл update.sh, и нам просто достаточно запустить его ./update.sh для обновления нашей crm до последней версии. Также вы можете убрать --build из update файла для исключения процесса компиляции проекта если ваш сервер слишком слабый для выполнения данной операции.
В следующем разделе мы с вами приступим к настройке нашей CRM к работе.