diff --git a/.gitignore b/.gitignore
index 36f5075..4fa3c4d 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,9 @@
# Ignore all files in specific directories but keep .gitkeep files
+# .env files
+.env
+.env*
+
# code-server directories
configs/code-server/.config/code-server/*
!configs/code-server/.config/code-server/.gitkeep
@@ -39,5 +43,4 @@ answer-data/*
!answer-data/.gitkeep
-
.vscode
diff --git a/config.sh b/config.sh
index b76e6de..e3e0216 100755
--- a/config.sh
+++ b/config.sh
@@ -20,40 +20,285 @@ EOF
# Get the absolute path of the script directory
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ENV_FILE="$SCRIPT_DIR/.env"
+SERVICES_YAML="$SCRIPT_DIR/configs/homepage/services.yaml"
+WIDGETS_YAML="$SCRIPT_DIR/configs/homepage/widgets.yaml"
+MKDOCS_MAIN_HTML="$SCRIPT_DIR/mkdocs/docs/overrides/main.html"
echo "Looking for .env file at: $ENV_FILE"
-# Check if .env file exists
+# Initialize a new .env file if it doesn't exist
if [ ! -f "$ENV_FILE" ]; then
- echo "Error: .env file not found at $ENV_FILE"
- echo "Creating a backup plan - searching for .env in current directory..."
-
- if [ -f ".env" ]; then
- ENV_FILE=".env"
- echo "Found .env in current directory. Using: $ENV_FILE"
- else
- echo "Still no .env file found. Please make sure the .env file exists."
- exit 1
- fi
+ echo "No .env file found. Creating a new one from scratch."
+ touch "$ENV_FILE"
+ initialize_env_file
+else
+ echo "Found existing .env file. Will update values."
+ # Create a backup of the existing file
+ backup_env_file
fi
+# Function to update the services.yaml file with the new domain
+update_services_yaml() {
+ local new_domain=$1
+
+ if [ ! -f "$SERVICES_YAML" ]; then
+ echo "Warning: services.yaml file 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"
+
+ # Get the content of the services.yaml file
+ local content=$(cat "$SERVICES_YAML")
+
+ # Extract all unique domains from the file using grep with a more robust pattern
+ local domains=$(echo "$content" | grep -o 'https://[^[:space:]"]*' | cut -d'/' -f3 | sort | uniq)
+
+ # Check if we found any domains
+ if [ -z "$domains" ]; then
+ echo "Warning: Could not find any URLs in services.yaml"
+ return 1
+ fi
+
+ echo "Found these domains in services.yaml:"
+ echo "$domains"
+
+ # Extract the base domain pattern (e.g., betteredmonton.org)
+ local base_domain_pattern=$(echo "$domains" | head -1 | sed -E 's/^[^.]+\.//')
+
+ if [ -z "$base_domain_pattern" ]; then
+ echo "Warning: Could not extract base domain pattern from URLs"
+ return 1
+ fi
+
+ echo "Detected base domain pattern: $base_domain_pattern"
+ echo "Will replace with: $new_domain"
+
+ # Create a temporary file for the updated content
+ local temp_file=$(mktemp)
+
+ # Replace domain in all URLs
+ if ! echo "$content" | sed "s|$base_domain_pattern|$new_domain|g" > "$temp_file"; then
+ echo "Error: Failed to update domains in the file"
+ rm -f "$temp_file"
+ return 1
+ fi
+
+ # Check if the file has any changes
+ if ! grep -q "$new_domain" "$temp_file"; then
+ echo "Warning: No domain replacements were made. Check the domain pattern matching."
+ cat "$temp_file" | grep -o 'https://[^[:space:]"]*' | head -5
+ rm -f "$temp_file"
+ return 1
+ fi
+
+ # Count the number of URLs with the new domain
+ local replacements=$(grep -o "https://[^[:space:]\"]*$new_domain" "$temp_file" | wc -l)
+
+ # Move the modified file to replace the original
+ mv "$temp_file" "$SERVICES_YAML"
+
+ echo "Updated $replacements URLs in services.yaml to use $new_domain"
+ echo "Examples of updated URLs:"
+ grep -o "https://[^[:space:]\"]*$new_domain" "$SERVICES_YAML" | head -5
+
+ return 0
+}
+
+# Function to update the login URL in MkDocs main.html
+update_mkdocs_main_html() {
+ local new_domain=$1
+
+ if [ ! -f "$MKDOCS_MAIN_HTML" ]; then
+ echo "Warning: MkDocs main.html not found at $MKDOCS_MAIN_HTML"
+ return 1
+ fi
+
+ echo "Updating login button URL in MkDocs main.html..."
+
+ # Create a backup of the main.html file
+ local timestamp=$(date +"%Y%m%d_%H%M%S")
+ local backup_file="${MKDOCS_MAIN_HTML}.backup_${timestamp}"
+ cp "$MKDOCS_MAIN_HTML" "$backup_file"
+ echo "Created backup of main.html at $backup_file"
+
+ # Create a new file for the modified content
+ local new_file="${MKDOCS_MAIN_HTML}.new"
+
+ # Extract the current login URL from the login button
+ local login_line=$(grep -A 1 "{% block announce %}" "$MKDOCS_MAIN_HTML" | grep "login-button")
+ local current_url=$(echo "$login_line" | grep -o 'https://[^"]*')
+
+ if [ -z "$current_url" ] || [ -z "$login_line" ]; then
+ echo "Warning: Could not find the login button URL in main.html"
+ return 1
+ fi
+
+ # Create the replacement login line with the new domain
+ local new_login_line=$(echo "$login_line" | sed "s|$current_url|https://homepage.$new_domain|g")
+
+ # Create the new file by replacing the login line
+ while IFS= read -r line; do
+ if [[ "$line" == "$login_line" ]]; then
+ echo "$new_login_line" >> "$new_file"
+ else
+ echo "$line" >> "$new_file"
+ fi
+ done < "$MKDOCS_MAIN_HTML"
+
+ # Move the new file to replace the original
+ mv "$new_file" "$MKDOCS_MAIN_HTML"
+
+ echo "Updated login button URL in main.html from '$current_url' to 'https://homepage.$new_domain'"
+ return 0
+}
+
# Function to create a timestamped backup of the .env file
backup_env_file() {
- local timestamp=$(date +"%Y%m%d_%H%M%S")
- local backup_file="$ENV_FILE.backup_$timestamp"
-
- echo "Creating backup of current .env file to: $backup_file"
- if cp "$ENV_FILE" "$backup_file"; then
- echo "Backup created successfully!"
- return 0
- else
- echo "Failed to create backup file. Proceeding with caution..."
- return 1
+ if [ -f "$ENV_FILE" ]; then
+ local timestamp=$(date +"%Y%m%d_%H%M%S")
+ local backup_file="$ENV_FILE.backup_$timestamp"
+
+ echo "Creating backup of current .env file to: $backup_file"
+ if cp "$ENV_FILE" "$backup_file"; then
+ echo "Backup created successfully!"
+ return 0
+ else
+ echo "Failed to create backup file. Proceeding with caution..."
+ return 1
+ fi
fi
}
-# Create a backup of the current .env file before making any changes
-backup_env_file
+# Function to initialize the .env file with default values
+initialize_env_file() {
+ echo "Initializing new .env file with default values..."
+
+ # Create the new .env file with header
+ cat > "$ENV_FILE" << EOL
+# Never share this file publicly. It contains sensitive information.
+# This file is used to configure various applications and services.
+# Generated by Changemaker Config Wizard on $(date)
+
+# Domain Configuration
+DOMAIN=changeme.org
+BASE_DOMAIN=https://changeme.org
+
+# Listmonk Configuration
+LISTMONK_ADMIN_USER=admin
+LISTMONK_ADMIN_PASSWORD=strongpassword
+LISTMONK_PORT=9000
+LISTMONK_HOSTNAME=listmonk.changeme.org
+
+# Database Credentials
+POSTGRES_USER=listmonk
+POSTGRES_PASSWORD=$(generate_password 20)
+POSTGRES_DB=listmonk
+
+# Monica CRM Configuration
+MONICA_APP_KEY=base64:$(openssl rand -base64 32)
+MONICA_DB_USERNAME=monica
+MONICA_DB_PASSWORD=$(generate_password 20)
+MONICA_MYSQL_DATABASE=monica
+MONICA_MYSQL_USER=monica
+MONICA_MYSQL_PASSWORD=$(generate_password 20)
+
+# MkDocs Configuration
+USER_ID=1000
+GROUP_ID=1000
+MKDOCS_PORT=4000
+
+# Flatnotes Configuration
+FLATNOTES_PUID=1000
+FLATNOTES_PGID=1000
+FLATNOTES_AUTH_TYPE=password
+FLATNOTES_USERNAME=user
+FLATNOTES_PASSWORD=changeMe!
+FLATNOTES_SECRET_KEY=$(generate_password 32)
+FLATNOTES_PORT=8089
+
+# Gitea Configuration
+GITEA_DB_TYPE=mysql
+GITEA_DB_HOST=gitea-db:3306
+GITEA_DB_NAME=gitea
+GITEA_DB_USER=gitea
+GITEA_DB_PASSWD=$(generate_password 24)
+GITEA_DB_ROOT_PASSWORD=$(generate_password 24)
+GITEA_WEB_PORT=3030
+GITEA_SSH_PORT=2225
+GITEA_ROOT_URL=https://gitea.changeme.org
+GITEA_DOMAIN=gitea.changeme.org
+
+# Apache Answer Configuration
+ANSWER_APP_PORT=9080
+
+# Excalidraw Configuration
+EXCALIDRAW_PORT=3333
+EXCALIDRAW_LIBRARY_URL=https://libraries.excalidraw.com
+EXCALIDRAW_LIBRARY_BACKEND=https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries
+EXCALIDRAW_PUBLIC_URL=https://excalidraw.changeme.org
+EXCALIDRAW_PUBLIC_SOCKET_URL=https://excalidraw.changeme.org
+
+# Code Server Configuration
+CODE_SERVER_PORT=8888
+USER_NAME=coder
+
+# Cloudflare Credentials
+CF_AUTH_EMAIL=
+CF_API_TOKEN=
+CF_ZONE_ID=
+CF_TUNNEL_ID=
+CF_DOMAIN=changeme.org
+
+# NocoDB Configuration
+NOCODB_PORT=8090
+NOCODB_JWT_SECRET=$(generate_password 32)
+NOCODB_DB_NAME=nocodb
+NOCODB_DB_USER=noco
+NOCODB_DB_PASSWORD=$(generate_password 20)
+
+# OpenWebUI Configuration
+OPEN_WEBUI_PORT=3005
+OPEN_WEBUI_URL=https://open-webui.changeme.org
+
+# N8N Configuration
+N8N_PORT=5678
+N8N_HOST=n8n.changeme.org
+N8N_ENCRYPTION_KEY=$(generate_password 32)
+N8N_USER_EMAIL=admin@example.com
+N8N_USER_PASSWORD=changeMe
+GENERIC_TIMEZONE=UTC
+
+# ConvertX Configuration
+CONVERTX_PORT=3100
+CONVERTX_JWT_SECRET=$(generate_password 48)
+
+# Rocket.Chat Configuration
+ROCKETCHAT_IMAGE=registry.rocket.chat/rocketchat/rocket.chat
+ROCKETCHAT_RELEASE=latest
+ROCKETCHAT_PORT=3004
+ROCKETCHAT_CONTAINER_PORT=3000
+ROCKETCHAT_ROOT_URL=https://rocket.changeme.org
+ROCKETCHAT_DEPLOYMENT_ENVIRONMENT=changemaker
+ROCKETCHAT_MONGODB_VERSION=6.0
+ROCKETCHAT_MONGODB_HOST=mongodb-rocketchat
+ROCKETCHAT_MONGODB_PORT=27017
+ROCKETCHAT_MONGODB_DATABASE=rocketchat
+ROCKETCHAT_MONGODB_REPLICA_SET=rs0
+ROCKETCHAT_MONGODB_ENABLE_JOURNAL=true
+ROCKETCHAT_MONGODB_ALLOW_EMPTY_PASSWORD=yes
+
+# Additional Configuration
+EOL
+
+ echo "New .env file created with default values."
+}
# Function to generate a random secure password
generate_password() {
@@ -75,7 +320,6 @@ update_env_var() {
local escaped_value=$(echo "$value" | sed 's/[\/&]/\\&/g')
# Make a temporary backup of the .env file before modification
- # Adding "_tmp" to distinguish from the main backup
cp "$ENV_FILE" "$ENV_FILE.bak_tmp"
if grep -q "^$key=" "$ENV_FILE"; then
@@ -116,6 +360,54 @@ update_env_var() {
rm -f "$ENV_FILE.bak_tmp"
}
+# Function to update the greeting widget in widgets.yaml
+update_widgets_yaml() {
+ local new_domain=$1
+
+ if [ ! -f "$WIDGETS_YAML" ]; then
+ echo "Warning: widgets.yaml file not found at $WIDGETS_YAML"
+ return 1
+ fi
+
+ echo "Updating greeting widget in widgets.yaml..."
+
+ # Create a backup of the widgets.yaml file
+ local timestamp=$(date +"%Y%m%d_%H%M%S")
+ local backup_file="${WIDGETS_YAML}.backup_${timestamp}"
+ cp "$WIDGETS_YAML" "$backup_file"
+ echo "Created backup of widgets.yaml at $backup_file"
+
+ # Extract the site name (domain without TLD) for the greeting text
+ local site_name=$(echo "$new_domain" | cut -d. -f1)
+
+ # Create a temporary file for the modified content
+ local temp_file=$(mktemp)
+
+ # Read the file and replace the greeting text and href
+ awk -v site_name="$site_name" -v domain="$new_domain" '
+ /- greeting:/ {
+ print $0;
+ getline; print $0; # text_size line
+ getline; gsub(/text: .*/, "text: " site_name); print $0; # text line
+ getline; gsub(/href: .*/, "href: https://" domain); print $0; # href line
+ next;
+ }
+ { print $0; }
+ ' "$WIDGETS_YAML" > "$temp_file"
+
+ # Move the temporary file to replace the original
+ mv "$temp_file" "$WIDGETS_YAML"
+
+ echo "Updated greeting widget in widgets.yaml:"
+ echo " - Set text to: $site_name"
+ echo " - Set href to: https://$new_domain"
+
+ return 0
+}
+
+# Make sure the initialize_env_file function is available
+initialize_env_file
+
echo -e "\n\nWelcome to Changemaker Config!\n"
echo "This script will help you configure your Changemaker instance."
echo "Please provide the following information:"
@@ -150,6 +442,18 @@ echo -e "\nConfiguring OpenWebUI..."
update_env_var "OPEN_WEBUI_PORT" "3005"
update_env_var "OPEN_WEBUI_URL" "https://open-webui.$domain_name"
+# Update service URLs in the services.yaml file
+echo -e "\nUpdating service URLs in services.yaml file..."
+update_services_yaml "$domain_name"
+
+# Update the greeting widget in widgets.yaml
+echo -e "\nUpdating greeting widget in widgets.yaml..."
+update_widgets_yaml "$domain_name"
+
+# After domain configuration and updating services.yaml, update the login button URL
+echo -e "\nUpdating login button URL in MkDocs main.html..."
+update_mkdocs_main_html "$domain_name"
+
echo -e "Domain settings have been updated successfully!\n"
# Listmonk Admin Credentials configuration
@@ -208,7 +512,7 @@ if [ -z "$n8n_email" ]; then
fi
if [ -z "$n8n_password" ]; then
- echo "Using default N8N admin password"
+ echo "Using default N8N admin password: changeMe"
n8n_password="changeMe"
fi
diff --git a/configs/homepage/services.yaml b/configs/homepage/services.yaml
index d458153..c3c7b4f 100644
--- a/configs/homepage/services.yaml
+++ b/configs/homepage/services.yaml
@@ -1,79 +1,77 @@
---
-# For configuration options and examples, please see:
-# https://gethomepage.dev/configs/services/
- Essential Tools:
- code-server:
- href: https://code-server.betteredmonton.org
+ href: https://code-server.test.com
description: VS Code in the browser
icon: code-server
- Flatnotes:
- href: https://flatnotes.betteredmonton.org
+ href: https://flatnotes.test.com
description: Note-taking app - connected directly to blog
icon: flatnotes
- Listmonk:
- href: https://listmonk.betteredmonton.org
+ href: https://listmonk.test.com
description: Newsletter & mailing list manager
icon: listmonk
- NocoDB:
- href: https://nocodb.betteredmonton.org
+ href: https://nocodb.test.com
description: Open Source Airtable Alternative
icon: mdi-database
- Content Creation:
- MkDocs:
- href: https://live.betteredmonton.org
+ href: https://live.test.com
description: Website generator & documentation
icon: mkdocs
- Excalidraw:
- href: https://excalidraw.betteredmonton.org
+ href: https://excalidraw.test.com
description: Collaborative drawing tool
icon: mdi-draw-pen
- Gitea:
- href: https://gitea.betteredmonton.org
+ href: https://gitea.test.com
description: Self-hosted Git service
icon: gitea
- OpenWebUI:
- href: https://open-webui.betteredmonton.org
+ href: https://open-webui.test.com
description: UI for Ollama models
icon: mdi-robot-happy
- Community & Data:
- Monica CRM:
- href: https://monica.betteredmonton.org
+ href: https://monica.test.com
description: Personal CRM
icon: monica
- Answer:
- href: https://answer.betteredmonton.org
+ href: https://answer.test.com
description: Q&A platform for teams
icon: mdi-help-circle
- Ferdium:
- href: https://ferdium.betteredmonton.org
+ href: https://ferdium.test.com
description: All-in-one messaging app
icon: ferdium
- Rocket.Chat:
- href: https://rocket.betteredmonton.org
+ href: https://rocket.test.com
description: Team collaboration platform
icon: mdi-rocket
- Development:
- Ollama:
- href: https://ollama.betteredmonton.org
+ href: https://ollama.test.com
description: Local AI model server
icon: ollama
- Portainer:
- href: https://portainer.betteredmonton.org
+ href: https://portainer.test.com
description: Docker management UI
icon: portainer
- Mini QR:
- href: https://mini-qr.betteredmonton.org
+ href: https://mini-qr.test.com
description: QR Code Generator
icon: mdi-qrcode-edit
- ConvertX:
- href: https://convertx.betteredmonton.org
+ href: https://convertx.test.com
description: File conversion tool
icon: mdi-file-sync
- n8n:
- href: https://n8n.betteredmonton.org
+ href: https://n8n.test.com
description: Workflow automation
icon: n8n
diff --git a/configs/homepage/widgets.yaml b/configs/homepage/widgets.yaml
old mode 100755
new mode 100644
index 9f27cbf..cd7a6bc
--- a/configs/homepage/widgets.yaml
+++ b/configs/homepage/widgets.yaml
@@ -9,8 +9,8 @@
- greeting:
text_size: xl
- text: betteredmonton
- href: https://betteredmonton.org
+ text: test
+ href: https://test.com
- datetime:
text_size: xl
diff --git a/mkdocs/docs/overrides/main.html b/mkdocs/docs/overrides/main.html
index db9be4d..61eb059 100644
--- a/mkdocs/docs/overrides/main.html
+++ b/mkdocs/docs/overrides/main.html
@@ -1,4 +1,3 @@
{% extends "base.html" %} {% block extrahead %} {% endblock %} {% block announce %}
-Login
-Changemaker Archive. Learn more
-{% endblock %} {% block scripts %} {{ super() }} {% endblock %}
\ No newline at end of file
+Login
+Changemaker Archive. Learn more