udpated the config, add cnames,. docker compose, tunnel configs.

This commit is contained in:
admin 2025-05-28 14:53:33 -06:00
parent 3b091eb57a
commit 588a3255a9
7 changed files with 317 additions and 163 deletions

View File

@ -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
View File

@ -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..."

View 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

View File

@ -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

View File

@ -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

View 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

View File

@ -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