udpated the config, add cnames,. docker compose, tunnel configs.
This commit is contained in:
parent
3b091eb57a
commit
588a3255a9
@ -53,26 +53,14 @@ if ! command -v jq &> /dev/null; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Array of subdomains that need DNS records
|
# Array of subdomains that need DNS records - updated to match our active services
|
||||||
SUBDOMAINS=(
|
SUBDOMAINS=(
|
||||||
"homepage"
|
"dashboard"
|
||||||
"excalidraw"
|
"code"
|
||||||
"listmonk"
|
"listmonk"
|
||||||
"monica"
|
"docs"
|
||||||
"flatnotes"
|
|
||||||
"code-server"
|
|
||||||
"ollama"
|
|
||||||
"open-webui"
|
|
||||||
"gitea"
|
|
||||||
"mini-qr"
|
|
||||||
"ferdium"
|
|
||||||
"answer"
|
|
||||||
"nocodb"
|
|
||||||
"n8n"
|
"n8n"
|
||||||
"convertx"
|
"db"
|
||||||
"rocket"
|
|
||||||
"live"
|
|
||||||
"vw"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Function to check if DNS record already exists
|
# Function to check if DNS record already exists
|
||||||
@ -151,9 +139,8 @@ echo "Setting up Cloudflare Access Protection"
|
|||||||
echo "-------------------------------------------------------------"
|
echo "-------------------------------------------------------------"
|
||||||
echo ""
|
echo ""
|
||||||
echo "The following services will be protected with authentication:"
|
echo "The following services will be protected with authentication:"
|
||||||
echo " - homepage.$CF_DOMAIN"
|
echo " - dashboard.$CF_DOMAIN"
|
||||||
echo " - code-server.$CF_DOMAIN"
|
echo " - code.$CF_DOMAIN"
|
||||||
echo " - live.$CF_DOMAIN"
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Please enter the admin email address that should have access:"
|
echo "Please enter the admin email address that should have access:"
|
||||||
read ADMIN_EMAIL
|
read ADMIN_EMAIL
|
||||||
@ -164,11 +151,11 @@ if [[ ! "$ADMIN_EMAIL" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; t
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Services that require authentication
|
# Services that require authentication - updated for our use case
|
||||||
PROTECTED_SERVICES=("homepage" "code-server" "live")
|
PROTECTED_SERVICES=("dashboard" "code")
|
||||||
|
|
||||||
# Services that should have bypass policies (public access)
|
# Services that should have bypass policies (public access) - updated for our use case
|
||||||
BYPASS_SERVICES=("excalidraw" "listmonk" "monica" "flatnotes" "ollama" "open-webui" "gitea" "mini-qr" "ferdium" "answer" "nocodb" "n8n" "convertx" "rocket" "vw")
|
BYPASS_SERVICES=("listmonk" "docs" "n8n" "db")
|
||||||
|
|
||||||
# Function to create access application with email authentication
|
# Function to create access application with email authentication
|
||||||
create_protected_app() {
|
create_protected_app() {
|
||||||
|
|||||||
284
config.sh
284
config.sh
@ -21,6 +21,9 @@ EOF
|
|||||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
ENV_FILE="$SCRIPT_DIR/.env"
|
ENV_FILE="$SCRIPT_DIR/.env"
|
||||||
MKDOCS_YML="$SCRIPT_DIR/mkdocs/docs/mkdocs.yml"
|
MKDOCS_YML="$SCRIPT_DIR/mkdocs/docs/mkdocs.yml"
|
||||||
|
TUNNEL_CONFIG_DIR="$SCRIPT_DIR/configs/cloudflare"
|
||||||
|
TUNNEL_CONFIG_FILE="$TUNNEL_CONFIG_DIR/tunnel-config.yml"
|
||||||
|
SERVICES_YAML="$SCRIPT_DIR/configs/homepage/services.yaml"
|
||||||
|
|
||||||
echo "Looking for .env file at: $ENV_FILE"
|
echo "Looking for .env file at: $ENV_FILE"
|
||||||
|
|
||||||
@ -34,13 +37,27 @@ generate_password() {
|
|||||||
update_env_var() {
|
update_env_var() {
|
||||||
local key=$1
|
local key=$1
|
||||||
local value=$2
|
local value=$2
|
||||||
local escaped_value=$(echo "$value" | sed 's/[\/&]/\\&/g')
|
|
||||||
|
|
||||||
|
# More robust method to handle special characters in passwords
|
||||||
if grep -q "^$key=" "$ENV_FILE"; then
|
if grep -q "^$key=" "$ENV_FILE"; then
|
||||||
sed -i "s/^$key=.*/$key=$escaped_value/" "$ENV_FILE"
|
# Create a temporary file
|
||||||
|
local tmpfile=$(mktemp)
|
||||||
|
|
||||||
|
# Process the .env file line by line
|
||||||
|
while IFS= read -r line; do
|
||||||
|
if [[ "$line" =~ ^$key= ]]; then
|
||||||
|
echo "$key=$value" >> "$tmpfile"
|
||||||
|
else
|
||||||
|
echo "$line" >> "$tmpfile"
|
||||||
|
fi
|
||||||
|
done < "$ENV_FILE"
|
||||||
|
|
||||||
|
# Replace the original file with the temporary file
|
||||||
|
mv "$tmpfile" "$ENV_FILE"
|
||||||
echo "Updated $key in .env file"
|
echo "Updated $key in .env file"
|
||||||
else
|
else
|
||||||
echo "$key=$escaped_value" >> "$ENV_FILE"
|
# Add new key-value pair if it doesn't exist
|
||||||
|
echo "$key=$value" >> "$ENV_FILE"
|
||||||
echo "Added $key to .env file"
|
echo "Added $key to .env file"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -85,14 +102,12 @@ MKDOCS_SITE_SERVER_PORT=4001
|
|||||||
N8N_PORT=5678
|
N8N_PORT=5678
|
||||||
NOCODB_PORT=8090
|
NOCODB_PORT=8090
|
||||||
HOMEPAGE_PORT=3010
|
HOMEPAGE_PORT=3010
|
||||||
SILEX_PORT=6805
|
|
||||||
|
|
||||||
# Domain Configuration
|
# Domain Configuration
|
||||||
BASE_DOMAIN=https://changeme.org
|
BASE_DOMAIN=https://changeme.org
|
||||||
DOMAIN=changeme.org
|
DOMAIN=changeme.org
|
||||||
LISTMONK_HOSTNAME=listmonk.changeme.org
|
LISTMONK_HOSTNAME=listmonk.changeme.org
|
||||||
N8N_HOST=n8n.changeme.org
|
N8N_HOST=n8n.changeme.org
|
||||||
SILEX_HOST=silex.changeme.org
|
|
||||||
|
|
||||||
# Cloudflare Configuration
|
# Cloudflare Configuration
|
||||||
CF_API_TOKEN=your_cloudflare_api_token
|
CF_API_TOKEN=your_cloudflare_api_token
|
||||||
@ -121,21 +136,6 @@ NOCODB_JWT_SECRET=changeMe
|
|||||||
NOCODB_DB_NAME=nocodb
|
NOCODB_DB_NAME=nocodb
|
||||||
NOCODB_DB_USER=noco
|
NOCODB_DB_USER=noco
|
||||||
NOCODB_DB_PASSWORD=changeMe
|
NOCODB_DB_PASSWORD=changeMe
|
||||||
|
|
||||||
# Listmonk SMTP Configuration
|
|
||||||
LISTMONK_SMTP_HOST=smtp.example.com
|
|
||||||
LISTMONK_SMTP_PORT=587
|
|
||||||
LISTMONK_SMTP_AUTH_PROTOCOL=plain
|
|
||||||
LISTMONK_SMTP_USERNAME=your-smtp-username
|
|
||||||
LISTMONK_SMTP_PASSWORD=your-smtp-password
|
|
||||||
LISTMONK_SMTP_HELLO_HOSTNAME=listmonk.changeme.org
|
|
||||||
LISTMONK_SMTP_TLS_ENABLED=true
|
|
||||||
LISTMONK_SMTP_TLS_SKIP_VERIFY=false
|
|
||||||
LISTMONK_SMTP_MAX_CONNS=10
|
|
||||||
LISTMONK_SMTP_MAX_MSG_RETRIES=2
|
|
||||||
LISTMONK_SMTP_IDLE_TIMEOUT=10s
|
|
||||||
LISTMONK_SMTP_WAIT_TIMEOUT=5s
|
|
||||||
LISTMONK_SMTP_EMAIL_HEADERS=List-Unsubscribe-Post=List-Unsubscribe=One-Click
|
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
echo "New .env file created with default values."
|
echo "New .env file created with default values."
|
||||||
@ -170,6 +170,38 @@ update_mkdocs_yml() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Function to update service URLs in services.yaml
|
||||||
|
update_services_yaml() {
|
||||||
|
local new_domain=$1
|
||||||
|
|
||||||
|
if [ ! -f "$SERVICES_YAML" ]; then
|
||||||
|
echo "Warning: services.yaml not found at $SERVICES_YAML"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Updating service URLs in services.yaml..."
|
||||||
|
|
||||||
|
# Create a backup of the services.yaml file
|
||||||
|
local timestamp=$(date +"%Y%m%d_%H%M%S")
|
||||||
|
local backup_file="${SERVICES_YAML}.backup_${timestamp}"
|
||||||
|
cp "$SERVICES_YAML" "$backup_file"
|
||||||
|
echo "Created backup of services.yaml at $backup_file"
|
||||||
|
|
||||||
|
# Update the commented URLs to use the new domain
|
||||||
|
sed -i "s|# href: \"https://code\.changeme\.org\"|# href: \"https://code.$new_domain\"|g" "$SERVICES_YAML"
|
||||||
|
sed -i "s|# href: \"https://listmonk\.changeme\.org\"|# href: \"https://listmonk.$new_domain\"|g" "$SERVICES_YAML"
|
||||||
|
sed -i "s|# href: \"https://db\.changeme\.org\"|# href: \"https://db.$new_domain\"|g" "$SERVICES_YAML"
|
||||||
|
sed -i "s|# href: \"https://docs\.changeme\.org\"|# href: \"https://docs.$new_domain\"|g" "$SERVICES_YAML"
|
||||||
|
sed -i "s|# href: \"https://n8n\.changeme\.org\"|# href: \"https://n8n.$new_domain\"|g" "$SERVICES_YAML"
|
||||||
|
sed -i "s|# href: \"https://test\.com\"|# href: \"https://$new_domain\"|g" "$SERVICES_YAML"
|
||||||
|
|
||||||
|
# Also update any remaining changeme.org references
|
||||||
|
sed -i "s|changeme\.org|$new_domain|g" "$SERVICES_YAML"
|
||||||
|
|
||||||
|
echo "Updated service URLs in services.yaml to use domain: $new_domain"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# Function to check if a port is in use
|
# Function to check if a port is in use
|
||||||
check_port() {
|
check_port() {
|
||||||
local port=$1
|
local port=$1
|
||||||
@ -201,7 +233,6 @@ check_port_conflicts() {
|
|||||||
"${N8N_PORT:-5678}:N8N"
|
"${N8N_PORT:-5678}:N8N"
|
||||||
"${NOCODB_PORT:-8090}:NocoDB"
|
"${NOCODB_PORT:-8090}:NocoDB"
|
||||||
"${HOMEPAGE_PORT:-3010}:Homepage"
|
"${HOMEPAGE_PORT:-3010}:Homepage"
|
||||||
"${SILEX_PORT:-6805}:Silex"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
local conflicts_found=false
|
local conflicts_found=false
|
||||||
@ -303,15 +334,114 @@ configure_alternative_ports() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Silex
|
echo "Port configuration completed."
|
||||||
if check_port "${SILEX_PORT:-6805}"; then
|
}
|
||||||
read -p "Enter alternative port for Silex [current: ${SILEX_PORT:-6805}]: " new_silex_port
|
|
||||||
if [ ! -z "$new_silex_port" ]; then
|
# Function to create Cloudflare tunnel configuration file
|
||||||
update_env_var "SILEX_PORT" "$new_silex_port"
|
create_tunnel_config() {
|
||||||
fi
|
local domain=$1
|
||||||
|
local tunnel_id=$2
|
||||||
|
|
||||||
|
# Ensure the tunnel config directory exists
|
||||||
|
if [ ! -d "$TUNNEL_CONFIG_DIR" ]; then
|
||||||
|
echo "Creating Cloudflare tunnel config directory at $TUNNEL_CONFIG_DIR"
|
||||||
|
mkdir -p "$TUNNEL_CONFIG_DIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Port configuration completed."
|
echo "Creating Cloudflare tunnel configuration file..."
|
||||||
|
|
||||||
|
# Generate the tunnel configuration file with simpler format
|
||||||
|
cat > "$TUNNEL_CONFIG_FILE" << EOL
|
||||||
|
# filepath: /home/bunker-admin/changemaker.lite/configs/cloudflare/tunnel-config.yml
|
||||||
|
# Cloudflare Tunnel Configuration
|
||||||
|
# Auto-generated by Changemaker Configuration Wizard
|
||||||
|
|
||||||
|
tunnel: $tunnel_id # e.g. 1234567890abcdef
|
||||||
|
credentials-file: /home/coder/.cloudflared/$tunnel_id.json # e.g. /home/coder/.cloudflared/[insert tunnel number].json
|
||||||
|
ingress:
|
||||||
|
|
||||||
|
- hostname: dashboard.$domain
|
||||||
|
service: http://localhost:${HOMEPAGE_PORT:-3010}
|
||||||
|
|
||||||
|
- hostname: code.$domain
|
||||||
|
service: http://localhost:${CODE_SERVER_PORT:-8888}
|
||||||
|
|
||||||
|
- hostname: listmonk.$domain
|
||||||
|
service: http://localhost:${LISTMONK_PORT:-9000}
|
||||||
|
|
||||||
|
- hostname: docs.$domain
|
||||||
|
service: http://localhost:${MKDOCS_PORT:-4000}
|
||||||
|
|
||||||
|
- hostname: $domain
|
||||||
|
service: http://localhost:${MKDOCS_SITE_SERVER_PORT:-4001}
|
||||||
|
|
||||||
|
- hostname: n8n.$domain
|
||||||
|
service: http://localhost:${N8N_PORT:-5678}
|
||||||
|
|
||||||
|
- hostname: db.$domain
|
||||||
|
service: http://localhost:${NOCODB_PORT:-8090}
|
||||||
|
|
||||||
|
# Catch-all rule (required)
|
||||||
|
- service: http_status:404
|
||||||
|
EOL
|
||||||
|
|
||||||
|
echo "✅ Tunnel configuration file created at: $TUNNEL_CONFIG_FILE"
|
||||||
|
|
||||||
|
# If the tunnel ID is a placeholder, provide instructions
|
||||||
|
if [[ "$tunnel_id" == "\${CF_TUNNEL_ID}" ]]; then
|
||||||
|
echo "NOTE: You need to replace ${CF_TUNNEL_ID} with your actual Cloudflare Tunnel ID"
|
||||||
|
echo " once you create a tunnel in the Cloudflare Zero Trust dashboard."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show tunnel setup instructions
|
||||||
|
show_tunnel_instructions() {
|
||||||
|
local domain=$1
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Cloudflare Tunnel Setup Instructions ==="
|
||||||
|
echo ""
|
||||||
|
echo "To complete the tunnel setup:"
|
||||||
|
echo ""
|
||||||
|
echo "1. Install cloudflared on your server:"
|
||||||
|
echo " https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation"
|
||||||
|
echo ""
|
||||||
|
echo "2. Create a tunnel using the Cloudflare dashboard or run:"
|
||||||
|
echo " cloudflared tunnel create changemaker-tunnel"
|
||||||
|
echo ""
|
||||||
|
echo "3. Copy the credentials file to the correct location:"
|
||||||
|
echo " mkdir -p /home/coder/.cloudflared"
|
||||||
|
echo " cp ~/.cloudflared/[TUNNEL-ID].json /home/coder/.cloudflared/"
|
||||||
|
echo ""
|
||||||
|
echo "4. Update your .env with the correct CF_TUNNEL_ID if not already done"
|
||||||
|
echo ""
|
||||||
|
echo "5. Start the tunnel with your configuration file:"
|
||||||
|
echo " cloudflared tunnel --config $TUNNEL_CONFIG_FILE run"
|
||||||
|
echo ""
|
||||||
|
echo "6. After verifying it works, you can create a systemd service for automatic startup:"
|
||||||
|
echo " sudo cloudflared service install"
|
||||||
|
echo ""
|
||||||
|
echo "7. Your services will be available at the following URLs:"
|
||||||
|
echo " - Documentation: https://$domain"
|
||||||
|
echo " - Dashboard: https://dashboard.$domain"
|
||||||
|
echo " - Code Server: https://code.$domain"
|
||||||
|
echo " - Listmonk: https://listmonk.$domain"
|
||||||
|
echo " - N8N: https://n8n.$domain"
|
||||||
|
echo " - NocoDB: https://db.$domain"
|
||||||
|
echo " - MkDocs Dev: https://docs.$domain"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to load environment variables from .env file
|
||||||
|
load_env_vars() {
|
||||||
|
if [ -f "$ENV_FILE" ]; then
|
||||||
|
# Load variables from .env file, ignoring comments and empty lines
|
||||||
|
while IFS= read -r line; do
|
||||||
|
if [[ "$line" =~ ^[A-Za-z_][A-Za-z0-9_]*= ]]; then
|
||||||
|
export "$line"
|
||||||
|
fi
|
||||||
|
done < <(grep -E '^[A-Za-z_][A-Za-z0-9_]*=' "$ENV_FILE")
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Initialize a new .env file if it doesn't exist
|
# Initialize a new .env file if it doesn't exist
|
||||||
@ -324,6 +454,9 @@ else
|
|||||||
backup_env_file
|
backup_env_file
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Load existing environment variables
|
||||||
|
load_env_vars
|
||||||
|
|
||||||
echo -e "\n\nWelcome to Changemaker Config!\n"
|
echo -e "\n\nWelcome to Changemaker Config!\n"
|
||||||
echo "This script will help you configure your .env file for Changemaker."
|
echo "This script will help you configure your .env file for Changemaker."
|
||||||
echo "Please provide the following information:"
|
echo "Please provide the following information:"
|
||||||
@ -341,9 +474,9 @@ echo -e "\nUpdating domain settings in .env file..."
|
|||||||
# Update main domain settings
|
# Update main domain settings
|
||||||
update_env_var "DOMAIN" "$domain_name"
|
update_env_var "DOMAIN" "$domain_name"
|
||||||
update_env_var "BASE_DOMAIN" "https://$domain_name"
|
update_env_var "BASE_DOMAIN" "https://$domain_name"
|
||||||
|
update_env_var "HOMEPAGE_VAR_BASE_URL" "https://$domain_name"
|
||||||
update_env_var "LISTMONK_HOSTNAME" "listmonk.$domain_name"
|
update_env_var "LISTMONK_HOSTNAME" "listmonk.$domain_name"
|
||||||
update_env_var "N8N_HOST" "n8n.$domain_name"
|
update_env_var "N8N_HOST" "n8n.$domain_name"
|
||||||
update_env_var "SILEX_HOST" "silex.$domain_name"
|
|
||||||
update_env_var "CF_DOMAIN" "$domain_name"
|
update_env_var "CF_DOMAIN" "$domain_name"
|
||||||
|
|
||||||
echo "Domain settings updated successfully!"
|
echo "Domain settings updated successfully!"
|
||||||
@ -401,41 +534,59 @@ if [[ ! "$configure_cf" =~ ^[Nn]$ ]]; then
|
|||||||
if [[ "$cf_tunnel_id" =~ ^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$ ]]; then
|
if [[ "$cf_tunnel_id" =~ ^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$ ]]; then
|
||||||
update_env_var "CF_TUNNEL_ID" "$cf_tunnel_id"
|
update_env_var "CF_TUNNEL_ID" "$cf_tunnel_id"
|
||||||
echo "✅ Cloudflare Tunnel ID updated"
|
echo "✅ Cloudflare Tunnel ID updated"
|
||||||
|
|
||||||
|
# Create tunnel configuration with the provided tunnel ID
|
||||||
|
create_tunnel_config "$domain_name" "$cf_tunnel_id"
|
||||||
else
|
else
|
||||||
echo "⚠️ Warning: Tunnel ID format seems incorrect (should be UUID format)"
|
echo "⚠️ Warning: Tunnel ID format seems incorrect (should be UUID format)"
|
||||||
update_env_var "CF_TUNNEL_ID" "$cf_tunnel_id"
|
update_env_var "CF_TUNNEL_ID" "$cf_tunnel_id"
|
||||||
|
|
||||||
|
# Still create the config file even with potentially incorrect format
|
||||||
|
create_tunnel_config "$domain_name" "$cf_tunnel_id"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "⚠️ Cloudflare Tunnel ID left unchanged"
|
echo "⚠️ Cloudflare Tunnel ID left unchanged"
|
||||||
|
# Create template config without tunnel ID
|
||||||
|
create_tunnel_config "$domain_name" "\${CF_TUNNEL_ID}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Cloudflare configuration completed!"
|
echo "Cloudflare configuration completed!"
|
||||||
echo "You can now run './add-cname-records.sh' to set up DNS records."
|
echo "You can now run './add-cname-records.sh' to set up DNS records."
|
||||||
|
|
||||||
|
# Show tunnel setup instructions
|
||||||
|
show_tunnel_instructions "$domain_name"
|
||||||
else
|
else
|
||||||
echo "Skipping Cloudflare configuration. You can run this script again later to configure it."
|
echo "Skipping Cloudflare configuration. You can run this script again later to configure it."
|
||||||
|
# Still create a template tunnel config
|
||||||
|
echo ""
|
||||||
|
read -p "Do you want to create a template tunnel configuration anyway? [Y/n]: " create_template
|
||||||
|
if [[ ! "$create_template" =~ ^[Nn]$ ]]; then
|
||||||
|
create_tunnel_config "$domain_name" "\${CF_TUNNEL_ID}"
|
||||||
|
echo "Template tunnel configuration created. Update CF_TUNNEL_ID in .env and regenerate if needed."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Update the site_url in mkdocs.yml
|
# Update the site_url in mkdocs.yml
|
||||||
echo -e "\nUpdating site_url in mkdocs.yml..."
|
echo -e "\nUpdating site_url in mkdocs.yml..."
|
||||||
update_mkdocs_yml "$domain_name"
|
update_mkdocs_yml "$domain_name"
|
||||||
|
|
||||||
# Check for port conflicts
|
# Update service URLs in services.yaml
|
||||||
echo -e "\n---- Checking Port Availability ----"
|
echo -e "\nUpdating service URLs in services.yaml..."
|
||||||
check_port_conflicts
|
update_services_yaml "$domain_name"
|
||||||
|
|
||||||
# Listmonk Admin Credentials configuration
|
# Listmonk Admin Credentials configuration
|
||||||
echo -e "\n---- Listmonk Admin Credentials ----"
|
echo -e "\n---- Listmonk Admin Credentials ----"
|
||||||
read -p "Enter Listmonk admin username [default: admin]: " listmonk_user
|
read -p "Enter Listmonk admin email/username [default: admin@example.com]: " listmonk_user
|
||||||
read -sp "Enter Listmonk admin password [default: strongpassword]: " listmonk_password
|
read -sp "Enter Listmonk admin password [default: changeMe]: " listmonk_password
|
||||||
echo # Add new line after password input
|
echo # Add new line after password input
|
||||||
|
|
||||||
if [ -z "$listmonk_user" ]; then
|
if [ -z "$listmonk_user" ]; then
|
||||||
listmonk_user="admin"
|
listmonk_user="admin@example.com"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$listmonk_password" ]; then
|
if [ -z "$listmonk_password" ]; then
|
||||||
listmonk_password="strongpassword"
|
listmonk_password="changeMe"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
update_env_var "LISTMONK_ADMIN_USER" "$listmonk_user"
|
update_env_var "LISTMONK_ADMIN_USER" "$listmonk_user"
|
||||||
@ -462,67 +613,6 @@ update_env_var "N8N_USER_PASSWORD" "$n8n_password"
|
|||||||
|
|
||||||
echo "N8N admin credentials updated."
|
echo "N8N admin credentials updated."
|
||||||
|
|
||||||
# SMTP Configuration
|
|
||||||
echo -e "\n---- SMTP Configuration ----"
|
|
||||||
echo "Configure SMTP settings for sending emails through Listmonk."
|
|
||||||
read -p "Do you want to configure SMTP settings now? [Y/n]: " configure_smtp
|
|
||||||
|
|
||||||
if [[ ! "$configure_smtp" =~ ^[Nn]$ ]]; then
|
|
||||||
echo ""
|
|
||||||
echo "Please enter your SMTP server details:"
|
|
||||||
|
|
||||||
read -p "SMTP Host (e.g., smtp.gmail.com, smtp.sendgrid.net): " smtp_host
|
|
||||||
read -p "SMTP Port [default: 587]: " smtp_port
|
|
||||||
read -p "SMTP Username/Email: " smtp_username
|
|
||||||
read -sp "SMTP Password: " smtp_password
|
|
||||||
echo
|
|
||||||
read -p "Hello Hostname [default: ${LISTMONK_HOSTNAME:-listmonk.changeme.org}]: " smtp_hello
|
|
||||||
read -p "Enable TLS? [Y/n]: " smtp_tls
|
|
||||||
|
|
||||||
# Set defaults
|
|
||||||
if [ -z "$smtp_port" ]; then
|
|
||||||
smtp_port="587"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$smtp_hello" ]; then
|
|
||||||
smtp_hello="${LISTMONK_HOSTNAME:-listmonk.changeme.org}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$smtp_tls" =~ ^[Nn]$ ]]; then
|
|
||||||
smtp_tls_enabled="false"
|
|
||||||
else
|
|
||||||
smtp_tls_enabled="true"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update SMTP settings in .env
|
|
||||||
if [ ! -z "$smtp_host" ]; then
|
|
||||||
update_env_var "LISTMONK_SMTP_HOST" "$smtp_host"
|
|
||||||
fi
|
|
||||||
|
|
||||||
update_env_var "LISTMONK_SMTP_PORT" "$smtp_port"
|
|
||||||
|
|
||||||
if [ ! -z "$smtp_username" ]; then
|
|
||||||
update_env_var "LISTMONK_SMTP_USERNAME" "$smtp_username"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -z "$smtp_password" ]; then
|
|
||||||
update_env_var "LISTMONK_SMTP_PASSWORD" "$smtp_password"
|
|
||||||
fi
|
|
||||||
|
|
||||||
update_env_var "LISTMONK_SMTP_HELLO_HOSTNAME" "$smtp_hello"
|
|
||||||
update_env_var "LISTMONK_SMTP_TLS_ENABLED" "$smtp_tls_enabled"
|
|
||||||
update_env_var "LISTMONK_SMTP_AUTH_PROTOCOL" "plain"
|
|
||||||
update_env_var "LISTMONK_SMTP_TLS_SKIP_VERIFY" "false"
|
|
||||||
update_env_var "LISTMONK_SMTP_MAX_CONNS" "10"
|
|
||||||
update_env_var "LISTMONK_SMTP_MAX_MSG_RETRIES" "2"
|
|
||||||
update_env_var "LISTMONK_SMTP_IDLE_TIMEOUT" "10s"
|
|
||||||
update_env_var "LISTMONK_SMTP_WAIT_TIMEOUT" "5s"
|
|
||||||
|
|
||||||
echo "✅ SMTP configuration completed!"
|
|
||||||
else
|
|
||||||
echo "Skipping SMTP configuration. You can configure this later in the Listmonk admin interface."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Generate secure passwords for database and encryption
|
# Generate secure passwords for database and encryption
|
||||||
echo -e "\n---- Generating Secure Passwords ----"
|
echo -e "\n---- Generating Secure Passwords ----"
|
||||||
echo "Generating secure passwords for database and encryption keys..."
|
echo "Generating secure passwords for database and encryption keys..."
|
||||||
|
|||||||
31
configs/cloudflare/tunnel-config.yml
Normal file
31
configs/cloudflare/tunnel-config.yml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# filepath: /home/bunker-admin/changemaker.lite/configs/cloudflare/tunnel-config.yml
|
||||||
|
# Cloudflare Tunnel Configuration
|
||||||
|
# Auto-generated by Changemaker Configuration Wizard
|
||||||
|
|
||||||
|
tunnel: test # e.g. 1234567890abcdef
|
||||||
|
credentials-file: /home/coder/.cloudflared/test.json # e.g. /home/coder/.cloudflared/[insert tunnel number].json
|
||||||
|
ingress:
|
||||||
|
|
||||||
|
- hostname: dashboard.reed.com
|
||||||
|
service: http://localhost:3010
|
||||||
|
|
||||||
|
- hostname: code.reed.com
|
||||||
|
service: http://localhost:8888
|
||||||
|
|
||||||
|
- hostname: listmonk.reed.com
|
||||||
|
service: http://localhost:9000
|
||||||
|
|
||||||
|
- hostname: docs.reed.com
|
||||||
|
service: http://localhost:4000
|
||||||
|
|
||||||
|
- hostname: reed.com
|
||||||
|
service: http://localhost:4001
|
||||||
|
|
||||||
|
- hostname: n8n.reed.com
|
||||||
|
service: http://localhost:5678
|
||||||
|
|
||||||
|
- hostname: db.reed.com
|
||||||
|
service: http://localhost:8090
|
||||||
|
|
||||||
|
# Catch-all rule (required)
|
||||||
|
- service: http_status:404
|
||||||
@ -12,10 +12,7 @@
|
|||||||
- Homepage:
|
- Homepage:
|
||||||
- abbr: HP
|
- abbr: HP
|
||||||
href: https://gethomepage.dev/
|
href: https://gethomepage.dev/
|
||||||
- Silex:
|
|
||||||
- abbr: SX
|
|
||||||
href: https://www.silex.me/
|
|
||||||
|
|
||||||
- Services:
|
- Services:
|
||||||
- Listmonk:
|
- Listmonk:
|
||||||
- abbr: LM
|
- abbr: LM
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
# For public access, replace "http://localhost" with your domain (e.g., "https://changeme.org")
|
# For public access, replace "http://localhost" with your subdomain URLs
|
||||||
|
|
||||||
- Essential Tools:
|
- Essential Tools:
|
||||||
- Code Server:
|
- Code Server:
|
||||||
href: "http://localhost:8888"
|
href: "http://localhost:8888"
|
||||||
# href: "https://changeme.org:8888" # Uncomment for public access
|
# href: "https://code.reed.com" # Uncomment for public access
|
||||||
description: VS Code in the browser
|
description: VS Code in the browser
|
||||||
icon: mdi-code-braces
|
icon: mdi-code-braces
|
||||||
widget:
|
widget:
|
||||||
@ -13,7 +13,7 @@
|
|||||||
server: my-docker
|
server: my-docker
|
||||||
- Listmonk:
|
- Listmonk:
|
||||||
href: "http://localhost:9000"
|
href: "http://localhost:9000"
|
||||||
# href: "https://changeme.org:9000" # Uncomment for public access
|
# href: "https://listmonk.reed.com" # Uncomment for public access
|
||||||
description: Newsletter & mailing list manager
|
description: Newsletter & mailing list manager
|
||||||
icon: mdi-email-newsletter
|
icon: mdi-email-newsletter
|
||||||
widget:
|
widget:
|
||||||
@ -22,18 +22,18 @@
|
|||||||
server: my-docker
|
server: my-docker
|
||||||
- NocoDB:
|
- NocoDB:
|
||||||
href: "http://localhost:8090"
|
href: "http://localhost:8090"
|
||||||
# href: "https://changeme.org:8090" # Uncomment for public access
|
# href: "https://db.reed.com" # Uncomment for public access
|
||||||
description: No-code database platform
|
description: No-code database platform
|
||||||
icon: mdi-database
|
icon: mdi-database
|
||||||
widget:
|
widget:
|
||||||
type: docker
|
type: docker
|
||||||
container: nocodb
|
container: changemakerlite-nocodb-1
|
||||||
server: my-docker
|
server: my-docker
|
||||||
|
|
||||||
- Content & Documentation:
|
- Content & Documentation:
|
||||||
- MkDocs (Live):
|
- MkDocs (Live):
|
||||||
href: "http://localhost:4000"
|
href: "http://localhost:4000"
|
||||||
# href: "https://changeme.org:4000" # Uncomment for public access
|
# href: "https://docs.reed.com" # Uncomment for public access
|
||||||
description: Live documentation server with hot reload
|
description: Live documentation server with hot reload
|
||||||
icon: mdi-book-open-page-variant
|
icon: mdi-book-open-page-variant
|
||||||
widget:
|
widget:
|
||||||
@ -42,7 +42,7 @@
|
|||||||
server: my-docker
|
server: my-docker
|
||||||
- Static Site:
|
- Static Site:
|
||||||
href: "http://localhost:4001"
|
href: "http://localhost:4001"
|
||||||
# href: "https://changeme.org:4001" # Uncomment for public access
|
# href: "https://reed.com" # Uncomment for public access
|
||||||
description: Built documentation hosting
|
description: Built documentation hosting
|
||||||
icon: mdi-web
|
icon: mdi-web
|
||||||
widget:
|
widget:
|
||||||
@ -53,7 +53,7 @@
|
|||||||
- Automation & Infrastructure:
|
- Automation & Infrastructure:
|
||||||
- n8n:
|
- n8n:
|
||||||
href: "http://localhost:5678"
|
href: "http://localhost:5678"
|
||||||
# href: "https://changeme.org:5678" # Uncomment for public access
|
# href: "https://n8n.reed.com" # Uncomment for public access
|
||||||
description: Workflow automation platform
|
description: Workflow automation platform
|
||||||
icon: mdi-workflow
|
icon: mdi-workflow
|
||||||
widget:
|
widget:
|
||||||
@ -74,5 +74,5 @@
|
|||||||
icon: mdi-database-outline
|
icon: mdi-database-outline
|
||||||
widget:
|
widget:
|
||||||
type: docker
|
type: docker
|
||||||
container: root_db
|
container: changemakerlite-root_db-1
|
||||||
server: my-docker
|
server: my-docker
|
||||||
|
|||||||
78
configs/homepage/services.yaml.backup_20250528_144546
Normal file
78
configs/homepage/services.yaml.backup_20250528_144546
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
---
|
||||||
|
# For public access, replace "http://localhost" with your subdomain URLs
|
||||||
|
|
||||||
|
- Essential Tools:
|
||||||
|
- Code Server:
|
||||||
|
href: "http://localhost:8888"
|
||||||
|
# href: "https://code.changeme.org" # Uncomment for public access
|
||||||
|
description: VS Code in the browser
|
||||||
|
icon: mdi-code-braces
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: code-server-changemaker
|
||||||
|
server: my-docker
|
||||||
|
- Listmonk:
|
||||||
|
href: "http://localhost:9000"
|
||||||
|
# href: "https://listmonk.changeme.org" # Uncomment for public access
|
||||||
|
description: Newsletter & mailing list manager
|
||||||
|
icon: mdi-email-newsletter
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: listmonk_app
|
||||||
|
server: my-docker
|
||||||
|
- NocoDB:
|
||||||
|
href: "http://localhost:8090"
|
||||||
|
# href: "https://db.changeme.org" # Uncomment for public access
|
||||||
|
description: No-code database platform
|
||||||
|
icon: mdi-database
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: changemakerlite-nocodb-1
|
||||||
|
server: my-docker
|
||||||
|
|
||||||
|
- Content & Documentation:
|
||||||
|
- MkDocs (Live):
|
||||||
|
href: "http://localhost:4000"
|
||||||
|
# href: "https://docs.changeme.org" # Uncomment for public access
|
||||||
|
description: Live documentation server with hot reload
|
||||||
|
icon: mdi-book-open-page-variant
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: mkdocs-changemaker
|
||||||
|
server: my-docker
|
||||||
|
- Static Site:
|
||||||
|
href: "http://localhost:4001"
|
||||||
|
# href: "https://test.com" # Uncomment for public access
|
||||||
|
description: Built documentation hosting
|
||||||
|
icon: mdi-web
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: mkdocs-site-server-changemaker
|
||||||
|
server: my-docker
|
||||||
|
|
||||||
|
- Automation & Infrastructure:
|
||||||
|
- n8n:
|
||||||
|
href: "http://localhost:5678"
|
||||||
|
# href: "https://n8n.changeme.org" # Uncomment for public access
|
||||||
|
description: Workflow automation platform
|
||||||
|
icon: mdi-workflow
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: n8n-changemaker
|
||||||
|
server: my-docker
|
||||||
|
- PostgreSQL (Listmonk):
|
||||||
|
href: "#"
|
||||||
|
description: Database for Listmonk
|
||||||
|
icon: mdi-database-outline
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: listmonk-db
|
||||||
|
server: my-docker
|
||||||
|
- PostgreSQL (NocoDB):
|
||||||
|
href: "#"
|
||||||
|
description: Database for NocoDB
|
||||||
|
icon: mdi-database-outline
|
||||||
|
widget:
|
||||||
|
type: docker
|
||||||
|
container: changemakerlite-root_db-1
|
||||||
|
server: my-docker
|
||||||
@ -29,35 +29,6 @@ services:
|
|||||||
hostname: ${LISTMONK_HOSTNAME}
|
hostname: ${LISTMONK_HOSTNAME}
|
||||||
depends_on:
|
depends_on:
|
||||||
- listmonk-db
|
- listmonk-db
|
||||||
command: [sh, -c, "./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''"]
|
|
||||||
environment:
|
|
||||||
LISTMONK_app__address: 0.0.0.0:9000
|
|
||||||
LISTMONK_db__user: ${POSTGRES_USER}
|
|
||||||
LISTMONK_db__password: ${POSTGRES_PASSWORD}
|
|
||||||
LISTMONK_db__database: ${POSTGRES_DB}
|
|
||||||
LISTMONK_db__host: listmonk-db
|
|
||||||
LISTMONK_db__port: 5432
|
|
||||||
LISTMONK_db__ssl_mode: disable
|
|
||||||
LISTMONK_db__max_open: 25
|
|
||||||
LISTMONK_db__max_idle: 25
|
|
||||||
LISTMONK_db__max_lifetime: 300s
|
|
||||||
TZ: Etc/UTC
|
|
||||||
LISTMONK_ADMIN_USER: ${LISTMONK_ADMIN_USER:-}
|
|
||||||
LISTMONK_ADMIN_PASSWORD: ${LISTMONK_ADMIN_PASSWORD:-}
|
|
||||||
# SMTP Configuration
|
|
||||||
LISTMONK_smtp__host: ${LISTMONK_SMTP_HOST:-}
|
|
||||||
LISTMONK_smtp__port: ${LISTMONK_SMTP_PORT:-587}
|
|
||||||
LISTMONK_smtp__auth_protocol: ${LISTMONK_SMTP_AUTH_PROTOCOL:-plain}
|
|
||||||
LISTMONK_smtp__username: ${LISTMONK_SMTP_USERNAME:-}
|
|
||||||
LISTMONK_smtp__password: ${LISTMONK_SMTP_PASSWORD:-}
|
|
||||||
LISTMONK_smtp__hello_hostname: ${LISTMONK_SMTP_HELLO_HOSTNAME:-}
|
|
||||||
LISTMONK_smtp__tls_enabled: ${LISTMONK_SMTP_TLS_ENABLED:-true}
|
|
||||||
LISTMONK_smtp__tls_skip_verify: ${LISTMONK_SMTP_TLS_SKIP_VERIFY:-false}
|
|
||||||
LISTMONK_smtp__max_conns: ${LISTMONK_SMTP_MAX_CONNS:-10}
|
|
||||||
LISTMONK_smtp__max_msg_retries: ${LISTMONK_SMTP_MAX_MSG_RETRIES:-2}
|
|
||||||
LISTMONK_smtp__idle_timeout: ${LISTMONK_SMTP_IDLE_TIMEOUT:-10s}
|
|
||||||
LISTMONK_smtp__wait_timeout: ${LISTMONK_SMTP_WAIT_TIMEOUT:-5s}
|
|
||||||
LISTMONK_smtp__email_headers: ${LISTMONK_SMTP_EMAIL_HEADERS:-}
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./assets/uploads:/listmonk/uploads:rw
|
- ./assets/uploads:/listmonk/uploads:rw
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user