8 Commits

17 changed files with 3164 additions and 2 deletions
+64
View File
@@ -0,0 +1,64 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
A collection of standalone Bash utility scripts for MongoDB operations (backup, restore, local dev environment). No build system, package manager, or test suite — each module is a self-contained shell script.
## Modules
| Module | Script | Purpose |
|---|---|---|
| `dbdump_mongo/` | `db-dump.sh` | Dump MongoDB databases across multiple named environments |
| `dbrestore_mongo/` | `db-restore.sh` | Restore a MongoDB dump to a target instance |
| `dbutils_mongo/` | `db-start.sh` | Spin up a local MongoDB + Mongo Express via Docker |
## Running the Scripts
```bash
# Backup — interactive environment picker
cd dbdump_mongo && bash db-dump.sh
# Restore — interactive backup directory navigator
cd dbrestore_mongo && bash db-restore.sh
# Local dev database — Docker-based
cd dbutils_mongo && bash db-start.sh up # start
cd dbutils_mongo && bash db-start.sh down # stop
cd dbutils_mongo && bash db-start.sh status
cd dbutils_mongo && bash db-start.sh logs
cd dbutils_mongo && bash db-start.sh clean # remove volumes
cd dbutils_mongo && bash db-start.sh reconfigure
```
## Environment Setup
Each module requires a `.env` file (copied from the corresponding `.env.example`). The `.env` files are git-ignored. `dbdump_mongo` supports multiple named environments stored as `.env.<name>` files with `chmod 600` permissions.
## Architecture Patterns
All three scripts share the same conventions:
- **Sub-command dispatch**: a `main()` function routes `$1` to `cmd_<action>()` functions.
- **Colored output**: ANSI escape codes (`\033[...m`) for styled terminal output; consistent separator lines.
- **Prerequisite checks**: each script validates its required tools (`mongodump`, `mongorestore`, `docker`, `docker compose`) at startup and exits early with a clear message if missing.
- **Interactive prompts**: `read -p` / `select` menus guide the user through environment selection, directory navigation, and confirmation steps before any destructive action.
### dbdump_mongo — multi-environment credential model
Named environments are stored as `.env.<name>` files alongside the main `.env`. Credentials include `MONGO_USERNAME`, `MONGO_PASSWORD`, `MONGO_HOST`, `MONGO_PORT`, `APP_NAME`. Dumps land in `./dumps/<appName>/<yyyymmdd_hhmm>/`. The script generates MongoDB Atlas-compatible connection strings (ssl, replicaSet flags).
### dbrestore_mongo — backup directory navigation
The script walks through backup directory hierarchies interactively. It detects valid restore targets by checking for `.bson` files (`has_bson_files()`). Before executing `mongorestore`, it shows a summary of connection details and the selected backup path and requires explicit confirmation.
### dbutils_mongo — Docker Compose orchestration
Runs two containers on a `dbutils-network` bridge: MongoDB (configurable port, default `MONGO_PORT`) and Mongo Express (default port `8081`). Data is persisted in named volumes `mongodb-data` and `mongodb-config`. On first run, `setup_credentials()` prompts interactively and writes `.env`. The `mongo-init.js` initializer creates a `dataImportHistory` collection with indexes on `importDate` and `status`.
## External Dependencies
- `mongodump` / `mongorestore` — MongoDB Database Tools (must be installed separately)
- `docker` + `docker compose` (v2 plugin syntax)
- `bash` (scripts use `bash`-specific features, not POSIX `sh`)
+37 -2
View File
@@ -1,3 +1,38 @@
# adastra_scripts # AdAstra Scripts
AdAstra Utility Scripts A collection of utility scripts for AdAstra projects. Each script is self-contained and can be used independently.
## Scripts
### MongoDB
| Script | Description |
|---|---|
| [`dbdump_mongo/`](dbdump_mongo/) | Backup MongoDB databases with multi-environment support (prod, uat, staging, …) |
| [`dbrestore_mongo/`](dbrestore_mongo/) | Restore a MongoDB backup with interactive directory navigation |
| [`dbutils_mongo/`](dbutils_mongo/) | Spin up a local MongoDB + Mongo Express instance via Docker |
#### Typical MongoDB workflow
```bash
# 1. Backup from a remote MongoDB
cd dbdump_mongo && ./db-dump.sh dump
# 2. Start a local MongoDB instance
cd dbutils_mongo && ./db-start.sh up
# 3. Restore the backup locally
cd dbrestore_mongo && ./db-restore.sh
```
## Requirements
Each script lists its own requirements in its README. Common dependencies:
- **Bash**
- **MongoDB Database Tools** (`mongodump` / `mongorestore`) — [download](https://www.mongodb.com/try/download/database-tools)
- **Docker & Docker Compose** (for `dbutils_mongo` only)
## Author
Julien Gautier — AdAstra
+14
View File
@@ -0,0 +1,14 @@
# MongoDB Restore Configuration
# Copy this file to .env and update with your values
# This configuration should match your local MongoDB instance
# MongoDB credentials (for the target database)
MONGO_USERNAME=admin
MONGO_PASSWORD=password
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_DATABASE=adastradb
MONGO_AUTHSOURCE=admin
# Note: The connection string will be constructed as:
# mongodb://<MONGO_USERNAME>:<MONGO_PASSWORD>@<MONGO_HOST>:<MONGO_PORT>/<MONGO_DATABASE>?authSource=<MONGO_AUTHSOURCE>
+10
View File
@@ -0,0 +1,10 @@
# Environment configuration file (contains sensitive credentials)
.env
!.env.example
# OS files
.DS_Store
Thumbs.db
# Logs
*.log
+277
View File
@@ -0,0 +1,277 @@
# MongoDB Restore Utility (Standalone)
This directory contains a standalone tool for restoring MongoDB database backups created with `db-dump.sh`.
It provides interactive navigation through backup directories and restores them to a configured MongoDB instance.
## Quick Start
### 1. Configure Connection Details
Copy the example configuration:
```bash
cp .env.example .env
```
Edit `.env` with your MongoDB connection details:
```
MONGO_USERNAME=admin
MONGO_PASSWORD=password
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_DATABASE=adastradb
MONGO_AUTHSOURCE=admin
```
### 2. Restore a Backup
```bash
./db-restore.sh
```
The script will:
1. Verify MongoDB tools are installed
2. Load your configuration
3. Ask for the path to your backups directory
4. Guide you through the directory structure
5. Show a summary of what will be restored
6. Ask for confirmation
7. Restore the backup
## How It Works
### Configuration
The script requires a `.env` file with these variables:
- `MONGO_USERNAME` - MongoDB admin username
- `MONGO_PASSWORD` - MongoDB admin password
- `MONGO_HOST` - MongoDB server hostname/IP
- `MONGO_PORT` - MongoDB server port
- `MONGO_DATABASE` - Target database name
- `MONGO_AUTHSOURCE` - Authentication source (usually `admin`)
### Interactive Navigation
The script intelligently navigates through your backup directory structure:
```
dumps/
├── prod/ ← Choose this
│ ├── 20260414_1632/ ← Then this
│ │ └── (database folders) ← Then this
│ └── 20260414_1645/
└── uat/
└── 20260414_1700/
```
At each level, the script:
1. Shows available subdirectories
2. Asks you to choose one
3. Continues until it finds `.bson` files (backup data)
### Backup Detection
The script automatically stops navigation when it finds a directory containing `.bson` files, which are the actual backup data files.
Example backup structure:
```
~/Works/dbdump/dumps/
└── bo-uat-cosmodb/
└── 20260414_1732/
└── admin/ ← BSON files here
├── system.profile.bson
└── system.version.bson
```
## Example Use Case
Given this backup structure:
```
~/Works/dbdump/dumps/
├── bo-prod-cosmodb/
│ └── 20260414_1600/
│ └── AdAstra/
│ ├── collection1.bson
│ └── collection1.metadata.json
└── bo-uat-cosmodb/
└── 20260414_1732/
└── AdAstra/
├── orders.bson
└── orders.metadata.json
```
Restore process:
```bash
./db-restore.sh
# Script asks: Dumps path: ~/Works/dbdump/dumps
# Shows: 1) bo-prod-cosmodb 2) bo-uat-cosmodb
# You choose: 2
# Shows: 1) 20260414_1732
# You choose: 1
# Shows: 1) AdAstra
# You choose: 1
# Script finds BSON files and shows summary
```
## Restore Summary
Before executing the restore, the script displays:
```
MongoDB Connection:
Host: localhost
Port: 27017
Username: admin
Database: adastradb
AuthSource: admin
Backup Source:
Location: /home/user/Works/dbdump/dumps/bo-uat-cosmodb/20260414_1732
Backup files: 42
Total size: 250M
```
You must confirm with "yes" to proceed.
## Connection String
The script constructs the MongoDB connection string as:
```
mongodb://<username>:<password>@<host>:<port>/<database>?authSource=<authSource>
```
Example:
```
mongodb://admin:password@localhost:27017/adastradb?authSource=admin
```
## Directory Structure
```
dbrestore/
├── db-restore.sh # Main script
├── .env # Configuration (created by you, git-ignored)
├── .env.example # Example configuration
├── .gitignore # Git ignore rules
└── README.md # This file
```
## Security
- Configuration file (`.env`) has restricted permissions
- Contains sensitive credentials (username, password)
- Never commit actual `.env` file to version control
- Use `.env.example` as template
## Requirements
- **MongoDB Database Tools**: Download from https://www.mongodb.com/try/download/database-tools
- Specifically requires `mongorestore` command
- Bash shell
- Network access to MongoDB server
- Backup files created by `db-dump.sh` or `mongodump`
## Installation of MongoDB Database Tools
### macOS
```bash
brew tap mongodb/brew
brew install mongodb-database-tools
```
### Linux (Ubuntu/Debian)
```bash
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2004-x86_64-100.8.0.tgz
tar -xzf mongodb-database-tools-ubuntu2004-x86_64-100.8.0.tgz
sudo cp mongodb-database-tools-ubuntu2004-x86_64-100.8.0/bin/* /usr/local/bin/
```
### Windows
Download the MSI installer from https://www.mongodb.com/try/download/database-tools and run it.
## Troubleshooting
### mongorestore not found
```bash
# Check if MongoDB Database Tools is installed
mongorestore --version
# If not installed, see "Installation" section above
```
### .env file not found
```bash
# Copy the example configuration
cp .env.example .env
# Edit with your values
nano .env # or your favorite editor
```
### Connection refused
- Verify host and port are correct
- Check network connectivity to MongoDB server
- Ensure firewall allows access
- Verify MongoDB service is running (if local)
### Authentication failed
- Verify username and password in `.env`
- Check user has sufficient permissions
- Confirm `authSource` is correct (usually `admin`)
### No BSON files found
- Make sure you're pointing to the root of dumps directory
- Navigate through subdirectories until you reach the folder with actual backup files
- BSON files are typically deep in the directory structure
## Manual Restore Command
For reference, here's the command the script executes:
```bash
mongorestore --uri "mongodb://user:pass@host:port/db?authSource=admin" /path/to/dumps
```
## Related Tools
- **`dbutils/db-start.sh`** - Start MongoDB in Docker for restoring locally
- **`dbdump/db-dump.sh`** - Create backups from remote MongoDB servers
- **`dbrestore/db-restore.sh`** - Restore backups to a MongoDB instance (this tool)
## Workflow Example
Complete workflow to backup and restore:
```bash
# 1. Backup from production MongoDB (in dbdump folder)
cd ~/Works/dbdump
./db-dump.sh dump
# Select prod environment and wait for backup
# 2. Start local MongoDB (in dbutils folder)
cd ~/Works/dbutils
./db-start.sh up
# 3. Restore backup locally (in dbrestore folder)
cd ~/Works/dbrestore
./db-restore.sh
# Navigate to the backup created in step 1 and restore
```
## Documentation
For more information:
- MongoDB Documentation: https://docs.mongodb.com/
- mongorestore Manual: https://docs.mongodb.com/database-tools/mongorestore/
- Connection String Reference: https://docs.mongodb.com/manual/reference/connection-string/
## About
**Author:** Julien Gautier ([jgautier.webdev@gmail.com](mailto:jgautier.webdev@gmail.com))
**Organization:** AdAstra
**Project:** adastra_scripts
This utility was created to simplify the restoration of MongoDB database backups to local development environments for AdAstra projects.
+312
View File
@@ -0,0 +1,312 @@
#!/bin/bash
# Author: Julien Gautier <jgautier.webdev@gmail.com>
# Organization: AdAstra
# Project: adastra_scripts
#
################################################################################
# MongoDB Restore Utility Script (Standalone)
#
# This script restores MongoDB database dumps from backup files.
# It provides interactive navigation through dump directories and restores
# to a configured MongoDB instance.
#
# Usage: ./db-restore.sh
#
# Configuration:
# Requires .env file with MongoDB connection details:
# - MONGO_USERNAME
# - MONGO_PASSWORD
# - MONGO_HOST
# - MONGO_PORT
# - MONGO_DATABASE
# - MONGO_AUTHSOURCE
#
# Example command (what the script executes):
# mongorestore --uri "mongodb://user:pass@host:port/db?authSource=admin" /path/to/dumps
#
################################################################################
set -e
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="${SCRIPT_DIR}/.env"
# Global variables
SELECTED_DUMP_PATH=""
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# Helper functions
print_info() {
echo -e "${BLUE}┣━${NC} ${CYAN}${1}${NC}"
}
print_success() {
echo -e "${GREEN}${1}${NC}"
}
print_error() {
echo -e "${RED}${1}${NC}"
}
print_warning() {
echo -e "${YELLOW}${1}${NC}"
}
print_separator() {
echo -e "${BLUE}┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
print_separator_up() {
echo -e "${BLUE}┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
print_separator_down() {
echo -e "${BLUE}┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
print_section() {
echo
print_separator_up
print_info "$1"
print_separator_down
echo
}
check_mongorestore() {
if ! command -v mongorestore &> /dev/null; then
print_error "mongorestore is not installed or not in PATH"
print_info "Install MongoDB Database Tools from: https://www.mongodb.com/try/download/database-tools"
exit 1
fi
print_success "mongorestore found: $(mongorestore --version | head -1)"
}
check_env_file() {
if [[ ! -f "$ENV_FILE" ]]; then
print_error "Configuration file not found: $ENV_FILE"
print_info "Please create .env file with the following variables:"
print_info " MONGO_USERNAME=<username>"
print_info " MONGO_PASSWORD=<password>"
print_info " MONGO_HOST=<host>"
print_info " MONGO_PORT=<port>"
print_info " MONGO_DATABASE=<database>"
print_info " MONGO_AUTHSOURCE=<authSource>"
print_info "You can copy from .env.example"
exit 1
fi
}
load_config() {
# shellcheck source=/dev/null
source "$ENV_FILE"
# Validate required variables
if [[ -z "$MONGO_USERNAME" ]] || [[ -z "$MONGO_PASSWORD" ]] || [[ -z "$MONGO_HOST" ]] || \
[[ -z "$MONGO_PORT" ]] || [[ -z "$MONGO_DATABASE" ]] || [[ -z "$MONGO_AUTHSOURCE" ]]; then
print_error "Missing required configuration variables in .env file"
exit 1
fi
}
has_bson_files() {
local dir="$1"
[[ -n $(find "$dir" -maxdepth 1 -type f -name "*.bson" 2>/dev/null | head -1) ]]
}
has_subdirectories() {
local dir="$1"
[[ -n $(find "$dir" -maxdepth 1 -type d ! -name "." ! -name ".." 2>/dev/null | head -1) ]]
}
navigate_to_dump() {
SELECTED_DUMP_PATH=""
local current_path="$1"
# Expand ~ in path
current_path="${current_path/#\~/$HOME}"
# Check if path exists
if [[ ! -d "$current_path" ]]; then
print_error "Path does not exist: $current_path"
return 1
fi
# If this directory has BSON files, we're at the right level
if has_bson_files "$current_path"; then
SELECTED_DUMP_PATH="$current_path"
return 0
fi
# If no subdirectories and no BSON files, this isn't a valid dump directory
if ! has_subdirectories "$current_path"; then
print_error "No BSON files found and no subdirectories in: $current_path"
return 1
fi
# Navigate through subdirectories
while true; do
print_separator_up
print_info "Select Dump Directory"
print_separator_down
echo
print_info "Current location: $current_path"
echo
# Get list of subdirectories
local subdirs=()
local count=0
# Read subdirectories into array (null-terminated, excluding . and ..)
while IFS= read -r -d '' subdir; do
subdirs+=("$subdir")
echo " $((++count))) $(basename "$subdir")"
done < <(find "$current_path" -maxdepth 1 -mindepth 1 -type d -print0 | sort -z)
if [[ $count -eq 0 ]]; then
print_error "No subdirectories found in: $current_path"
return 1
fi
echo
echo -n "Enter your choice (1-$count): "
read choice
if [[ "$choice" =~ ^[0-9]+$ ]] && [[ $choice -ge 1 ]] && [[ $choice -le $count ]]; then
current_path="${subdirs[$((choice - 1))]}"
# Check if this directory has BSON files
if has_bson_files "$current_path"; then
SELECTED_DUMP_PATH="$current_path"
return 0
fi
# If no more subdirectories and no BSON files, error
if ! has_subdirectories "$current_path"; then
print_error "No BSON files found in: $current_path"
return 1
fi
# Continue loop to show next level
else
print_error "Invalid choice"
fi
done
}
get_backup_summary() {
local dump_path="$1"
local bson_count=$(find "$dump_path" -name "*.bson" -type f 2>/dev/null | wc -l)
local total_size=$(du -sh "$dump_path" 2>/dev/null | cut -f1)
echo "Backup files: $bson_count"
echo "Total size: $total_size"
}
show_summary() {
local dump_path="$1"
print_section "Restore Summary"
echo "MongoDB Connection:"
echo " Host: $MONGO_HOST"
echo " Port: $MONGO_PORT"
echo " Username: $MONGO_USERNAME"
echo " Database: $MONGO_DATABASE"
echo " AuthSource: $MONGO_AUTHSOURCE"
echo
echo "Backup Source:"
echo " Location: $dump_path"
echo " $(get_backup_summary "$dump_path")"
echo
echo "Connection string:"
echo " mongodb://<username>:<password>@$MONGO_HOST:$MONGO_PORT/$MONGO_DATABASE?authSource=$MONGO_AUTHSOURCE"
echo
}
confirm_restore() {
echo -n "Do you want to proceed with the restore? (yes/no): "
read response
[[ "$response" == "yes" ]]
}
perform_restore() {
local dump_path="$1"
print_separator_up
print_info "Starting MongoDB Restore..."
print_separator_down
echo
# Construct connection string
local connection_uri="mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOST}:${MONGO_PORT}/${MONGO_DATABASE}?authSource=${MONGO_AUTHSOURCE}"
# Perform restore
if mongorestore --uri "$connection_uri" "$dump_path" 2>&1; then
print_success "Restore completed successfully"
return 0
else
print_error "Restore operation failed"
return 1
fi
}
main() {
print_separator_up
print_info "MongoDB Restore Utility"
print_separator_down
# Initial checks
check_mongorestore
check_env_file
load_config
print_success "Configuration loaded"
echo
# Ask for initial dump path
print_info "Enter the path to the dumps directory"
echo " Example: ~/Works/dbdump/dumps"
echo
echo -n "Dumps path: "
read dumps_path
if [[ -z "$dumps_path" ]]; then
print_error "Dumps path cannot be empty"
return 1
fi
# Navigate to the correct dump directory
print_info "Navigating to backup location..."
navigate_to_dump "$dumps_path"
if [[ $? -ne 0 ]]; then
print_error "Failed to select backup directory"
return 1
fi
# Show summary of what will be restored
show_summary "$SELECTED_DUMP_PATH"
# Ask for confirmation
if ! confirm_restore; then
print_info "Restore operation cancelled"
return 1
fi
# Perform the restore
if perform_restore "$SELECTED_DUMP_PATH"; then
print_success "Restore operation completed"
else
print_error "Restore operation failed"
return 1
fi
}
main "$@"
+11
View File
@@ -0,0 +1,11 @@
# MongoDB Configuration Example
# Copy this file to .env and update with your values
# The script will prompt for these values on first run
MONGO_USERNAME=admin
MONGO_PASSWORD=password
MONGO_DATABASE=adastradb
MONGO_PORT=27017
MONGO_EXPRESS_PORT=8081
MONGO_EXPRESS_USERNAME=dev
MONGO_EXPRESS_PASSWORD=dev
+14
View File
@@ -0,0 +1,14 @@
# Environment variables
.env
*.env
# Docker volumes
mongodb-data/
mongo-config/
# OS files
.DS_Store
Thumbs.db
# Logs
*.log
+154
View File
@@ -0,0 +1,154 @@
# MongoDB Database Utility (Standalone)
This directory contains a standalone MongoDB setup for local development. It is completely independent from the main backend and frontend projects.
## Quick Start
### First Run (Setup)
```bash
./db-start.sh up
```
The script will prompt you for:
- **MongoDB username** (default: `admin`)
- **MongoDB password** (default: `password`)
- **Database name** (default: `adastradb`)
- **MongoDB port** (default: `27017`)
- **Mongo Express port** (default: `8081`)
Your configuration will be stored in `.env` file (automatically git-ignored).
### Common Commands
```bash
# Start MongoDB (prompts for credentials on first run)
./db-start.sh up
# View logs
./db-start.sh logs
# Stop MongoDB
./db-start.sh down
# Restart MongoDB
./db-start.sh restart
# Check container status
./db-start.sh status
# Reconfigure credentials
./db-start.sh reconfigure
# Remove all containers and volumes (DATA LOSS!)
./db-start.sh clean
# Show help
./db-start.sh help
```
## Accessing MongoDB
### From Your Application
- **Connection String**: `mongodb://<username>:<password>@localhost:27017/<database>?authSource=admin`
- **Example**: `mongodb://admin:password@localhost:27017/adastradb?authSource=admin`
### Using Mongo Express (GUI)
- **URL**: http://localhost:8081
- **Username**: `dev`
- **Password**: `dev`
## Data Persistence
All data is stored in Docker volumes and persists across container restarts. To permanently delete data, use:
```bash
./db-start.sh clean
```
## Collections
The database is automatically initialized with the following collection:
- **dataImportHistory**: Stores records of all data imports for audit and recovery tracking
- Indexed on `importDate` (descending) and `status`
- Ready for future data import functionality
## File Structure
```
dbutils/
├── db-start.sh # Main script
├── docker-compose-mongodb.yml # Docker Compose configuration
├── mongo-init.js # Database initialization script
├── .env # Configuration (generated on first run, git-ignored)
├── .env.example # Example configuration
├── .gitignore # Git ignore rules
└── README.md # This file
```
## Configuration
The script uses a `.env` file to store configuration. You can:
1. **Let the script generate it**: Run `./db-start.sh up` and answer the prompts
2. **Pre-create it**: Copy `.env.example` to `.env` and modify values
3. **Edit it manually**: Edit `.env` directly and run `./db-start.sh up`
4. **Reconfigure**: Run `./db-start.sh reconfigure` to re-run the setup wizard
## Requirements
- Docker
- Docker Compose (included with Docker Desktop)
- Bash shell
## Standalone Usage
This utility can be used independently from AdAstra projects:
```bash
# From anywhere
cd /path/to/dbutils
./db-start.sh up
# Or add to PATH and use globally (optional)
export PATH=$PATH:/path/to/dbutils
db-start.sh up
```
## Troubleshooting
### Port already in use
If MongoDB or Mongo Express port is already in use:
1. Run `./db-start.sh reconfigure`
2. Choose a different port (e.g., 27018 for MongoDB, 8082 for Mongo Express)
### Docker not running
```bash
# Check Docker status
docker info
```
### Permission denied
```bash
# Make script executable
chmod +x db-start.sh
```
## Notes
- Credentials are stored in `.env` (git-ignored for security)
- Mongo Express is included for easy database management
- Data persists in Docker volumes
- No initialization scripts are run (unlike the backend docker-compose)
- This is standalone and independent from the main project configuration
## About
**Author:** Julien Gautier ([jgautier.webdev@gmail.com](mailto:jgautier.webdev@gmail.com))
**Organization:** AdAstra
**Project:** adastra_scripts
These utilities were created to simplify MongoDB management during local development of AdAstra projects.
+412
View File
@@ -0,0 +1,412 @@
#!/bin/bash
# Author: Julien Gautier <jgautier.webdev@gmail.com>
# Organization: AdAstra
# Project: adastra_scripts
#
################################################################################
# MongoDB Database Utility Script (Standalone)
#
# This script manages a standalone MongoDB instance for local development.
# It runs independently and requires no configuration from the backend project.
#
# Usage: ./db-start.sh <command>
#
# Commands:
# up Start MongoDB and Mongo Express (interactive setup)
# down Stop MongoDB and Mongo Express
# logs Show database logs (follow mode)
# restart Restart MongoDB and Mongo Express
# status Show container status
# clean Remove database containers and volumes
# help Show this help message
#
# Configuration:
# The script will prompt for MongoDB credentials on first run.
# Configuration is stored in .env file.
#
# Examples:
# ./db-start.sh up
# ./db-start.sh logs
# ./db-start.sh down
#
################################################################################
set -e
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMPOSE_FILE="${SCRIPT_DIR}/docker-compose-mongodb.yml"
ENV_FILE="${SCRIPT_DIR}/.env"
PROJECT_NAME="dbutils"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
# Helper functions
print_info() {
echo -e "${BLUE}┣━${NC} ${CYAN}${1}${NC}"
}
print_success() {
echo -e "${GREEN}${1}${NC}"
}
print_error() {
echo -e "${RED}${1}${NC}"
}
print_warning() {
echo -e "${YELLOW}${1}${NC}"
}
print_separator() {
echo -e "${BLUE}┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
print_separator_up() {
echo -e "${BLUE}┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
print_separator_down() {
echo -e "${BLUE}┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
check_docker() {
if ! command -v docker &> /dev/null; then
print_error "Docker is not installed or not in PATH"
exit 1
fi
print_success "Docker found: $(docker --version)"
}
check_docker_running() {
if ! docker info > /dev/null 2>&1; then
print_error "Docker daemon is not running"
exit 1
fi
print_success "Docker daemon is running"
}
check_docker_compose() {
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null 2>&1; then
print_error "Docker Compose is not installed or not in PATH"
exit 1
fi
print_success "Docker Compose is available"
}
check_compose_file() {
if [[ ! -f "$COMPOSE_FILE" ]]; then
print_error "Docker Compose file not found at $COMPOSE_FILE"
exit 1
fi
}
get_compose_cmd() {
if command -v docker-compose &> /dev/null; then
echo "docker-compose"
else
echo "docker compose"
fi
}
setup_credentials() {
print_separator_up
print_info "MongoDB Configuration Setup"
print_separator_down
echo
# Read username
read -p "Enter MongoDB root username (default: admin): " mongo_username
mongo_username="${mongo_username:-admin}"
# Read password
read -sp "Enter MongoDB root password (default: password): " mongo_password
echo
mongo_password="${mongo_password:-password}"
# Read database name
read -p "Enter MongoDB database name (default: adastradb): " mongo_database
mongo_database="${mongo_database:-adastradb}"
echo
print_info "MongoDB port (default: 27017): "
read -p "Enter MongoDB port or press Enter for default: " mongo_port
mongo_port="${mongo_port:-27017}"
print_info "Mongo Express port (default: 8081): "
read -p "Enter Mongo Express port or press Enter for default: " mongo_express_port
mongo_express_port="${mongo_express_port:-8081}"
echo
# Create .env file
cat > "$ENV_FILE" << EOF
# MongoDB Configuration
MONGO_USERNAME=${mongo_username}
MONGO_PASSWORD=${mongo_password}
MONGO_DATABASE=${mongo_database}
MONGO_PORT=${mongo_port}
MONGO_EXPRESS_PORT=${mongo_express_port}
MONGO_EXPRESS_USERNAME=dev
MONGO_EXPRESS_PASSWORD=dev
EOF
print_success "Configuration saved to .env"
echo
}
load_credentials() {
if [[ -f "$ENV_FILE" ]]; then
print_info "Loading configuration from .env"
# shellcheck source=/dev/null
source "$ENV_FILE"
else
print_warning "No configuration found. Running setup..."
setup_credentials
# shellcheck source=/dev/null
source "$ENV_FILE"
fi
}
cmd_up() {
print_separator_up
print_info "Starting MongoDB Database..."
print_separator_down
echo
check_docker
check_docker_running
check_compose_file
check_docker_compose
load_credentials
COMPOSE_CMD=$(get_compose_cmd)
# Export variables for docker-compose
export MONGO_USERNAME
export MONGO_PASSWORD
export MONGO_DATABASE
export MONGO_PORT
export MONGO_EXPRESS_PORT
export MONGO_EXPRESS_USERNAME
export MONGO_EXPRESS_PASSWORD
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" up -d
print_success "MongoDB and Mongo Express have been started"
print_separator_up
print_info "MongoDB Connection Details:"
print_info " Host: localhost:${MONGO_PORT}"
print_info " Username: ${MONGO_USERNAME}"
print_info " Password: ${MONGO_PASSWORD}"
print_info " Database: ${MONGO_DATABASE}"
print_separator
print_info "Mongo Express (GUI) available at: http://localhost:${MONGO_EXPRESS_PORT}"
print_info " Username: ${MONGO_EXPRESS_USERNAME}"
print_info " Password: ${MONGO_EXPRESS_PASSWORD}"
print_separator_down
}
cmd_down() {
print_separator_up
print_info "Stopping MongoDB and Mongo Express..."
print_separator_down
check_docker
check_compose_file
check_docker_compose
COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" down
print_success "MongoDB and Mongo Express have been stopped"
}
cmd_logs() {
print_separator_up
print_info "Showing MongoDB logs..."
print_separator_down
check_docker
check_compose_file
check_docker_compose
COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" logs -f
}
cmd_restart() {
print_separator_up
print_info "Restarting MongoDB and Mongo Express..."
print_separator_down
check_docker
check_docker_running
check_compose_file
check_docker_compose
load_credentials
COMPOSE_CMD=$(get_compose_cmd)
# Export variables for docker-compose
export MONGO_USERNAME
export MONGO_PASSWORD
export MONGO_DATABASE
export MONGO_PORT
export MONGO_EXPRESS_PORT
export MONGO_EXPRESS_USERNAME
export MONGO_EXPRESS_PASSWORD
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" restart
print_success "MongoDB and Mongo Express have been restarted"
}
cmd_status() {
print_separator_up
print_info "Container Status"
print_separator_down
check_docker
check_compose_file
check_docker_compose
COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" ps
}
cmd_clean() {
print_separator_up
print_warning "This will remove database containers and volumes"
print_warning "All data will be PERMANENTLY LOST!"
echo
read -p "Are you sure? Type 'yes' to confirm: " response
echo
if [[ "$response" == "yes" ]]; then
print_separator
print_info "Removing containers and volumes..."
print_separator
check_docker
check_compose_file
check_docker_compose
COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" down -v --remove-orphans
print_success "All containers and volumes have been removed"
print_info "Configuration file (.env) has been preserved"
else
print_info "Clean operation cancelled"
fi
print_separator_down
}
cmd_reconfigure() {
print_separator_up
print_warning "This will reset the MongoDB configuration"
echo
read -p "Are you sure? Type 'yes' to confirm: " response
echo
if [[ "$response" == "yes" ]]; then
print_info "Stopping services before reconfiguration..."
check_docker 2>/dev/null || true
check_compose_file 2>/dev/null || true
COMPOSE_CMD=$(get_compose_cmd)
if command -v $COMPOSE_CMD &> /dev/null; then
$COMPOSE_CMD -f "$COMPOSE_FILE" -p "$PROJECT_NAME" down 2>/dev/null || true
fi
rm -f "$ENV_FILE"
print_success "Configuration cleared"
setup_credentials
print_info "You can now run './db-start.sh up' to start with the new configuration"
else
print_info "Reconfiguration cancelled"
fi
print_separator_down
}
cmd_help() {
cat << EOF
MongoDB Database Utility Script (Standalone)
Usage: ./db-start.sh <command>
Commands:
up Start MongoDB and Mongo Express (interactive setup on first run)
down Stop MongoDB and Mongo Express
logs Show database and container logs (follow mode)
restart Restart MongoDB and Mongo Express
status Show container status
reconfigure Reset and reconfigure MongoDB credentials
clean Remove all containers and volumes (DATA LOSS!)
help Show this help message
Examples:
./db-start.sh up
./db-start.sh logs
./db-start.sh down
./db-start.sh reconfigure
Configuration:
On first run, 'up' command will prompt for MongoDB credentials.
Configuration is stored in .env file (git-ignored).
You can reconfigure anytime with 'reconfigure' command.
EOF
}
# Main
COMMAND="${1:-help}"
case "$COMMAND" in
up|start)
cmd_up
;;
down|stop)
cmd_down
;;
logs)
cmd_logs
;;
restart)
cmd_restart
;;
status|ps)
cmd_status
;;
reconfigure)
cmd_reconfigure
;;
clean|remove)
cmd_clean
;;
help|--help|-h)
cmd_help
;;
*)
print_error "Unknown command: $COMMAND"
echo
cmd_help
exit 1
;;
esac
+48
View File
@@ -0,0 +1,48 @@
services:
mongodb:
image: mongo:latest
container_name: dbutils-mongodb
ports:
- "${MONGO_PORT:-27017}:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
MONGO_INITDB_DATABASE: ${MONGO_DATABASE}
volumes:
- mongodb-data:/data/db
- mongodb-config:/data/configdb
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js
networks:
- dbutils-network
restart: unless-stopped
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
interval: 10s
timeout: 5s
retries: 5
start_period: 40s
mongo-express:
image: mongo-express:latest
container_name: dbutils-mongo-express
ports:
- "${MONGO_EXPRESS_PORT:-8081}:8081"
environment:
ME_CONFIG_MONGODB_URL: mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@mongodb:27017/?authSource=admin
ME_CONFIG_MONGODB_ADMINUSERNAME: ${MONGO_USERNAME}
ME_CONFIG_MONGODB_ADMINPASSWORD: ${MONGO_PASSWORD}
ME_CONFIG_BASICAUTH_USERNAME: ${MONGO_EXPRESS_USERNAME:-dev}
ME_CONFIG_BASICAUTH_PASSWORD: ${MONGO_EXPRESS_PASSWORD:-dev}
depends_on:
- mongodb
networks:
- dbutils-network
restart: unless-stopped
volumes:
mongodb-data:
mongodb-config:
networks:
dbutils-network:
driver: bridge
+17
View File
@@ -0,0 +1,17 @@
// Initialize MongoDB database
// Switch to the application database
db = db.getSiblingDB(process.env.MONGO_INITDB_DATABASE || 'adastradb');
// Create a collection for data import history
// This collection will track all data imports for audit and recovery purposes
db.createCollection('dataImportHistory', {
capped: false
});
// Create an index on the importDate for better query performance
db.dataImportHistory.createIndex({ importDate: -1 });
db.dataImportHistory.createIndex({ status: 1 });
print(`✓ Database '${db.getName()}' initialized successfully`);
print(`✓ Collection 'dataImportHistory' created`);
+75
View File
@@ -0,0 +1,75 @@
# Directory Sync Utility
This directory contains a tool for syncing a local directory to a remote host in real time.
It watches for file changes and transfers them immediately via SCP, making it useful for
live development on a remote server.
## Scripts
| Script | Description |
|---|---|
| `dir-sync.sh` | Improved version — recommended |
| `scpsync.sh` | Original version |
## Quick Start
```bash
./dir-sync.sh -s /path/to/local/dir/ -d /path/to/remote/dir/ -r sshhost
```
The script starts watching the local directory immediately. Press **Ctrl+C** to stop —
it will reset the remote repository (`git reset --hard`) and clear the remote cache before exiting.
## Options
| Option | Description |
|---|---|
| `-s, --source <path>` | Local directory absolute path |
| `-d, --dest <path>` | Remote directory absolute path |
| `-r, --remote-host <h>` | Remote SSH host (as configured in `~/.ssh/config`) |
| `-h, --help` | Print help |
If an option is omitted, the script falls back to the default values defined at the top of the script.
## How It Works
1. **File watching**: `fswatch` monitors the source directory for any change, excluding `.git/`
2. **Batch end marker**: `fswatch --batch-marker` emits a `NoOp` signal at the end of each batch
3. **File sync**: each changed file is transferred with `scp`, preserving the relative path under the destination directory
4. **Cache clear**: on each `NoOp` (end of batch), `composer front-cache-clear` is run on the remote
5. **Cleanup on exit**: Ctrl+C triggers `git reset --hard` and a final cache clear on the remote
## Default Configuration
Edit the three constants at the top of `dir-sync.sh` to set your own defaults:
```bash
DEFAULT_LOCAL_PATH='/path/to/local/dir/'
DEFAULT_REMOTE_PATH='/path/to/remote/dir/'
DEFAULT_HOST='devac'
```
## Requirements
- [`fswatch`](https://github.com/emcrisostomo/fswatch) — file system watcher
- `scp` and `ssh` — standard OpenSSH tools
- A remote host configured in `~/.ssh/config` (password-less key auth recommended)
- `composer` available on the remote host (for cache clearing)
### Installing fswatch
```bash
# macOS
brew install fswatch
# Linux (Ubuntu/Debian)
sudo apt install fswatch
```
## About
**Author:** Julien Gautier ([jgautier.webdev@gmail.com](mailto:jgautier.webdev@gmail.com))
**Organization:** AdAstra
**Project:** adastra_scripts
+160
View File
@@ -0,0 +1,160 @@
#!/bin/zsh
RETVAL=0
# CONF
defaultLocalPath='/path/to/local/dir/'
defaultRemotePath='/path/to/remote/dir/'
defaultHost='devac'
NONE='\033[0m' # none
GREY='\033[2m' # grey
BOLD='\033[1m' # bold
GREEN='\033[0;32m' # green
YELLOW='\033[0;33m' # yellow
RED='\033[0;31m' # red
BLUE='\033[0;34m' # blue
CYAN='\033[0;36m' # cyan
MAGENTA='\033[0;35m' # magenta
BLACK='\033[0;30m' # black
WHITE='\033[0;37m' # white
BBLUE='\033[1;94m' # blue bold
POSITIONAL=()
clear
echo -e "${NONE}${BBLUE}🔎 Lancement du script $0 ${NONE}${GREY}"
echo -e "${NONE}${BLUE}-------------------------------${NONE}${GREY}"
Usage()
{
echo -e "${BOLD}NAME${NONE}"
echo " scpsync - Synchronize local folder to a remote host"
echo " "
echo -e "${BOLD}SYNOPSIS${NONE}"
echo " sh $0 [OPTION]..."
echo " "
echo -e "${BOLD}DESCRIPTION${NONE}"
echo " -h, --help"
echo " "
echo " print this help"
echo " "
echo " -d, --dest"
echo " "
echo " remote directory absolut path"
echo " "
echo " -s, --source"
echo " "
echo " source directory absolut path"
echo " "
echo " -r, --remote-host"
echo " remote ssh host"
echo " "
echo -e "${RED} 🐞${NONE} Usage: $0 -s /path/to/local/dir/ -d /path/to/remote/dir/ -r sshhost"
}
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-h|--help)
Usage
exit 0
;;
-d|--dest)
dirRemotePath=$2
shift # past argument
shift # past value
;;
-s|--source)
dirLocalPath=$2
shift
shift
;;
-r|--remote-host)
host=$2
shift
shift
;;
*)
# unknown option
POSITIONAL+=("$1") # save it in an array for later
shift
;;
esac
done
set -- "${POSITIONAL[@]}"
if test -z "$dirLocalPath"; then
dirLocalPath=$defaultLocalPath
echo -e "${YELLOW}⚠ Local path:${NONE} ${dirLocalPath}${YELLOW} (default)${NONE}"
else
echo -e "${GREEN}⚙️ Local path:${NONE} ${dirLocalPath}"
fi
if test -z "$dirRemotePath"; then
dirRemotePath=$defaultRemotePath
echo -e "${YELLOW}⚠ Remote path:${NONE} ${dirRemotePath}${YELLOW} (default)${NONE}"
else
echo -e "${GREEN}⚙️ Remote path:${NONE} ${dirRemotePath}"
fi
if [ -z "$host" ]; then
host=$defaultHost
echo -e "${YELLOW}⚠ Remote host:${NONE} ${host}${YELLOW} (default)${NONE}"
else
echo -e "${GREEN}⚙️ Remote host:${NONE} ${host}"
fi
if [ $RETVAL -eq 0 ]; then
trap exit INT
function exit() {
echo -e ""
echo -e "${NONE}${CYAN}♻️ Réinitialisation du répo distant...${NONE}${GREY}"
echo -e "${NONE}\$> ${MAGENTA}ssh ${host} \"cd ${dirRemotePath}; git reset --hard\"${NONE}"
ssh $host "cd $dirRemotePath; git reset --hard"
echo -e "\n${NONE}${CYAN}🗑️ Suppression du cache${NONE}${GREY}"
echo -e "${NONE}\$> ${MAGENTA}ssh ${host} \"cd ${dirRemotePath}; composer front-cache-clear\"${NONE}"
ssh $host "cd $dirRemotePath; composer front-cache-clear"
echo -e "${NONE}${GREEN}✔️ Ciao !${NONE}"
}
syncfile () {
fileLocalPath=$1
fileRemotePath=${fileLocalPath/$dirLocalPath/$dirRemotePath}
echo -e "\n${NONE}${CYAN}🔄 Synchronisation du fichier ${YELLOW}${fileLocalPath/$dirLocalPath/}${NONE}"
echo -e "${NONE}\$> ${MAGENTA}scp ${fileLocalPath} ${host}:${fileRemotePath}${NONE}"
scp ${fileLocalPath} $host:$fileRemotePath
}
echo -e "\n${NONE}${BBLUE}⏳ En attente de modification${NONE}${GREY}"
echo -e "${NONE}${BLUE}-----------------------------${NONE}${GREY}"
num=0
while read fileLocalPath; do
if [ "$fileLocalPath" = "NoOp" ]; then
num=0
echo -e "\n${NONE}${CYAN}🗑️ Suppression du cache${NONE}${GREY}"
echo -e "${NONE}\$> ${MAGENTA}ssh ${host} \"cd ${dirRemotePath}; composer front-cache-clear\"${NONE}\n"
ssh $host "cd $dirRemotePath; composer front-cache-clear"
echo -e "\n${NONE}${BBLUE}⏳ En attente de modification${NONE}${GREY}"
echo -e "${NONE}${BLUE}-----------------------------${NONE}${GREY}"
else
num=$((num+1))
#echo -e "${NONE}${num} - ${fileLocalPath}"
syncfile $fileLocalPath $num &
fi
done < <(fswatch --batch-marker -0 --exclude '.git/' $dirLocalPath | xargs -0 -n 1 -I {})
else
echo -e "${RED}${NONE} Le script a rencontré une erreur"
echo "-----------------------------"
echo -e "${RED} 💀 Exit code:${NONE} $RETVAL"
exit $RETVAL
fi
+500
View File
@@ -0,0 +1,500 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MongoDB Dump Utility</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f5f5f5;
page-break-after: always;
}
.container {
max-width: 900px;
margin: 0 auto;
padding: 0;
background-color: white;
}
header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 50px 40px;
text-align: center;
page-break-after: avoid;
}
header h1 {
font-size: 2.8em;
margin-bottom: 10px;
font-weight: 700;
letter-spacing: -1px;
}
header p {
font-size: 1.6em;
opacity: 0.95;
font-weight: 300;
color: #FFF;
text-align: center;
}
.toc {
background-color: #f8f9fa;
border-left: 4px solid #667eea;
padding: 30px 40px;
margin: 30px 0;
page-break-inside: avoid;
}
.toc h2 {
color: #667eea;
font-size: 1.3em;
margin-bottom: 20px;
text-transform: uppercase;
letter-spacing: 1px;
}
.toc ul {
list-style: none;
padding-left: 0;
}
.toc li {
margin: 8px 0;
font-size: 1em;
}
.toc a {
color: #667eea;
text-decoration: none;
border-bottom: 1px dotted #667eea;
transition: all 0.2s;
}
.toc a:hover {
color: #764ba2;
border-bottom-style: solid;
}
main {
padding: 40px;
}
section {
margin-bottom: 40px;
page-break-inside: avoid;
}
h2 {
color: #667eea;
font-size: 1.8em;
margin-bottom: 15px;
margin-top: 30px;
padding-bottom: 10px;
border-bottom: 2px solid #667eea;
font-weight: 700;
}
h3 {
color: #764ba2;
font-size: 1.3em;
margin: 20px 0 12px 0;
font-weight: 600;
}
p {
margin-bottom: 15px;
text-align: justify;
color: #555;
}
ul, ol {
margin-left: 25px;
margin-bottom: 15px;
}
li {
margin-bottom: 8px;
color: #555;
}
strong {
color: #333;
font-weight: 600;
}
code {
background-color: #f8f9fa;
border: 1px solid #e0e0e0;
border-radius: 3px;
padding: 2px 6px;
font-family: 'Courier New', monospace;
font-size: 0.95em;
color: #d63384;
}
pre {
background-color: #2d2d2d;
color: #f8f8f2;
padding: 20px;
border-radius: 5px;
overflow-x: auto;
margin: 15px 0;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.4;
page-break-inside: avoid;
border-left: 4px solid #667eea;
}
pre code {
background-color: transparent;
border: none;
padding: 0;
color: #f8f8f2;
}
.note {
background-color: #e7f3ff;
border-left: 4px solid #2196F3;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.warning {
background-color: #fff3cd;
border-left: 4px solid #ffc107;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.file-structure {
background-color: #f8f9fa;
border: 1px solid #dee2e6;
padding: 15px;
border-radius: 3px;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.6;
white-space: pre-wrap;
margin: 15px 0;
page-break-inside: avoid;
}
footer {
background-color: #f8f9fa;
border-top: 2px solid #667eea;
padding: 30px 40px;
margin-top: 40px;
text-align: center;
color: #666;
font-size: 0.95em;
page-break-inside: avoid;
}
footer p {
margin: 8px 0;
text-align: center;
}
.meta {
color: #667eea;
font-weight: 600;
}
a {
color: #667eea;
text-decoration: none;
transition: color 0.2s;
}
a:hover {
color: #764ba2;
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>MongoDB Dump Utility</h1>
<p>Database Server Backup Management</p>
</header>
<div class="toc">
<h2>Table of Contents</h2>
<ul>
<li><a href="#quick-start">Quick Start</a></li>
<li><a href="#commands">Commands</a></li>
<li><a href="#how-it-works">How It Works</a></li>
<li><a href="#configuration">Configuration Files</a></li>
<li><a href="#directory">Directory Structure</a></li>
<li><a href="#output">Dump Output</a></li>
<li><a href="#accessing">Accessing Dumps</a></li>
<li><a href="#security">Security</a></li>
<li><a href="#requirements">Requirements</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#troubleshooting">Troubleshooting</a></li>
<li><a href="#advanced">Advanced Usage</a></li>
<li><a href="#support">Support</a></li>
<li><a href="#about">About</a></li>
</ul>
</div>
<main>
<section>
<p style="font-style: italic; color: #777; margin-bottom: 20px;">
This directory contains a standalone tool for backing up MongoDB databases from remote or local servers. It manages multiple environment configurations for easy switching between prod, uat, and other environments.
</p>
</section>
<section id="quick-start">
<h2>Quick Start</h2>
<h3>First Run</h3>
<pre><code>./db-dump.sh dump</code></pre>
<p>The script will detect no environments and guide you through creating one. Answer the prompts with:</p>
<ul>
<li><strong>Environment name</strong> (required): e.g., <code>prod</code>, <code>uat</code>, <code>staging</code></li>
<li><strong>MongoDB username</strong> (required): The admin user</li>
<li><strong>MongoDB password</strong> (required): The admin password</li>
<li><strong>MongoDB host</strong> (required): e.g., <code>cluster0.mongodb.net</code></li>
<li><strong>MongoDB port</strong> (required): Usually <code>27017</code> or <code>10255</code></li>
<li><strong>Application name</strong> (required): Used in connection string and dump folder name</li>
</ul>
<h3>Subsequent Runs</h3>
<pre><code>./db-dump.sh dump</code></pre>
<p>The script will show you a list of configured environments and let you choose which one to backup, or create a new environment.</p>
</section>
<section id="commands">
<h2>Commands</h2>
<pre><code># Perform a backup of a selected environment
./db-dump.sh dump
# List all configured environments
./db-dump.sh list
# Add a new environment
./db-dump.sh add
# Delete an environment
./db-dump.sh delete
# Show help
./db-dump.sh help</code></pre>
</section>
<section id="how-it-works">
<h2>How It Works</h2>
<ol>
<li><strong>Environment Selection</strong>: On each run, you select from existing environments or create new ones</li>
<li><strong>Credential Storage</strong>: Each environment's credentials are stored in <code>.env.&lt;name&gt;</code> files</li>
<li><strong>MongoDB Connection</strong>: Connects using your credentials with MongoDB Atlas parameters (ssl, replicaSet, etc.)</li>
<li><strong>Dump Creation</strong>: Uses <code>mongodump</code> to create a backup</li>
<li><strong>Timestamped Output</strong>: Dumps are organized as <code>./dumps/&lt;appName&gt;/&lt;yyyymmdd_hhmm&gt;/</code></li>
</ol>
</section>
<section id="configuration">
<h2>Configuration Files</h2>
<p>Each environment is stored in a separate file:</p>
<pre><code>.env.prod # Production environment
.env.uat # UAT environment
.env.staging # Staging environment (if created)</code></pre>
<p>Each file contains:</p>
<pre><code>MONGO_USERNAME=&lt;username&gt;
MONGO_PASSWORD=&lt;password&gt;
MONGO_HOST=&lt;host&gt;
MONGO_PORT=&lt;port&gt;
APP_NAME=&lt;appName&gt;</code></pre>
</section>
<section id="directory">
<h2>Directory Structure</h2>
<div class="file-structure">dbdump/
├── db-dump.sh # Main script
├── .env.prod # Production config (created by user)
├── .env.uat # UAT config (created by user)
├── .env.example # Example configuration
├── .gitignore # Git ignore rules
├── README.md # This file
└── dumps/ # Created automatically
├── prod/
│ ├── 20260414_1632/
│ │ ├── admin/
│ │ └── myapp/
│ └── 20260414_1645/
└── uat/
└── 20260414_1632/</div>
</section>
<section id="output">
<h2>Dump Output</h2>
<p>Dumps are stored with the following structure:</p>
<pre><code>dumps/&lt;appName&gt;/&lt;yyyymmdd_hhmi&gt;/
admin/ # System databases
config/
myapp/ # Application databases
system.profile/</code></pre>
<p>Each backup preserves the complete database structure and is ready to be restored using <code>mongorestore</code>.</p>
</section>
<section id="accessing">
<h2>Accessing Dumps</h2>
<p>To view or restore a dump:</p>
<pre><code># List recent dumps
ls -lh dumps/prod/
# Restore a dump to local MongoDB
mongorestore --uri "mongodb://localhost:27017" dumps/prod/20260414_1632/
# Copy dump to another location
cp -r dumps/prod/20260414_1632/ /backup/prod-backup-20260414/</code></pre>
</section>
<section id="security">
<h2>Security</h2>
<ul>
<li>Configuration files have restricted permissions (600)</li>
<li>Credentials are stored locally in <code>.env.*</code> files</li>
<li>These files are git-ignored for security</li>
<li>Never commit <code>.env.*</code> files to version control</li>
</ul>
</section>
<section id="requirements">
<h2>Requirements</h2>
<ul>
<li><strong>MongoDB Database Tools</strong>: Download from <a href="https://www.mongodb.com/try/download/database-tools">https://www.mongodb.com/try/download/database-tools</a>
<ul>
<li>Specifically requires <code>mongodump</code> command</li>
</ul>
</li>
<li>Bash shell</li>
<li>Network access to MongoDB server</li>
</ul>
</section>
<section id="installation">
<h2>Installation of MongoDB Database Tools</h2>
<h3>macOS</h3>
<pre><code>brew tap mongodb/brew
brew install mongodb-database-tools</code></pre>
<h3>Linux (Ubuntu/Debian)</h3>
<pre><code>wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2004-x86_64-100.8.0.tgz
tar -xzf mongodb-database-tools-ubuntu2004-x86_64-100.8.0.tgz
sudo cp mongodb-database-tools-ubuntu2004-x86_64-100.8.0/bin/* /usr/local/bin/</code></pre>
<h3>Windows</h3>
<p>Download the MSI installer from <a href="https://www.mongodb.com/try/download/database-tools">https://www.mongodb.com/try/download/database-tools</a> and run it.</p>
</section>
<section id="troubleshooting">
<h2>Troubleshooting</h2>
<h3>mongodump not found</h3>
<pre><code># Check if MongoDB Database Tools is installed
mongodump --version
# If not installed, see "Installation" section above</code></pre>
<h3>Connection refused</h3>
<ul>
<li>Verify host and port are correct</li>
<li>Check network connectivity to MongoDB server</li>
<li>Ensure firewall allows access</li>
</ul>
<h3>Authentication failed</h3>
<ul>
<li>Verify username and password</li>
<li>Check the user has admin permissions</li>
<li>Confirm the <code>authSource=admin</code> parameter</li>
</ul>
<h3>Port already displaying in error</h3>
<p>The connection string is checked for errors. If you see connection errors, the script displays the exact MongoDB error message.</p>
</section>
<section id="advanced">
<h2>Advanced Usage</h2>
<h3>Manual mongodump command (for reference)</h3>
<p>The script constructs and runs this command automatically:</p>
<pre><code>mongodump --uri "mongodb://&lt;username&gt;:&lt;password&gt;@&lt;host&gt;:&lt;port&gt;/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@&lt;appName&gt;@" -o ./dumps/&lt;appName&gt;/&lt;yyyymmdd_hhmm&gt;</code></pre>
<h3>Scheduling automated backups</h3>
<p>You can schedule regular backups using cron (Linux/macOS):</p>
<pre><code># Add to crontab
crontab -e
# Daily dump at 3 AM for production environment
0 3 * * * cd /path/to/dbdump && ./db-dump.sh dump << EOF
1
EOF</code></pre>
</section>
<section id="support">
<h2>Support</h2>
<p>For MongoDB connection issues, refer to:</p>
<ul>
<li>MongoDB Documentation: <a href="https://docs.mongodb.com/">https://docs.mongodb.com/</a></li>
<li>Connection String Reference: <a href="https://docs.mongodb.com/manual/reference/connection-string/">https://docs.mongodb.com/manual/reference/connection-string/</a></li>
</ul>
</section>
<section id="about">
<h2>About</h2>
<p>
<strong>Author:</strong> Julien Gautier (<a href="mailto:jgautier.webdev@gmail.com">jgautier.webdev@gmail.com</a>)
</p>
<p>
<strong>Organization:</strong> AdAstra
</p>
<p>
<strong>Project:</strong> adastra_scripts
</p>
<p style="margin-top: 20px; color: #999;">
This utility was created to enable efficient backup and versioning of MongoDB databases from remote or local servers for AdAstra projects.
</p>
</section>
</main>
<footer>
<p>MongoDB Dump Utility Documentation</p>
<p>Generated with care for <span class="meta">AdAstra</span> projects</p>
<p style="margin-top: 15px; font-size: 0.9em; border-top: 1px solid #ddd; padding-top: 15px;">
© 2026 AdAstra - All rights reserved
</p>
</footer>
</div>
</body>
</html>
+546
View File
@@ -0,0 +1,546 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MongoDB Restore Utility</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f5f5f5;
page-break-after: always;
}
.container {
max-width: 900px;
margin: 0 auto;
padding: 0;
background-color: white;
}
header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 50px 40px;
text-align: center;
page-break-after: avoid;
}
header h1 {
font-size: 2.8em;
margin-bottom: 10px;
font-weight: 700;
letter-spacing: -1px;
}
header p {
font-size: 1.6em;
opacity: 0.95;
font-weight: 300;
color: #FFF;
text-align: center;
}
.toc {
background-color: #f8f9fa;
border-left: 4px solid #667eea;
padding: 30px 40px;
margin: 30px 0;
page-break-inside: avoid;
}
.toc h2 {
color: #667eea;
font-size: 1.3em;
margin-bottom: 20px;
text-transform: uppercase;
letter-spacing: 1px;
}
.toc ul {
list-style: none;
padding-left: 0;
}
.toc li {
margin: 8px 0;
font-size: 1em;
}
.toc a {
color: #667eea;
text-decoration: none;
border-bottom: 1px dotted #667eea;
transition: all 0.2s;
}
.toc a:hover {
color: #764ba2;
border-bottom-style: solid;
}
main {
padding: 40px;
}
section {
margin-bottom: 40px;
page-break-inside: avoid;
}
h2 {
color: #667eea;
font-size: 1.8em;
margin-bottom: 15px;
margin-top: 30px;
padding-bottom: 10px;
border-bottom: 2px solid #667eea;
font-weight: 700;
}
h3 {
color: #764ba2;
font-size: 1.3em;
margin: 20px 0 12px 0;
font-weight: 600;
}
p {
margin-bottom: 15px;
text-align: justify;
color: #555;
}
ul, ol {
margin-left: 25px;
margin-bottom: 15px;
}
li {
margin-bottom: 8px;
color: #555;
}
strong {
color: #333;
font-weight: 600;
}
code {
background-color: #f8f9fa;
border: 1px solid #e0e0e0;
border-radius: 3px;
padding: 2px 6px;
font-family: 'Courier New', monospace;
font-size: 0.95em;
color: #d63384;
}
pre {
background-color: #2d2d2d;
color: #f8f8f2;
padding: 20px;
border-radius: 5px;
overflow-x: auto;
margin: 15px 0;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.4;
page-break-inside: avoid;
border-left: 4px solid #667eea;
}
pre code {
background-color: transparent;
border: none;
padding: 0;
color: #f8f8f2;
}
.note {
background-color: #e7f3ff;
border-left: 4px solid #2196F3;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.warning {
background-color: #fff3cd;
border-left: 4px solid #ffc107;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.file-structure {
background-color: #f8f9fa;
border: 1px solid #dee2e6;
padding: 15px;
border-radius: 3px;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.6;
white-space: pre-wrap;
margin: 15px 0;
page-break-inside: avoid;
}
footer {
background-color: #f8f9fa;
border-top: 2px solid #667eea;
padding: 30px 40px;
margin-top: 40px;
text-align: center;
color: #666;
font-size: 0.95em;
page-break-inside: avoid;
}
footer p {
margin: 8px 0;
text-align: center;
}
.meta {
color: #667eea;
font-weight: 600;
}
a {
color: #667eea;
text-decoration: none;
transition: color 0.2s;
}
a:hover {
color: #764ba2;
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>MongoDB Restore Utility</h1>
<p>Standalone Backup Restoration Tool</p>
</header>
<div class="toc">
<h2>Table of Contents</h2>
<ul>
<li><a href="#quick-start">Quick Start</a></li>
<li><a href="#how-it-works">How It Works</a></li>
<li><a href="#interactive">Interactive Navigation</a></li>
<li><a href="#backup-detection">Backup Detection</a></li>
<li><a href="#example">Example Use Case</a></li>
<li><a href="#summary">Restore Summary</a></li>
<li><a href="#connection">Connection String</a></li>
<li><a href="#directory">Directory Structure</a></li>
<li><a href="#security">Security</a></li>
<li><a href="#requirements">Requirements</a></li>
<li><a href="#installation">Installation</a></li>
<li><a href="#troubleshooting">Troubleshooting</a></li>
<li><a href="#manual">Manual Restore Command</a></li>
<li><a href="#related">Related Tools</a></li>
<li><a href="#workflow">Workflow Example</a></li>
<li><a href="#about">About</a></li>
</ul>
</div>
<main>
<section>
<p style="font-style: italic; color: #777; margin-bottom: 20px;">
This directory contains a standalone tool for restoring MongoDB database backups created with <code>db-dump.sh</code>. It provides interactive navigation through backup directories and restores them to a configured MongoDB instance.
</p>
</section>
<section id="quick-start">
<h2>Quick Start</h2>
<h3>1. Configure Connection Details</h3>
<pre><code>cp .env.example .env</code></pre>
<p>Edit <code>.env</code> with your MongoDB connection details:</p>
<pre><code>MONGO_USERNAME=admin
MONGO_PASSWORD=password
MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_DATABASE=adastradb
MONGO_AUTHSOURCE=admin</code></pre>
<h3>2. Restore a Backup</h3>
<pre><code>./db-restore.sh</code></pre>
<p>The script will:</p>
<ol>
<li>Verify MongoDB tools are installed</li>
<li>Load your configuration</li>
<li>Ask for the path to your backups directory</li>
<li>Guide you through the directory structure</li>
<li>Show a summary of what will be restored</li>
<li>Ask for confirmation</li>
<li>Restore the backup</li>
</ol>
</section>
<section id="how-it-works">
<h2>How It Works</h2>
<h3>Configuration</h3>
<p>The script requires a <code>.env</code> file with these variables:</p>
<ul>
<li><code>MONGO_USERNAME</code> - MongoDB admin username</li>
<li><code>MONGO_PASSWORD</code> - MongoDB admin password</li>
<li><code>MONGO_HOST</code> - MongoDB server hostname/IP</li>
<li><code>MONGO_PORT</code> - MongoDB server port</li>
<li><code>MONGO_DATABASE</code> - Target database name</li>
<li><code>MONGO_AUTHSOURCE</code> - Authentication source (usually <code>admin</code>)</li>
</ul>
</section>
<section id="interactive">
<h2>Interactive Navigation</h2>
<p>The script intelligently navigates through your backup directory structure:</p>
<div class="file-structure">dumps/
├── prod/ - Choose this
│ ├── 20260414_1632/ - Then this
│ │ └── (database folders) - Then this
│ └── 20260414_1645/
└── uat/
└── 20260414_1700/</div>
<p>At each level, the script:</p>
<ol>
<li>Shows available subdirectories</li>
<li>Asks you to choose one</li>
<li>Continues until it finds <code>.bson</code> files (backup data)</li>
</ol>
</section>
<section id="backup-detection">
<h2>Backup Detection</h2>
<p>The script automatically stops navigation when it finds a directory containing <code>.bson</code> files, which are the actual backup data files.</p>
<p>Example backup structure:</p>
<pre><code>~/Works/dbdump/dumps/
└── bo-uat-cosmodb/
└── 20260414_1732/
└── admin/ - BSON files here
├── system.profile.bson
└── system.version.bson</code></pre>
</section>
<section id="example">
<h2>Example Use Case</h2>
<p>Given this backup structure:</p>
<pre><code>~/Works/dbdump/dumps/
├── bo-prod-cosmodb/
│ └── 20260414_1600/
│ └── AdAstra/
│ ├── collection1.bson
│ └── collection1.metadata.json
└── bo-uat-cosmodb/
└── 20260414_1732/
└── AdAstra/
├── orders.bson
└── orders.metadata.json</code></pre>
<p>Restore process:</p>
<pre><code>./db-restore.sh
# Script asks: Dumps path: ~/Works/dbdump/dumps
# Shows: 1) bo-prod-cosmodb 2) bo-uat-cosmodb
# You choose: 2
# Shows: 1) 20260414_1732
# You choose: 1
# Shows: 1) AdAstra
# You choose: 1
# Script finds BSON files and shows summary</code></pre>
</section>
<section id="summary">
<h2>Restore Summary</h2>
<p>Before executing the restore, the script displays:</p>
<pre><code>MongoDB Connection:
Host: localhost
Port: 27017
Username: admin
Database: adastradb
AuthSource: admin
Backup Source:
Location: /home/user/Works/dbdump/dumps/bo-uat-cosmodb/20260414_1732
Backup files: 42
Total size: 250M</code></pre>
<p>You must confirm with "yes" to proceed.</p>
</section>
<section id="connection">
<h2>Connection String</h2>
<p>The script constructs the MongoDB connection string as:</p>
<pre><code>mongodb://&lt;username&gt;:&lt;password&gt;@&lt;host&gt;:&lt;port&gt;/&lt;database&gt;?authSource=&lt;authSource&gt;</code></pre>
<p>Example:</p>
<pre><code>mongodb://admin:password@localhost:27017/adastradb?authSource=admin</code></pre>
</section>
<section id="directory">
<h2>Directory Structure</h2>
<div class="file-structure">dbrestore/
├── db-restore.sh # Main script
├── .env # Configuration (created by you, git-ignored)
├── .env.example # Example configuration
├── .gitignore # Git ignore rules
└── README.md # This file</div>
</section>
<section id="security">
<h2>Security</h2>
<ul>
<li>Configuration file (<code>.env</code>) has restricted permissions</li>
<li>Contains sensitive credentials (username, password)</li>
<li>Never commit actual <code>.env</code> file to version control</li>
<li>Use <code>.env.example</code> as template</li>
</ul>
</section>
<section id="requirements">
<h2>Requirements</h2>
<ul>
<li><strong>MongoDB Database Tools</strong>: Download from <a href="https://www.mongodb.com/try/download/database-tools">https://www.mongodb.com/try/download/database-tools</a>
<ul>
<li>Specifically requires <code>mongorestore</code> command</li>
</ul>
</li>
<li>Bash shell</li>
<li>Network access to MongoDB server</li>
<li>Backup files created by <code>db-dump.sh</code> or <code>mongodump</code></li>
</ul>
</section>
<section id="installation">
<h2>Installation of MongoDB Database Tools</h2>
<h3>macOS</h3>
<pre><code>brew tap mongodb/brew
brew install mongodb-database-tools</code></pre>
<h3>Linux (Ubuntu/Debian)</h3>
<pre><code>wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2004-x86_64-100.8.0.tgz
tar -xzf mongodb-database-tools-ubuntu2004-x86_64-100.8.0.tgz
sudo cp mongodb-database-tools-ubuntu2004-x86_64-100.8.0/bin/* /usr/local/bin/</code></pre>
<h3>Windows</h3>
<p>Download the MSI installer from <a href="https://www.mongodb.com/try/download/database-tools">https://www.mongodb.com/try/download/database-tools</a> and run it.</p>
</section>
<section id="troubleshooting">
<h2>Troubleshooting</h2>
<h3>mongorestore not found</h3>
<pre><code># Check if MongoDB Database Tools is installed
mongorestore --version
# If not installed, see "Installation" section above</code></pre>
<h3>.env file not found</h3>
<pre><code># Copy the example configuration
cp .env.example .env
# Edit with your values
nano .env # or your favorite editor</code></pre>
<h3>Connection refused</h3>
<ul>
<li>Verify host and port are correct</li>
<li>Check network connectivity to MongoDB server</li>
<li>Ensure firewall allows access</li>
<li>Verify MongoDB service is running (if local)</li>
</ul>
<h3>Authentication failed</h3>
<ul>
<li>Verify username and password in <code>.env</code></li>
<li>Check user has sufficient permissions</li>
<li>Confirm <code>authSource</code> is correct (usually <code>admin</code>)</li>
</ul>
<h3>No BSON files found</h3>
<ul>
<li>Make sure you're pointing to the root of dumps directory</li>
<li>Navigate through subdirectories until you reach the folder with actual backup files</li>
<li>BSON files are typically deep in the directory structure</li>
</ul>
</section>
<section id="manual">
<h2>Manual Restore Command</h2>
<p>For reference, here's the command the script executes:</p>
<pre><code>mongorestore --uri "mongodb://user:pass@host:port/db?authSource=admin" /path/to/dumps</code></pre>
</section>
<section id="related">
<h2>Related Tools</h2>
<ul>
<li><strong>dbutils/db-start.sh</strong> - Start MongoDB in Docker for restoring locally</li>
<li><strong>dbdump/db-dump.sh</strong> - Create backups from remote MongoDB servers</li>
<li><strong>dbrestore/db-restore.sh</strong> - Restore backups to a MongoDB instance (this tool)</li>
</ul>
</section>
<section id="workflow">
<h2>Workflow Example</h2>
<p>Complete workflow to backup and restore:</p>
<pre><code># 1. Backup from production MongoDB (in dbdump folder)
cd ~/Works/dbdump
./db-dump.sh dump
# Select prod environment and wait for backup</code></pre>
</section>
<section id="about">
<h2>About</h2>
<p>
<strong>Author:</strong> Julien Gautier (<a href="mailto:jgautier.webdev@gmail.com">jgautier.webdev@gmail.com</a>)
</p>
<p>
<strong>Organization:</strong> AdAstra
</p>
<p>
<strong>Project:</strong> adastra_scripts
</p>
<p style="margin-top: 20px; color: #999;">
These utilities were created to simplify MongoDB management during local development of AdAstra projects.
</p>
</section>
</main>
<footer>
<p>MongoDB Restore Utility Documentation</p>
<p>Generated with care for <span class="meta">AdAstra</span> projects</p>
<p style="margin-top: 15px; font-size: 0.9em; border-top: 1px solid #ddd; padding-top: 15px;">
© 2026 AdAstra - All rights reserved
</p>
</footer>
</div>
</body>
</html>
+513
View File
@@ -0,0 +1,513 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MongoDB Database Utility (Standalone)</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f5f5f5;
page-break-after: always;
}
.container {
max-width: 900px;
margin: 0 auto;
padding: 0;
background-color: white;
}
header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 50px 40px;
text-align: center;
page-break-after: avoid;
}
header h1 {
font-size: 2.8em;
margin-bottom: 10px;
font-weight: 700;
letter-spacing: -1px;
}
header p {
font-size: 1.6em;
opacity: 0.95;
font-weight: 300;
color: #FFF;
text-align: center;
}
.toc {
background-color: #f8f9fa;
border-left: 4px solid #667eea;
padding: 30px 40px;
margin: 30px 0;
page-break-inside: avoid;
}
.toc h2 {
color: #667eea;
font-size: 1.3em;
margin-bottom: 20px;
text-transform: uppercase;
letter-spacing: 1px;
}
.toc ul {
list-style: none;
padding-left: 0;
}
.toc li {
margin: 8px 0;
font-size: 1em;
}
.toc a {
color: #667eea;
text-decoration: none;
border-bottom: 1px dotted #667eea;
transition: all 0.2s;
}
.toc a:hover {
color: #764ba2;
border-bottom-style: solid;
}
main {
padding: 40px;
}
section {
margin-bottom: 40px;
page-break-inside: avoid;
}
h2 {
color: #667eea;
font-size: 1.8em;
margin-bottom: 15px;
margin-top: 30px;
padding-bottom: 10px;
border-bottom: 2px solid #667eea;
font-weight: 700;
}
h3 {
color: #764ba2;
font-size: 1.3em;
margin: 20px 0 12px 0;
font-weight: 600;
}
p {
margin-bottom: 15px;
text-align: justify;
color: #555;
}
ul, ol {
margin-left: 25px;
margin-bottom: 15px;
}
li {
margin-bottom: 8px;
color: #555;
}
strong {
color: #333;
font-weight: 600;
}
code {
background-color: #f8f9fa;
border: 1px solid #e0e0e0;
border-radius: 3px;
padding: 2px 6px;
font-family: 'Courier New', monospace;
font-size: 0.95em;
color: #d63384;
}
pre {
background-color: #2d2d2d;
color: #f8f8f2;
padding: 20px;
border-radius: 5px;
overflow-x: auto;
margin: 15px 0;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.4;
page-break-inside: avoid;
border-left: 4px solid #667eea;
}
pre code {
background-color: transparent;
border: none;
padding: 0;
color: #f8f8f2;
}
.highlight {
background-color: #fff3cd;
padding: 2px 6px;
border-radius: 3px;
}
.note {
background-color: #e7f3ff;
border-left: 4px solid #2196F3;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.warning {
background-color: #fff3cd;
border-left: 4px solid #ffc107;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.danger {
background-color: #f8d7da;
border-left: 4px solid #dc3545;
padding: 15px 20px;
margin: 20px 0;
border-radius: 3px;
page-break-inside: avoid;
}
.file-structure {
background-color: #f8f9fa;
border: 1px solid #dee2e6;
padding: 15px;
border-radius: 3px;
font-family: 'Courier New', monospace;
font-size: 0.9em;
line-height: 1.6;
white-space: pre-wrap;
margin: 15px 0;
page-break-inside: avoid;
}
table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
page-break-inside: avoid;
}
th {
background-color: #667eea;
color: white;
padding: 12px;
text-align: left;
font-weight: 600;
}
td {
padding: 12px;
border-bottom: 1px solid #dee2e6;
}
tr:nth-child(even) {
background-color: #f8f9fa;
}
tr:hover {
background-color: #e7f3ff;
}
footer {
background-color: #f8f9fa;
border-top: 2px solid #667eea;
padding: 30px 40px;
margin-top: 40px;
text-align: center;
color: #666;
font-size: 0.95em;
page-break-inside: avoid;
}
footer p {
margin: 8px 0;
text-align: center;
}
.meta {
color: #667eea;
font-weight: 600;
}
a {
color: #667eea;
text-decoration: none;
transition: color 0.2s;
}
a:hover {
color: #764ba2;
text-decoration: underline;
}
.command {
display: inline-block;
background-color: #e7f3ff;
border: 1px solid #667eea;
border-radius: 3px;
padding: 8px 12px;
font-family: 'Courier New', monospace;
font-size: 0.9em;
color: #0066cc;
margin: 5px 0;
}
.title-page {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 100vh;
page-break-after: always;
}
.page-break {
page-break-after: always;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>MongoDB Database Utility</h1>
<p>Standalone Local Development Setup</p>
</header>
<div class="toc">
<h2>Table of Contents</h2>
<ul>
<li><a href="#quick-start">Quick Start</a></li>
<li><a href="#commands">Common Commands</a></li>
<li><a href="#accessing">Accessing MongoDB</a></li>
<li><a href="#persistence">Data Persistence</a></li>
<li><a href="#collections">Collections</a></li>
<li><a href="#structure">File Structure</a></li>
<li><a href="#configuration">Configuration</a></li>
<li><a href="#requirements">Requirements</a></li>
<li><a href="#standalone">Standalone Usage</a></li>
<li><a href="#troubleshooting">Troubleshooting</a></li>
<li><a href="#notes">Notes</a></li>
<li><a href="#about">About</a></li>
</ul>
</div>
<main>
<section>
<p style="font-style: italic; color: #777; margin-bottom: 20px;">
This directory contains a standalone MongoDB setup for local development. It is completely independent from the main backend and frontend projects.
</p>
</section>
<section id="quick-start">
<h2>Quick Start</h2>
<h3>First Run (Setup)</h3>
<pre><code>./db-start.sh up</code></pre>
<p>The script will prompt you for:</p>
<ul>
<li><strong>MongoDB username</strong> (default: <code>admin</code>)</li>
<li><strong>MongoDB password</strong> (default: <code>password</code>)</li>
<li><strong>Database name</strong> (default: <code>adastradb</code>)</li>
<li><strong>MongoDB port</strong> (default: <code>27017</code>)</li>
<li><strong>Mongo Express port</strong> (default: <code>8081</code>)</li>
</ul>
<p>Your configuration will be stored in <code>.env</code> file (automatically git-ignored).</p>
</section>
<section id="commands">
<h2>Common Commands</h2>
<pre><code># Start MongoDB (prompts for credentials on first run)
./db-start.sh up
# View logs
./db-start.sh logs
# Stop MongoDB
./db-start.sh down
# Restart MongoDB
./db-start.sh restart
# Check container status
./db-start.sh status
# Reconfigure credentials
./db-start.sh reconfigure
# Remove all containers and volumes (DATA LOSS!)
./db-start.sh clean
# Show help
./db-start.sh help</code></pre>
</section>
<section id="accessing">
<h2>Accessing MongoDB</h2>
<h3>From Your Application</h3>
<ul>
<li><strong>Connection String:</strong> <code>mongodb://&lt;username&gt;:&lt;password&gt;@localhost:27017/&lt;database&gt;?authSource=admin</code></li>
<li><strong>Example:</strong> <code>mongodb://admin:password@localhost:27017/adastradb?authSource=admin</code></li>
</ul>
<h3>Using Mongo Express (GUI)</h3>
<ul>
<li><strong>URL:</strong> <a href="http://localhost:8081">http://localhost:8081</a></li>
<li><strong>Username:</strong> <code>dev</code></li>
<li><strong>Password:</strong> <code>dev</code></li>
</ul>
</section>
<section id="persistence">
<h2>Data Persistence</h2>
<p>All data is stored in Docker volumes and persists across container restarts. To permanently delete data, use:</p>
<pre><code>./db-start.sh clean</code></pre>
</section>
<section id="collections">
<h2>Collections</h2>
<p>The database is automatically initialized with the following collection:</p>
<ul>
<li><strong>dataImportHistory:</strong> Stores records of all data imports for audit and recovery tracking
<ul>
<li>Indexed on <code>importDate</code> (descending) and <code>status</code></li>
<li>Ready for future data import functionality</li>
</ul>
</li>
</ul>
</section>
<section id="structure">
<h2>File Structure</h2>
<div class="file-structure">dbutils/
├── db-start.sh # Main script
├── docker-compose-mongodb.yml # Docker Compose configuration
├── mongo-init.js # Database initialization script
├── .env # Configuration (generated on first run, git-ignored)
├── .env.example # Example configuration
├── .gitignore # Git ignore rules
└── README.md # This file</div>
</section>
<section id="configuration">
<h2>Configuration</h2>
<p>The script uses a <code>.env</code> file to store configuration. You can:</p>
<ol>
<li><strong>Let the script generate it:</strong> Run <code>./db-start.sh up</code> and answer the prompts</li>
<li><strong>Pre-create it:</strong> Copy <code>.env.example</code> to <code>.env</code> and modify values</li>
<li><strong>Edit it manually:</strong> Edit <code>.env</code> directly and run <code>./db-start.sh up</code></li>
<li><strong>Reconfigure:</strong> Run <code>./db-start.sh reconfigure</code> to re-run the setup wizard</li>
</ol>
</section>
<section id="requirements">
<h2>Requirements</h2>
<ul>
<li>Docker</li>
<li>Docker Compose (included with Docker Desktop)</li>
<li>Bash shell</li>
</ul>
</section>
<section id="standalone">
<h2>Standalone Usage</h2>
<p>This utility can be used independently from AdAstra projects:</p>
<pre><code># From anywhere
cd /path/to/dbutils
./db-start.sh up
# Or add to PATH and use globally (optional)
export PATH=$PATH:/path/to/dbutils
db-start.sh up</code></pre>
</section>
<section id="troubleshooting">
<h2>Troubleshooting</h2>
<h3>Port already in use</h3>
<p>If MongoDB or Mongo Express port is already in use:</p>
<ol>
<li>Run <code>./db-start.sh reconfigure</code></li>
<li>Choose a different port (e.g., 27018 for MongoDB, 8082 for Mongo Express)</li>
</ol>
<h3>Docker not running</h3>
<pre><code># Check Docker status
docker info</code></pre>
<h3>Permission denied</h3>
<pre><code># Make script executable
chmod +x db-start.sh</code></pre>
</section>
<section id="notes">
<h2>Notes</h2>
<ul>
<li>Credentials are stored in <code>.env</code> (git-ignored for security)</li>
<li>Mongo Express is included for easy database management</li>
<li>Data persists in Docker volumes</li>
<li>No initialization scripts are run (unlike the backend docker-compose)</li>
<li>This is standalone and independent from the main project configuration</li>
</ul>
</section>
<section id="about">
<h2>About</h2>
<p>
<strong>Author:</strong> Julien Gautier (<a href="mailto:jgautier.webdev@gmail.com">jgautier.webdev@gmail.com</a>)
</p>
<p>
<strong>Organization:</strong> AdAstra
</p>
<p>
<strong>Project:</strong> adastra_scripts
</p>
<p style="margin-top: 20px; color: #999;">
These utilities were created to simplify MongoDB management during local development of AdAstra projects.
</p>
</section>
</main>
<footer>
<p>MongoDB Database Utility Documentation</p>
<p>Generated with care for <span class="meta">AdAstra</span> projects</p>
<p style="margin-top: 15px; font-size: 0.9em; border-top: 1px solid #ddd; padding-top: 15px;">
© 2026 AdAstra - All rights reserved
</p>
</footer>
</div>
</body>
</html>