first commit
46
.gitignore
vendored
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
# Ignore all files in specific directories but keep .gitkeep files
|
||||||
|
|
||||||
|
# .env files
|
||||||
|
.env
|
||||||
|
|
||||||
|
# code-server directories
|
||||||
|
configs/code-server/.config/code-server/*
|
||||||
|
!configs/code-server/.config/code-server/.gitkeep
|
||||||
|
|
||||||
|
configs/code-server/.local/*
|
||||||
|
!configs/code-server/.local/.gitkeep
|
||||||
|
|
||||||
|
# ferdium directory
|
||||||
|
configs/ferdium/*
|
||||||
|
!configs/ferdium/.gitkeep
|
||||||
|
|
||||||
|
# flatnotes directory
|
||||||
|
mkdocs/docs/notes/.flatnotes/*
|
||||||
|
!mkdocs/docs/notes/.flatnotes/.gitkeep
|
||||||
|
|
||||||
|
# attachments directory
|
||||||
|
mkdocs/docs/blog/posts/attachments/*
|
||||||
|
!mkdocs/docs/blog/posts/attachments/.gitkeep
|
||||||
|
|
||||||
|
# data directory
|
||||||
|
data/*
|
||||||
|
!data/.gitkeep
|
||||||
|
|
||||||
|
# local-files
|
||||||
|
local-files/*
|
||||||
|
!local-files/.gitkeep
|
||||||
|
|
||||||
|
# Convertx
|
||||||
|
convertx-data/*
|
||||||
|
!convertx-data/.gitkeep
|
||||||
|
|
||||||
|
# Env Backups
|
||||||
|
.env.backup*
|
||||||
|
|
||||||
|
# answers data
|
||||||
|
answer-data/*
|
||||||
|
!answer-data/.gitkeep
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.vscode
|
84
Dockerfile.code-server
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
FROM codercom/code-server:latest
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install Python and dependencies
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
python3-full \
|
||||||
|
pipx \
|
||||||
|
# Dependencies for CairoSVG and Pillow (PIL)
|
||||||
|
libcairo2-dev \
|
||||||
|
libfreetype6-dev \
|
||||||
|
libffi-dev \
|
||||||
|
libjpeg-dev \
|
||||||
|
libpng-dev \
|
||||||
|
libz-dev \
|
||||||
|
python3-dev \
|
||||||
|
pkg-config \
|
||||||
|
# Additional dependencies for advanced image processing
|
||||||
|
libwebp-dev \
|
||||||
|
libtiff5-dev \
|
||||||
|
libopenjp2-7-dev \
|
||||||
|
liblcms2-dev \
|
||||||
|
libxml2-dev \
|
||||||
|
libxslt1-dev \
|
||||||
|
# PDF generation dependencies
|
||||||
|
weasyprint \
|
||||||
|
fonts-roboto \
|
||||||
|
# Git for git-based plugins
|
||||||
|
git \
|
||||||
|
# For lxml
|
||||||
|
zlib1g-dev \
|
||||||
|
# Required for some plugins
|
||||||
|
build-essential \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Switch to non-root user (coder)
|
||||||
|
USER coder
|
||||||
|
|
||||||
|
# Set up a virtual environment for mkdocs
|
||||||
|
RUN mkdir -p /home/coder/.venv
|
||||||
|
RUN python3 -m venv /home/coder/.venv/mkdocs
|
||||||
|
|
||||||
|
# Install mkdocs-material in the virtual environment with all extras
|
||||||
|
RUN /home/coder/.venv/mkdocs/bin/pip install "mkdocs-material[imaging,recommended,git]"
|
||||||
|
|
||||||
|
# Install additional useful MkDocs plugins
|
||||||
|
RUN /home/coder/.venv/mkdocs/bin/pip install \
|
||||||
|
mkdocs-minify-plugin \
|
||||||
|
mkdocs-git-revision-date-localized-plugin \
|
||||||
|
mkdocs-glightbox \
|
||||||
|
mkdocs-redirects \
|
||||||
|
mkdocs-awesome-pages-plugin \
|
||||||
|
mkdocs-blog-plugin \
|
||||||
|
mkdocs-rss-plugin \
|
||||||
|
mkdocs-meta-descriptions-plugin \
|
||||||
|
mkdocs-swagger-ui-tag \
|
||||||
|
mkdocs-macros-plugin \
|
||||||
|
mkdocs-material-extensions \
|
||||||
|
mkdocs-section-index \
|
||||||
|
mkdocs-table-reader-plugin \
|
||||||
|
mkdocs-pdf-export-plugin \
|
||||||
|
mkdocs-mermaid2-plugin \
|
||||||
|
pymdown-extensions \
|
||||||
|
pygments \
|
||||||
|
pillow \
|
||||||
|
cairosvg
|
||||||
|
|
||||||
|
# Add the virtual environment bin to PATH
|
||||||
|
ENV PATH="/home/coder/.venv/mkdocs/bin:${PATH}"
|
||||||
|
|
||||||
|
# Add shell configuration to activate the virtual environment in .bashrc
|
||||||
|
RUN echo 'export PATH="/home/coder/.venv/mkdocs/bin:$PATH"' >> ~/.bashrc
|
||||||
|
RUN echo 'export PATH="/home/coder/.local/bin:$PATH"' >> ~/.bashrc
|
||||||
|
|
||||||
|
# Create a convenience script to simplify running mkdocs commands
|
||||||
|
RUN mkdir -p /home/coder/.local/bin \
|
||||||
|
&& echo '#!/bin/bash\ncd /home/coder/mkdocs\nmkdocs "$@"' > /home/coder/.local/bin/run-mkdocs \
|
||||||
|
&& chmod +x /home/coder/.local/bin/run-mkdocs
|
||||||
|
|
||||||
|
WORKDIR /home/coder
|
5
README.md
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
# README
|
||||||
|
|
||||||
|
## bnkops.custom.changemaker
|
||||||
|
|
||||||
|
This branch is BNKops custom branch for our own deployment.
|
238
add-cname-records.sh
Executable file
@ -0,0 +1,238 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "#############################################################"
|
||||||
|
echo "# "
|
||||||
|
echo "# WARNING: This script will REPLACE ALL DNS records at "
|
||||||
|
echo "# the target domain ($CF_DOMAIN)! "
|
||||||
|
echo "# "
|
||||||
|
echo "# All existing DNS records for the listed subdomains will "
|
||||||
|
echo "# be deleted and replaced with new CNAME records. "
|
||||||
|
echo "# "
|
||||||
|
echo "#############################################################"
|
||||||
|
echo ""
|
||||||
|
echo "-------------------------------------------------------------"
|
||||||
|
echo "Cloudflare Credentials Required"
|
||||||
|
echo "Please ensure your .env file contains the following variables:"
|
||||||
|
echo " CF_API_TOKEN=your_cloudflare_api_token"
|
||||||
|
echo " CF_ZONE_ID=your_cloudflare_zone_id"
|
||||||
|
echo " CF_TUNNEL_ID=your_cloudflared_tunnel_id"
|
||||||
|
echo " CF_DOMAIN=yourdomain.com"
|
||||||
|
echo ""
|
||||||
|
echo "You can find these values in your Cloudflare dashboard:"
|
||||||
|
echo " - API Token: https://dash.cloudflare.com/profile/api-tokens (Create a token with Zone:DNS:Edit and Access:Apps:Edit permissions for your domain)"
|
||||||
|
echo " - Zone ID: On your domain's overview page"
|
||||||
|
echo " - Tunnel ID: In the Zero Trust dashboard under Access > Tunnels"
|
||||||
|
echo " - Domain: The domain you want to use for your services"
|
||||||
|
echo ""
|
||||||
|
echo "-------------------------------------------------------------"
|
||||||
|
echo ""
|
||||||
|
read -p "Type 'y' to continue or any other key to abort: " consent
|
||||||
|
if [[ "$consent" != "y" && "$consent" != "Y" ]]; then
|
||||||
|
echo "Aborted by user."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Source environment variables from the .env file in the same directory
|
||||||
|
ENV_FILE="$(dirname "$0")/.env"
|
||||||
|
if [ -f "$ENV_FILE" ]; then
|
||||||
|
export $(grep -v '^#' "$ENV_FILE" | xargs)
|
||||||
|
else
|
||||||
|
echo "Error: .env file not found at $ENV_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if required Cloudflare variables are set
|
||||||
|
if [ -z "$CF_API_TOKEN" ] || [ -z "$CF_ZONE_ID" ] || [ -z "$CF_TUNNEL_ID" ] || [ -z "$CF_DOMAIN" ]; then
|
||||||
|
echo "Error: One or more required Cloudflare environment variables (CF_API_TOKEN, CF_ZONE_ID, CF_TUNNEL_ID, CF_DOMAIN) are not set in $ENV_FILE."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if jq is installed
|
||||||
|
if ! command -v jq &> /dev/null; then
|
||||||
|
echo "Error: jq is required but not installed. Please install jq to continue."
|
||||||
|
echo "On Debian/Ubuntu: sudo apt-get install jq"
|
||||||
|
echo "On RHEL/CentOS: sudo yum install jq"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Array of subdomains based on docker-compose.yml services
|
||||||
|
SUBDOMAINS=(
|
||||||
|
"homepage"
|
||||||
|
"excalidraw"
|
||||||
|
"listmonk"
|
||||||
|
"monica"
|
||||||
|
"flatnotes"
|
||||||
|
"code-server"
|
||||||
|
"ollama"
|
||||||
|
"open-webui"
|
||||||
|
"gitea"
|
||||||
|
"mini-qr"
|
||||||
|
"ferdium"
|
||||||
|
"answer"
|
||||||
|
"nocodb"
|
||||||
|
"n8n"
|
||||||
|
"convertx"
|
||||||
|
"rocket"
|
||||||
|
"live"
|
||||||
|
)
|
||||||
|
|
||||||
|
# First, remove existing DNS records for these subdomains
|
||||||
|
echo "Removing existing DNS records..."
|
||||||
|
|
||||||
|
for subdomain in "${SUBDOMAINS[@]}"; do
|
||||||
|
echo "Checking for existing records for $subdomain.$CF_DOMAIN..."
|
||||||
|
|
||||||
|
# Get all DNS records for this subdomain
|
||||||
|
RECORDS=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records?name=$subdomain.$CF_DOMAIN" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json")
|
||||||
|
|
||||||
|
# Extract record IDs
|
||||||
|
RECORD_IDS=$(echo $RECORDS | jq -r '.result[].id')
|
||||||
|
|
||||||
|
# Delete each record
|
||||||
|
for record_id in $RECORD_IDS; do
|
||||||
|
echo "Deleting record $record_id for $subdomain.$CF_DOMAIN..."
|
||||||
|
|
||||||
|
curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records/$record_id" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All existing records have been removed."
|
||||||
|
|
||||||
|
# Add CNAME records for each subdomain
|
||||||
|
for subdomain in "${SUBDOMAINS[@]}"; do
|
||||||
|
echo "Adding CNAME record for $subdomain.$CF_DOMAIN..."
|
||||||
|
|
||||||
|
curl -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
--data "{
|
||||||
|
\"type\": \"CNAME\",
|
||||||
|
\"name\": \"$subdomain\",
|
||||||
|
\"content\": \"$CF_TUNNEL_ID.cfargotunnel.com\",
|
||||||
|
\"ttl\": 1,
|
||||||
|
\"proxied\": true
|
||||||
|
}"
|
||||||
|
|
||||||
|
echo -e "\n"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All CNAME records have been added."
|
||||||
|
|
||||||
|
# Add root domain record
|
||||||
|
echo "Adding root domain (@ record)..."
|
||||||
|
curl -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
--data "{
|
||||||
|
\"type\": \"CNAME\",
|
||||||
|
\"name\": \"@\",
|
||||||
|
\"content\": \"$CF_TUNNEL_ID.cfargotunnel.com\",
|
||||||
|
\"ttl\": 1,
|
||||||
|
\"proxied\": true
|
||||||
|
}"
|
||||||
|
echo -e "\n"
|
||||||
|
echo "Root domain CNAME record has been added."
|
||||||
|
|
||||||
|
# Now create the Cloudflare Access applications
|
||||||
|
echo "Creating Cloudflare Access applications..."
|
||||||
|
|
||||||
|
# 1. Create wildcard access application for all subdomains
|
||||||
|
echo "Creating wildcard access application for *.$CF_DOMAIN..."
|
||||||
|
WILDCARD_APP_RESPONSE=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/access/apps" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
--data "{
|
||||||
|
\"name\": \"All Applications - $CF_DOMAIN\",
|
||||||
|
\"domain\": \"*.$CF_DOMAIN\",
|
||||||
|
\"type\": \"self_hosted\",
|
||||||
|
\"session_duration\": \"24h\",
|
||||||
|
\"app_launcher_visible\": true,
|
||||||
|
\"skip_interstitial\": true
|
||||||
|
}")
|
||||||
|
|
||||||
|
# Extract the application ID from the response
|
||||||
|
WILDCARD_APP_ID=$(echo $WILDCARD_APP_RESPONSE | jq -r '.result.id')
|
||||||
|
|
||||||
|
if [ -z "$WILDCARD_APP_ID" ] || [ "$WILDCARD_APP_ID" == "null" ]; then
|
||||||
|
echo "Error creating wildcard access application. Response: $WILDCARD_APP_RESPONSE"
|
||||||
|
else
|
||||||
|
echo "Successfully created wildcard access application with ID: $WILDCARD_APP_ID"
|
||||||
|
|
||||||
|
# Create policy for emails ending with the domain
|
||||||
|
echo "Creating email domain policy for wildcard application..."
|
||||||
|
EMAIL_DOMAIN=$(echo $CF_DOMAIN | cut -d'.' -f1,2)
|
||||||
|
|
||||||
|
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/access/apps/$WILDCARD_APP_ID/policies" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
--data "{
|
||||||
|
\"name\": \"Allow Domain Emails\",
|
||||||
|
\"decision\": \"allow\",
|
||||||
|
\"include\": [{
|
||||||
|
\"email_domain\": {
|
||||||
|
\"domain\": \"$EMAIL_DOMAIN\"
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
\"require\": [],
|
||||||
|
\"exclude\": [],
|
||||||
|
\"precedence\": 1,
|
||||||
|
\"purpose\": \"Authentication for domain users\",
|
||||||
|
\"session_duration\": \"24h\"
|
||||||
|
}"
|
||||||
|
|
||||||
|
echo "Email domain policy created."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Create specific access application for Gitea
|
||||||
|
echo "Creating access application for gitea.$CF_DOMAIN..."
|
||||||
|
GITEA_APP_RESPONSE=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/access/apps" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
--data "{
|
||||||
|
\"name\": \"Gitea $CF_DOMAIN\",
|
||||||
|
\"domain\": \"gitea.$CF_DOMAIN\",
|
||||||
|
\"type\": \"self_hosted\",
|
||||||
|
\"app_launcher_visible\": true,
|
||||||
|
\"skip_interstitial\": true
|
||||||
|
}")
|
||||||
|
|
||||||
|
# Extract the application ID from the response
|
||||||
|
GITEA_APP_ID=$(echo $GITEA_APP_RESPONSE | jq -r '.result.id')
|
||||||
|
|
||||||
|
if [ -z "$GITEA_APP_ID" ] || [ "$GITEA_APP_ID" == "null" ]; then
|
||||||
|
echo "Error creating Gitea access application. Response: $GITEA_APP_RESPONSE"
|
||||||
|
else
|
||||||
|
echo "Successfully created Gitea access application with ID: $GITEA_APP_ID"
|
||||||
|
|
||||||
|
# Create bypass policy for everyone - Updated format
|
||||||
|
echo "Creating bypass policy for Gitea application..."
|
||||||
|
|
||||||
|
POLICY_RESPONSE=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/access/apps/$GITEA_APP_ID/policies" \
|
||||||
|
-H "Authorization: Bearer $CF_API_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
--data "{
|
||||||
|
\"name\": \"Bypass for Everyone\",
|
||||||
|
\"decision\": \"bypass\",
|
||||||
|
\"include\": [{
|
||||||
|
\"everyone\": {}
|
||||||
|
}],
|
||||||
|
\"require\": [],
|
||||||
|
\"exclude\": []
|
||||||
|
}")
|
||||||
|
|
||||||
|
# Check if policy creation was successful
|
||||||
|
POLICY_SUCCESS=$(echo $POLICY_RESPONSE | jq -r '.success')
|
||||||
|
|
||||||
|
if [ "$POLICY_SUCCESS" == "true" ]; then
|
||||||
|
POLICY_ID=$(echo $POLICY_RESPONSE | jq -r '.result.id')
|
||||||
|
echo "Bypass policy for Gitea created successfully with ID: $POLICY_ID"
|
||||||
|
else
|
||||||
|
ERROR_MSG=$(echo $POLICY_RESPONSE | jq -r '.errors[0].message')
|
||||||
|
echo "Error creating bypass policy for Gitea: $ERROR_MSG"
|
||||||
|
echo "Full response: $POLICY_RESPONSE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Cloudflare Access applications setup complete."
|
0
answer-data/.gitkeep
Normal file
144
apps.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# Changemaker V5 - Apps & Services Documentation
|
||||||
|
|
||||||
|
This document provides an overview of all the applications and services included in the Changemaker V5 productivity suite, along with links to their documentation.
|
||||||
|
|
||||||
|
## Dashboard
|
||||||
|
|
||||||
|
### Homepage
|
||||||
|
- **Description**: Main dashboard for Changemaker V5
|
||||||
|
- **Documentation**: [Homepage Docs](https://gethomepage.dev/)
|
||||||
|
- **Local Access**: http://localhost:3010/
|
||||||
|
- **Details**: Homepage serves as your central command center, providing a unified dashboard to access all Changemaker services from one place. It features customizable layouts, service status monitoring, and bookmarks to frequently used pages, eliminating the need to remember numerous URLs.
|
||||||
|
|
||||||
|
## Essential Tools
|
||||||
|
|
||||||
|
### Code Server
|
||||||
|
- **Description**: Visual Studio Code in the browser
|
||||||
|
- **Documentation**: [Code Server Docs](https://coder.com/docs/code-server)
|
||||||
|
- **Local Access**: http://localhost:8888/
|
||||||
|
- **Details**: Code Server brings the power of VS Code to your browser, allowing you to develop and edit code from any device without local installation. This makes it perfect for quick edits to website content, fixing formatting issues, or developing from tablets or borrowed computers. The familiar VS Code interface includes extensions, syntax highlighting, and Git integration.
|
||||||
|
|
||||||
|
### Flatnotes
|
||||||
|
- **Description**: Simple note-taking app - connected directly to blog
|
||||||
|
- **Documentation**: [Flatnotes Docs](https://github.com/Dullage/Flatnotes)
|
||||||
|
- **Local Access**: http://localhost:8089/
|
||||||
|
- **Details**: Flatnotes offers distraction-free, markdown-based note-taking with automatic saving and powerful search. Perfect for capturing ideas that can be directly published to your blog without reformatting. Use it for drafting newsletters, documenting processes, or maintaining a knowledge base that's both private and publishable.
|
||||||
|
|
||||||
|
### Listmonk
|
||||||
|
- **Description**: Self-hosted newsletter and mailing list manager
|
||||||
|
- **Documentation**: [Listmonk Docs](https://listmonk.app/docs/)
|
||||||
|
- **Local Access**: http://localhost:9000/
|
||||||
|
- **Details**: Listmonk provides complete control over your email campaigns without subscription fees or content restrictions. Create segmented lists, design professional newsletters, track engagement metrics, and manage opt-ins/unsubscribes—all while keeping your audience data private. Perfect for consistent communication with supporters without the censorship risks or costs of commercial platforms.
|
||||||
|
|
||||||
|
### NocoDB
|
||||||
|
- **Description**: Open Source Airtable Alternative
|
||||||
|
- **Documentation**: [NocoDB Docs](https://docs.nocodb.com/)
|
||||||
|
- **Local Access**: http://localhost:8090/
|
||||||
|
- **Details**: NocoDB transforms any database into a smart spreadsheet with advanced features like forms, views, and automations. Use it to create volunteer signup systems, event management databases, or campaign tracking tools without subscription costs. Its familiar spreadsheet interface makes it accessible to non-technical users while providing the power of a relational database.
|
||||||
|
|
||||||
|
## Content Creation
|
||||||
|
|
||||||
|
### MkDocs - Material Theme
|
||||||
|
- **Description**: Static site generator and documentation builder
|
||||||
|
- **Documentation**: [MkDocs Docs](https://www.mkdocs.org/)
|
||||||
|
- **Local Access**: http://localhost:4000/
|
||||||
|
- **Details**: MkDocs with Material theme transforms simple markdown files into beautiful, professional documentation sites. Ideal for creating campaign websites, project documentation, or public-facing content that loads quickly and ranks well in search engines. The Material theme adds responsive design, dark mode, and advanced navigation features.
|
||||||
|
|
||||||
|
### Excalidraw
|
||||||
|
- **Description**: Virtual collaborative whiteboard for sketching and drawing
|
||||||
|
- **Documentation**: [Excalidraw Docs](https://github.com/excalidraw/excalidraw)
|
||||||
|
- **Local Access**: http://localhost:3333/
|
||||||
|
- **Details**: Excalidraw provides a virtual whiteboard for creating diagrams, flowcharts, or sketches with a hand-drawn feel. It's excellent for visual brainstorming, planning project workflows, or mapping out campaign strategies. Multiple people can collaborate in real-time, making it ideal for remote team planning sessions.
|
||||||
|
|
||||||
|
### Gitea
|
||||||
|
- **Description**: Lightweight self-hosted Git service
|
||||||
|
- **Documentation**: [Gitea Docs](https://docs.gitea.io/)
|
||||||
|
- **Local Access**: http://localhost:3030/
|
||||||
|
- **Details**: Gitea provides a complete code and document version control system similar to GitHub but fully under your control. Use it to track changes to campaign materials, collaborate on content development, manage website code, or maintain configuration files with full revision history. Multiple contributors can work together without overwriting each other's changes.
|
||||||
|
|
||||||
|
### OpenWebUI
|
||||||
|
- **Description**: Web interface for Ollama
|
||||||
|
- **Documentation**: [OpenWebUI Docs](https://docs.openwebui.com/)
|
||||||
|
- **Local Access**: http://localhost:3005/
|
||||||
|
- **Details**: OpenWebUI provides a user-friendly chat interface for interacting with your Ollama AI models. This makes AI accessible to non-technical team members for tasks like drafting responses, generating creative content, or researching topics. The familiar chat format allows anyone to leverage AI assistance without needing to understand the underlying technology.
|
||||||
|
|
||||||
|
## Community & Data
|
||||||
|
|
||||||
|
### Monica CRM
|
||||||
|
- **Description**: Personal relationship management system
|
||||||
|
- **Documentation**: [Monica Docs](https://www.monicahq.com/docs)
|
||||||
|
- **Local Access**: http://localhost:8085/
|
||||||
|
- **Details**: Monica CRM helps you maintain meaningful relationships by tracking interactions, important dates, and personal details about contacts. It's perfect for community organizers to remember conversation contexts, follow up appropriately, and nurture connections with supporters. Unlike corporate CRMs, Monica focuses on the human aspects of relationships rather than just sales metrics.
|
||||||
|
|
||||||
|
### Answer
|
||||||
|
- **Description**: Q&A platform for teams
|
||||||
|
- **Documentation**: [Answer Docs](https://answer.dev/docs)
|
||||||
|
- **Local Access**: http://localhost:9080/
|
||||||
|
- **Details**: Answer creates a knowledge-sharing community where team members or supporters can ask questions, provide solutions, and vote on the best responses. It builds an organized, searchable knowledge base that grows over time. Use it for internal team support, public FAQs, or gathering community input on initiatives while keeping valuable information accessible rather than buried in email threads.
|
||||||
|
|
||||||
|
### Ferdium
|
||||||
|
- **Description**: All-in-one messaging application
|
||||||
|
- **Documentation**: [Ferdium Docs](https://ferdium.org/help)
|
||||||
|
- **Local Access**: http://localhost:3002/
|
||||||
|
- **Details**: Ferdium consolidates all your communication platforms (Slack, Discord, WhatsApp, Telegram, etc.) into a single interface. This allows you to monitor and respond across channels without constantly switching applications. Perfect for community managers who need to maintain presence across multiple platforms without missing messages or getting overwhelmed.
|
||||||
|
|
||||||
|
### Rocket.Chat
|
||||||
|
- **Description**: Team collaboration platform with chat, channels, and video conferencing
|
||||||
|
- **Documentation**: [Rocket.Chat Docs](https://docs.rocket.chat/)
|
||||||
|
- **Local Access**: http://localhost:3004/
|
||||||
|
- **Details**: Rocket.Chat provides a complete communication platform for your team or community. Features include real-time chat, channels, direct messaging, file sharing, video calls, and integrations with other services. It's perfect for creating private discussion spaces, coordinating campaigns, or building community engagement. Unlike commercial platforms, you maintain full data sovereignty and control over user privacy.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Ollama
|
||||||
|
- **Description**: Local AI model server for running large language models
|
||||||
|
- **Documentation**: [Ollama Docs](https://ollama.ai/docs)
|
||||||
|
- **Local Access**: http://localhost:11435/
|
||||||
|
- **Details**: Ollama runs powerful AI language models locally on your server, providing AI capabilities without sending sensitive data to third-party services. Use it for content generation, research assistance, or data analysis with complete privacy. Models run on your hardware, giving you full control over what AI can access and ensuring your information stays confidential.
|
||||||
|
|
||||||
|
### Portainer
|
||||||
|
- **Description**: Docker container management UI
|
||||||
|
- **Documentation**: [Portainer Docs](https://docs.portainer.io/)
|
||||||
|
- **Local Access**: https://localhost:9443/
|
||||||
|
- **Details**: Portainer simplifies Docker management with a visual interface for controlling containers, images, networks, and volumes. Instead of complex command-line operations, you can start/stop services, view logs, and manage resources through an intuitive UI, making system maintenance accessible to non-technical users.
|
||||||
|
|
||||||
|
### Mini-QR
|
||||||
|
- **Description**: QR Code Generator
|
||||||
|
- **Documentation**: [Mini-QR Docs](https://github.com/xbzbing/mini-qr)
|
||||||
|
- **Local Access**: http://localhost:8081/
|
||||||
|
- **Details**: Mini-QR enables you to quickly generate customizable QR codes for any URL, text, or contact information. Perfect for campaign materials, business cards, or event signage. Create codes that link to your digital materials without relying on third-party services that may track usage or expire.
|
||||||
|
|
||||||
|
### ConvertX
|
||||||
|
- **Description**: Self-hosted file conversion tool
|
||||||
|
- **Documentation**: [ConvertX GitHub](https://github.com/c4illin/convertx)
|
||||||
|
- **Local Access**: http://localhost:3100/
|
||||||
|
- **Details**: ConvertX provides a simple web interface for converting files between different formats. It supports a wide range of file types including documents, images, audio, and video. This enables you to maintain full control over your file conversions without relying on potentially insecure third-party services. Perfect for converting documents for campaigns, optimizing images for web use, or preparing media files for different platforms.
|
||||||
|
|
||||||
|
### n8n
|
||||||
|
- **Description**: Workflow automation platform
|
||||||
|
- **Documentation**: [n8n Docs](https://docs.n8n.io/)
|
||||||
|
- **Local Access**: http://localhost:5678/
|
||||||
|
- **Details**: n8n automates repetitive tasks by connecting your applications and services with visual workflows. You can create automations like sending welcome emails to new supporters, posting social media updates across platforms, or synchronizing contacts between databases—all without coding. This saves hours of manual work and ensures consistent follow-through on processes.
|
||||||
|
|
||||||
|
## Remote Access
|
||||||
|
|
||||||
|
When configured with Cloudflare Tunnels, you can access these services remotely at:
|
||||||
|
|
||||||
|
- Homepage: https://homepage.yourdomain.com
|
||||||
|
- Excalidraw: https://excalidraw.yourdomain.com
|
||||||
|
- Listmonk: https://listmonk.yourdomain.com
|
||||||
|
- Monica CRM: https://monica.yourdomain.com
|
||||||
|
- MkDocs: https://yourdomain.com
|
||||||
|
- Flatnotes: https://flatnotes.yourdomain.com
|
||||||
|
- Code Server: https://code-server.yourdomain.com
|
||||||
|
- Ollama: https://ollama.yourdomain.com
|
||||||
|
- OpenWebUI: https://open-web-ui.yourdomain.com
|
||||||
|
- Gitea: https://gitea.yourdomain.com
|
||||||
|
- Portainer: https://portainer.yourdomain.com
|
||||||
|
- Mini QR: https://mini-qr.yourdomain.com
|
||||||
|
- Ferdium: https://ferdium.yourdomain.com
|
||||||
|
- Answer: https://answer.yourdomain.com
|
||||||
|
- NocoDB: https://nocodb.yourdomain.com
|
||||||
|
- n8n: https://n8n.yourdomain.com
|
||||||
|
- ConvertX: https://convertx.yourdomain.com
|
||||||
|
- Rocket.Chat: https://rocket.yourdomain.com
|
0
assets/icons/.gitkeep
Normal file
BIN
assets/images/background.png
Executable file
After Width: | Height: | Size: 962 KiB |
BIN
assets/images/buildyourpower.png
Normal file
After Width: | Height: | Size: 748 KiB |
BIN
assets/images/changemaker.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
assets/images/changemkaerv5.gif
Normal file
After Width: | Height: | Size: 25 MiB |
BIN
assets/images/homepage.png
Normal file
After Width: | Height: | Size: 851 KiB |
0
assets/uploads/.gitkeep
Normal file
442
config.sh
Executable file
@ -0,0 +1,442 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cat << "EOF"
|
||||||
|
██████╗██╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗
|
||||||
|
██╔════╝██║ ██║██╔══██╗████╗ ██║██╔════╝ ██╔════╝
|
||||||
|
██║ ███████║███████║██╔██╗ ██║██║ ███╗█████╗
|
||||||
|
██║ ██╔══██║██╔══██║██║╚██╗██║██║ ██║██╔══╝
|
||||||
|
╚██████╗██║ ██║██║ ██║██║ ╚████║╚██████╔╝███████╗
|
||||||
|
╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝
|
||||||
|
|
||||||
|
███╗ ███╗ █████╗ ██╗ ██╗███████╗██████╗
|
||||||
|
████╗ ████║██╔══██╗██║ ██╔╝██╔════╝██╔══██╗
|
||||||
|
██╔████╔██║███████║█████╔╝ █████╗ ██████╔╝
|
||||||
|
██║╚██╔╝██║██╔══██║██╔═██╗ ██╔══╝ ██╔══██╗
|
||||||
|
██║ ╚═╝ ██║██║ ██║██║ ██╗███████╗██║ ██║
|
||||||
|
╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
|
||||||
|
Configuration Wizard
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Get the absolute path of the script directory
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
ENV_FILE="$SCRIPT_DIR/.env"
|
||||||
|
|
||||||
|
echo "Looking for .env file at: $ENV_FILE"
|
||||||
|
|
||||||
|
# Check if .env file exists
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a backup of the current .env file before making any changes
|
||||||
|
backup_env_file
|
||||||
|
|
||||||
|
# Function to generate a random secure password
|
||||||
|
generate_password() {
|
||||||
|
local length=${1:-16}
|
||||||
|
openssl rand -base64 48 | tr -dc 'a-zA-Z0-9!@#$%^&*()-_=+' | head -c "$length"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to generate a base64 encoded key for Monica
|
||||||
|
generate_base64_key() {
|
||||||
|
local length=${1:-32}
|
||||||
|
local key=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9!@#$%^&*()-_=+' | head -c "$length")
|
||||||
|
echo "base64:$(echo -n "$key" | base64)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to safely update environment variables in .env file
|
||||||
|
update_env_var() {
|
||||||
|
local key=$1
|
||||||
|
local value=$2
|
||||||
|
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
|
||||||
|
# Use perl instead of sed for better handling of paths with spaces
|
||||||
|
perl -i -pe "s/^$key=.*/$key=$escaped_value/" "$ENV_FILE"
|
||||||
|
echo "Updated $key in .env file"
|
||||||
|
else
|
||||||
|
echo "$key=$escaped_value" >> "$ENV_FILE"
|
||||||
|
echo "Added $key to .env file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if update was successful
|
||||||
|
if ! grep -q "^$key=$escaped_value" "$ENV_FILE"; then
|
||||||
|
echo "Warning: Failed to update $key in .env file"
|
||||||
|
echo "Restoring from backup..."
|
||||||
|
cp "$ENV_FILE.bak_tmp" "$ENV_FILE"
|
||||||
|
echo "Will try alternative method..."
|
||||||
|
|
||||||
|
# Alternative update method
|
||||||
|
local temp_file=$(mktemp)
|
||||||
|
if grep -q "^$key=" "$ENV_FILE"; then
|
||||||
|
while IFS= read -r line; do
|
||||||
|
if [[ $line =~ ^$key= ]]; then
|
||||||
|
echo "$key=$value" >> "$temp_file"
|
||||||
|
else
|
||||||
|
echo "$line" >> "$temp_file"
|
||||||
|
fi
|
||||||
|
done < "$ENV_FILE"
|
||||||
|
else
|
||||||
|
cat "$ENV_FILE" > "$temp_file"
|
||||||
|
echo "$key=$value" >> "$temp_file"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv "$temp_file" "$ENV_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove the temporary backup file after successful update
|
||||||
|
rm -f "$ENV_FILE.bak_tmp"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo -e "\n\nWelcome to Changemaker Config!\n"
|
||||||
|
echo "This script will help you configure your Changemaker instance."
|
||||||
|
echo "Please provide the following information:"
|
||||||
|
|
||||||
|
# Domain configuration
|
||||||
|
read -p "Enter your domain name (without protocol, e.g., example.com): " domain_name
|
||||||
|
|
||||||
|
if [ -z "$domain_name" ]; then
|
||||||
|
echo "Domain name cannot be empty. Using default: changeme.org"
|
||||||
|
domain_name="changeme.org"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\nUpdating domain settings in .env file at: $ENV_FILE"
|
||||||
|
|
||||||
|
# Update main domain settings
|
||||||
|
update_env_var "DOMAIN" "$domain_name"
|
||||||
|
update_env_var "BASE_DOMAIN" "https://$domain_name"
|
||||||
|
|
||||||
|
# Update Listmonk hostname
|
||||||
|
update_env_var "LISTMONK_HOSTNAME" "listmonk.$domain_name"
|
||||||
|
|
||||||
|
# Update Gitea settings
|
||||||
|
update_env_var "GITEA_ROOT_URL" "https://gitea.$domain_name"
|
||||||
|
update_env_var "GITEA_DOMAIN" "gitea.$domain_name"
|
||||||
|
|
||||||
|
# Update Excalidraw settings
|
||||||
|
update_env_var "EXCALIDRAW_PUBLIC_URL" "https://excalidraw.$domain_name"
|
||||||
|
update_env_var "EXCALIDRAW_PUBLIC_SOCKET_URL" "https://excalidraw.$domain_name"
|
||||||
|
|
||||||
|
# Update OpenWebUI settings
|
||||||
|
echo -e "\nConfiguring OpenWebUI..."
|
||||||
|
update_env_var "OPEN_WEBUI_PORT" "3005"
|
||||||
|
update_env_var "OPEN_WEBUI_URL" "https://open-webui.$domain_name"
|
||||||
|
|
||||||
|
echo -e "Domain settings have been updated successfully!\n"
|
||||||
|
|
||||||
|
# Listmonk Admin Credentials configuration
|
||||||
|
echo -e "\n---- Listmonk Admin Credentials ----"
|
||||||
|
read -p "Enter Listmonk admin username [default: admin]: " listmonk_user
|
||||||
|
read -sp "Enter Listmonk admin password [default: strongpassword]: " listmonk_password
|
||||||
|
echo # Add new line after password input
|
||||||
|
|
||||||
|
if [ -z "$listmonk_user" ]; then
|
||||||
|
echo "Using default Listmonk admin username: admin"
|
||||||
|
listmonk_user="admin"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$listmonk_password" ]; then
|
||||||
|
echo "Using default Listmonk admin password"
|
||||||
|
listmonk_password="strongpassword"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update Listmonk credentials
|
||||||
|
update_env_var "LISTMONK_ADMIN_USER" "$listmonk_user"
|
||||||
|
update_env_var "LISTMONK_ADMIN_PASSWORD" "$listmonk_password"
|
||||||
|
|
||||||
|
echo "Listmonk admin credentials updated."
|
||||||
|
|
||||||
|
# Flatnotes User Credentials configuration
|
||||||
|
echo -e "\n---- Flatnotes User Credentials ----"
|
||||||
|
read -p "Enter Flatnotes username [default: user]: " flatnotes_user
|
||||||
|
read -sp "Enter Flatnotes password [default: changeMe!]: " flatnotes_password
|
||||||
|
echo # Add new line after password input
|
||||||
|
|
||||||
|
if [ -z "$flatnotes_user" ]; then
|
||||||
|
echo "Using default Flatnotes username: user"
|
||||||
|
flatnotes_user="user"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$flatnotes_password" ]; then
|
||||||
|
echo "Using default Flatnotes password"
|
||||||
|
flatnotes_password="changeMe!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update Flatnotes credentials
|
||||||
|
update_env_var "FLATNOTES_USERNAME" "$flatnotes_user"
|
||||||
|
update_env_var "FLATNOTES_PASSWORD" "$flatnotes_password"
|
||||||
|
|
||||||
|
echo "Flatnotes user credentials updated."
|
||||||
|
|
||||||
|
# N8N User Credentials configuration
|
||||||
|
echo -e "\n---- N8N Admin Credentials ----"
|
||||||
|
read -p "Enter N8N admin email [default: admin@example.com]: " n8n_email
|
||||||
|
read -sp "Enter N8N admin password [default: changeMe]: " n8n_password
|
||||||
|
echo # Add new line after password input
|
||||||
|
|
||||||
|
if [ -z "$n8n_email" ]; then
|
||||||
|
echo "Using default N8N admin email: admin@example.com"
|
||||||
|
n8n_email="admin@example.com"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$n8n_password" ]; then
|
||||||
|
echo "Using default N8N admin password"
|
||||||
|
n8n_password="changeMe"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update N8N host and other settings
|
||||||
|
update_env_var "N8N_HOST" "n8n.$domain_name"
|
||||||
|
update_env_var "N8N_USER_EMAIL" "$n8n_email"
|
||||||
|
update_env_var "N8N_USER_PASSWORD" "$n8n_password"
|
||||||
|
update_env_var "GENERIC_TIMEZONE" "UTC"
|
||||||
|
|
||||||
|
echo "N8N admin credentials updated."
|
||||||
|
|
||||||
|
# Rocket.Chat Configuration
|
||||||
|
echo -e "\n---- Rocket.Chat Configuration ----"
|
||||||
|
read -p "Enter Rocket.Chat URL (default: https://rocket.$domain_name): " rocketchat_url
|
||||||
|
read -p "Enter Rocket.Chat port [default: 3004]: " rocketchat_port
|
||||||
|
read -p "Enable production mode for Rocket.Chat? [Y/n]: " rocketchat_production
|
||||||
|
|
||||||
|
if [ -z "$rocketchat_url" ]; then
|
||||||
|
echo "Using default Rocket.Chat URL: https://rocket.$domain_name"
|
||||||
|
rocketchat_url="https://rocket.$domain_name"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$rocketchat_port" ]; then
|
||||||
|
echo "Using default Rocket.Chat port: 3004"
|
||||||
|
rocketchat_port="3004"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rocketchat_environment="changemaker"
|
||||||
|
if [[ "$rocketchat_production" =~ ^[Yy]$ ]] || [ -z "$rocketchat_production" ]; then
|
||||||
|
echo "Enabling production mode for Rocket.Chat"
|
||||||
|
rocketchat_environment="production"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update Rocket.Chat settings
|
||||||
|
update_env_var "ROCKETCHAT_PORT" "$rocketchat_port"
|
||||||
|
update_env_var "ROCKETCHAT_CONTAINER_PORT" "3000"
|
||||||
|
update_env_var "ROCKETCHAT_ROOT_URL" "$rocketchat_url"
|
||||||
|
update_env_var "ROCKETCHAT_DEPLOYMENT_ENVIRONMENT" "$rocketchat_environment"
|
||||||
|
|
||||||
|
echo "Rocket.Chat configuration updated."
|
||||||
|
|
||||||
|
# Cloudflare Credentials Configuration
|
||||||
|
echo -e "\n---- Cloudflare Credentials Configuration ----"
|
||||||
|
echo "Please enter your Cloudflare credentials for DNS and tunnel management."
|
||||||
|
|
||||||
|
read -p "Enter Cloudflare authentication email: " cf_auth_email
|
||||||
|
read -p "Enter Cloudflare API token: " cf_api_token
|
||||||
|
read -p "Enter Cloudflare Zone ID: " cf_zone_id
|
||||||
|
read -p "Enter Cloudflare Tunnel ID: " cf_tunnel_id
|
||||||
|
|
||||||
|
if [ -z "$cf_auth_email" ]; then
|
||||||
|
echo "Warning: Cloudflare authentication email is empty. Some features may not work correctly."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$cf_api_token" ]; then
|
||||||
|
echo "Warning: Cloudflare API token is empty. Some features may not work correctly."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$cf_zone_id" ]; then
|
||||||
|
echo "Warning: Cloudflare Zone ID is empty. Some features may not work correctly."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$cf_tunnel_id" ]; then
|
||||||
|
echo "Warning: Cloudflare Tunnel ID is empty. Some features may not work correctly."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update Cloudflare settings
|
||||||
|
update_env_var "CF_AUTH_EMAIL" "$cf_auth_email"
|
||||||
|
update_env_var "CF_API_TOKEN" "$cf_api_token"
|
||||||
|
update_env_var "CF_ZONE_ID" "$cf_zone_id"
|
||||||
|
update_env_var "CF_TUNNEL_ID" "$cf_tunnel_id"
|
||||||
|
update_env_var "CF_DOMAIN" "$domain_name"
|
||||||
|
|
||||||
|
echo "Cloudflare credentials have been updated."
|
||||||
|
|
||||||
|
echo -e "\n---- Generating Random Strong Passwords ----"
|
||||||
|
echo "Generating and updating passwords for all other services..."
|
||||||
|
|
||||||
|
# Generate and update Monica app key
|
||||||
|
monica_app_key=$(generate_base64_key 32)
|
||||||
|
update_env_var "MONICA_APP_KEY" "$monica_app_key"
|
||||||
|
|
||||||
|
# Generate and update Monica passwords
|
||||||
|
monica_db_password=$(generate_password 20)
|
||||||
|
update_env_var "MONICA_DB_PASSWORD" "$monica_db_password"
|
||||||
|
update_env_var "MONICA_MYSQL_PASSWORD" "$monica_db_password"
|
||||||
|
|
||||||
|
# Generate and update Flatnotes secret key
|
||||||
|
flatnotes_secret_key=$(generate_password 32)
|
||||||
|
update_env_var "FLATNOTES_SECRET_KEY" "$flatnotes_secret_key"
|
||||||
|
|
||||||
|
# Generate and update Gitea passwords
|
||||||
|
gitea_db_password=$(generate_password 24)
|
||||||
|
gitea_root_password=$(generate_password 24)
|
||||||
|
update_env_var "GITEA_DB_PASSWD" "$gitea_db_password"
|
||||||
|
update_env_var "GITEA_DB_ROOT_PASSWORD" "$gitea_root_password"
|
||||||
|
|
||||||
|
# Generate and update NocoDB JWT secret and database password
|
||||||
|
nocodb_jwt_secret=$(generate_password 32)
|
||||||
|
update_env_var "NOCODB_JWT_SECRET" "$nocodb_jwt_secret"
|
||||||
|
|
||||||
|
nocodb_db_password=$(generate_password 20)
|
||||||
|
update_env_var "NOCODB_DB_PASSWORD" "$nocodb_db_password"
|
||||||
|
|
||||||
|
# Generate and update n8n encryption key and default admin password
|
||||||
|
n8n_encryption_key=$(generate_password 32)
|
||||||
|
update_env_var "N8N_ENCRYPTION_KEY" "$n8n_encryption_key"
|
||||||
|
|
||||||
|
# Generate and update ConvertX JWT secret
|
||||||
|
convertx_jwt_secret=$(generate_password 48)
|
||||||
|
update_env_var "CONVERTX_JWT_SECRET" "$convertx_jwt_secret"
|
||||||
|
|
||||||
|
echo "All service passwords have been updated with secure random strings."
|
||||||
|
|
||||||
|
echo -e "\nAll settings have been configured successfully!"
|
||||||
|
echo "Your Changemaker instance is now ready with the following:"
|
||||||
|
echo "- Domain: $domain_name"
|
||||||
|
echo "- Listmonk Admin: $listmonk_user"
|
||||||
|
echo "- Flatnotes User: $flatnotes_user"
|
||||||
|
echo "- N8N Admin Email: $n8n_email"
|
||||||
|
echo "- All other service passwords have been randomized for security"
|
||||||
|
echo -e "\nNote: The randomized passwords are stored in your .env file at: $ENV_FILE"
|
||||||
|
echo -e "A backup of your original .env file was created before modifications."
|
||||||
|
|
||||||
|
# Add a new function to write the complete .env file
|
||||||
|
write_new_env_file() {
|
||||||
|
local timestamp=$(date +"%Y%m%d_%H%M%S")
|
||||||
|
local backup_file="$ENV_FILE.backup_$timestamp"
|
||||||
|
|
||||||
|
echo "Creating final backup of the current .env file to: $backup_file"
|
||||||
|
cp "$ENV_FILE" "$backup_file"
|
||||||
|
|
||||||
|
echo "Creating new .env file with all updated settings..."
|
||||||
|
|
||||||
|
# Get all variables from the current .env file
|
||||||
|
local temp_env=$(mktemp)
|
||||||
|
grep -v "^#" "$ENV_FILE" | grep "=" > "$temp_env"
|
||||||
|
|
||||||
|
# Create the new .env file with header
|
||||||
|
cat > "$ENV_FILE.new" << 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)
|
||||||
|
|
||||||
|
EOL
|
||||||
|
|
||||||
|
# Add all sections with their variables
|
||||||
|
echo "# Domain Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^DOMAIN=|^BASE_DOMAIN=" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Listmonk Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^LISTMONK_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Database Credentials" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^POSTGRES_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Monica CRM Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^MONICA_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# MkDocs Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^USER_ID=|^GROUP_ID=|^MKDOCS_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Flatnotes Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^FLATNOTES_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Gitea Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^GITEA_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Apache Answer Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^ANSWER_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Excalidraw Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^EXCALIDRAW_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Code Server Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^CODE_SERVER_|^USER_NAME=" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Cloudflare Credentials" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^CF_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# NocoDB Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^NOCODB_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# OpenWebUI Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^OPEN_WEBUI_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# N8N Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^N8N_|^GENERIC_TIMEZONE=" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# ConvertX Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^CONVERTX_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
echo "# Rocket.Chat Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -E "^ROCKETCHAT_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
echo "" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
# Any variables that didn't fit in the above categories
|
||||||
|
echo "# Additional Configuration" >> "$ENV_FILE.new"
|
||||||
|
grep -v -E "^DOMAIN=|^BASE_DOMAIN=|^LISTMONK_|^POSTGRES_|^MONICA_|^USER_ID=|^GROUP_ID=|^MKDOCS_|^FLATNOTES_|^GITEA_|^ANSWER_|^EXCALIDRAW_|^CODE_SERVER_|^USER_NAME=|^CF_|^NOCODB_|^OPEN_WEBUI_|^N8N_|^GENERIC_TIMEZONE=|^CONVERTX_|^ROCKETCHAT_" "$temp_env" >> "$ENV_FILE.new"
|
||||||
|
|
||||||
|
# Replace the current .env with the new one
|
||||||
|
mv "$ENV_FILE.new" "$ENV_FILE"
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm -f "$temp_env"
|
||||||
|
|
||||||
|
echo "New .env file created and applied successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Finalizing the configuration by creating a clean .env file...
|
||||||
|
echo -e "\nFinalizing the configuration by creating a clean .env file..."
|
||||||
|
write_new_env_file
|
||||||
|
|
||||||
|
# Clean up any leftover temporary backup files
|
||||||
|
rm -f "$ENV_FILE.bak_tmp"
|
||||||
|
echo -e "Temporary backup files have been cleaned up."
|
0
configs/code-server/.config/.gitkeep
Normal file
0
configs/code-server/.local/.gitkeep
Normal file
35
configs/code-server/mkdocs-check.sh
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Helper script to diagnose MkDocs configuration
|
||||||
|
echo "=== MkDocs and Python Information ==="
|
||||||
|
echo "Python version:"
|
||||||
|
python3 --version
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "MkDocs version:"
|
||||||
|
mkdocs --version
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=== Installed Packages in Virtual Environment ==="
|
||||||
|
pip list
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=== MkDocs Configuration ==="
|
||||||
|
if [ -f "mkdocs.yml" ]; then
|
||||||
|
echo "Contents of mkdocs.yml:"
|
||||||
|
cat mkdocs.yml
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Checking plugins in mkdocs.yml:"
|
||||||
|
grep -A 10 "plugins:" mkdocs.yml
|
||||||
|
else
|
||||||
|
echo "mkdocs.yml not found in current directory"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=== Testing MkDocs Build ==="
|
||||||
|
echo "Running: mkdocs build --strict"
|
||||||
|
mkdocs build --strict
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Done ==="
|
0
configs/ferdium/.gitkeep
Normal file
65
configs/homepage-local/bookmarks.yaml
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/bookmarks
|
||||||
|
|
||||||
|
- Essential Tools:
|
||||||
|
- Code Server:
|
||||||
|
- abbr: CS
|
||||||
|
href: https://github.com/coder/code-server
|
||||||
|
- Flatnotes:
|
||||||
|
- abbr: FN
|
||||||
|
href: https://github.com/dullage/flatnotes
|
||||||
|
- Listmonk:
|
||||||
|
- abbr: LM
|
||||||
|
href: https://listmonk.app/docs/
|
||||||
|
- NocoDB:
|
||||||
|
- abbr: NC
|
||||||
|
href: https://docs.nocodb.com/
|
||||||
|
|
||||||
|
- Content Creation:
|
||||||
|
- MkDocs:
|
||||||
|
- abbr: MD
|
||||||
|
href: https://www.mkdocs.org/
|
||||||
|
- Excalidraw:
|
||||||
|
- abbr: EX
|
||||||
|
href: https://github.com/excalidraw/excalidraw
|
||||||
|
- Gitea:
|
||||||
|
- abbr: GT
|
||||||
|
href: https://docs.gitea.com/
|
||||||
|
- OpenWebUI:
|
||||||
|
- abbr: OW
|
||||||
|
href: https://docs.openwebui.com/
|
||||||
|
|
||||||
|
- Community & Data:
|
||||||
|
- Monica CRM:
|
||||||
|
- abbr: MC
|
||||||
|
href: https://www.monicahq.com/documentation/
|
||||||
|
- Answer:
|
||||||
|
- abbr: AS
|
||||||
|
href: https://answer.apache.org/docs/
|
||||||
|
- Ferdium:
|
||||||
|
- abbr: FD
|
||||||
|
href: https://github.com/ferdium/ferdium-app
|
||||||
|
- Rocket.Chat:
|
||||||
|
- abbr: RC
|
||||||
|
href: https://docs.rocket.chat/
|
||||||
|
|
||||||
|
- Development:
|
||||||
|
- Ollama:
|
||||||
|
- abbr: OL
|
||||||
|
href: https://github.com/ollama/ollama
|
||||||
|
- Portainer:
|
||||||
|
- abbr: PT
|
||||||
|
href: https://docs.portainer.io/
|
||||||
|
- Mini-QR:
|
||||||
|
- abbr: QR
|
||||||
|
href: https://github.com/lyqht/mini-qr
|
||||||
|
- ConvertX:
|
||||||
|
- abbr: CX
|
||||||
|
href: https://github.com/c4illin/convertx
|
||||||
|
- n8n:
|
||||||
|
- abbr: N8
|
||||||
|
href: https://docs.n8n.io/
|
||||||
|
- Github:
|
||||||
|
- abbr: GH
|
||||||
|
href: https://github.com/
|
0
configs/homepage-local/custom.css
Executable file
0
configs/homepage-local/custom.js
Executable file
10
configs/homepage-local/docker.yaml
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/docker/
|
||||||
|
|
||||||
|
# my-docker:
|
||||||
|
# host: 127.0.0.1
|
||||||
|
# port: 2375
|
||||||
|
|
||||||
|
# my-docker:
|
||||||
|
# socket: /var/run/docker.sock
|
2
configs/homepage-local/kubernetes.yaml
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# sample kubernetes config
|
0
configs/homepage-local/logs/homepage.log
Normal file
79
configs/homepage-local/services.yaml
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/services/
|
||||||
|
|
||||||
|
- Essential Tools:
|
||||||
|
- code-server:
|
||||||
|
href: http://localhost:8888
|
||||||
|
description: VS Code in the browser
|
||||||
|
icon: code-server
|
||||||
|
- Flatnotes:
|
||||||
|
href: http://localhost:8089
|
||||||
|
description: Note-taking app - connected directly to blog
|
||||||
|
icon: flatnotes
|
||||||
|
- Listmonk:
|
||||||
|
href: http://localhost:9000
|
||||||
|
description: Newsletter & mailing list manager
|
||||||
|
icon: listmonk
|
||||||
|
- NocoDB:
|
||||||
|
href: http://localhost:8090
|
||||||
|
description: Open Source Airtable Alternative
|
||||||
|
icon: mdi-database
|
||||||
|
|
||||||
|
- Content Creation:
|
||||||
|
- MkDocs:
|
||||||
|
href: http://localhost:4000
|
||||||
|
description: Website generator & documentation
|
||||||
|
icon: mkdocs
|
||||||
|
- Excalidraw:
|
||||||
|
href: http://localhost:3333
|
||||||
|
description: Collaborative drawing tool
|
||||||
|
icon: mdi-draw-pen
|
||||||
|
- Gitea:
|
||||||
|
href: http://localhost:3030
|
||||||
|
description: Self-hosted Git service
|
||||||
|
icon: gitea
|
||||||
|
- OpenWebUI:
|
||||||
|
href: http://localhost:3005
|
||||||
|
description: UI for Ollama models
|
||||||
|
icon: mdi-robot-happy
|
||||||
|
|
||||||
|
- Community & Data:
|
||||||
|
- Monica CRM:
|
||||||
|
href: http://localhost:8085
|
||||||
|
description: Personal CRM
|
||||||
|
icon: monica
|
||||||
|
- Answer:
|
||||||
|
href: http://localhost:9080
|
||||||
|
description: Q&A platform for teams
|
||||||
|
icon: mdi-help-circle
|
||||||
|
- Ferdium:
|
||||||
|
href: http://localhost:3009
|
||||||
|
description: All-in-one messaging app
|
||||||
|
icon: ferdium
|
||||||
|
- Rocket.Chat:
|
||||||
|
href: http://localhost:3004
|
||||||
|
description: Team collaboration platform
|
||||||
|
icon: mdi-rocket
|
||||||
|
|
||||||
|
- Development:
|
||||||
|
- Ollama:
|
||||||
|
href: http://localhost:11435
|
||||||
|
description: Local AI model server
|
||||||
|
icon: ollama
|
||||||
|
- Portainer:
|
||||||
|
href: https://localhost:9444
|
||||||
|
description: Docker management UI
|
||||||
|
icon: portainer
|
||||||
|
- Mini QR:
|
||||||
|
href: http://localhost:8081
|
||||||
|
description: QR Code Generator
|
||||||
|
icon: mdi-qrcode-edit
|
||||||
|
- ConvertX:
|
||||||
|
href: http://localhost:3100
|
||||||
|
description: File conversion tool
|
||||||
|
icon: mdi-file-sync
|
||||||
|
- n8n:
|
||||||
|
href: http://localhost:5678
|
||||||
|
description: Workflow automation
|
||||||
|
icon: n8n
|
42
configs/homepage-local/settings.yaml
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/settings/
|
||||||
|
|
||||||
|
title: Changemaker
|
||||||
|
description: Changemaker is a self-hosted platform for political organizing, activism, and community building.
|
||||||
|
theme: dark # or light
|
||||||
|
color: purple
|
||||||
|
|
||||||
|
background:
|
||||||
|
image: /images/background.png
|
||||||
|
blur: xs # sm, "", md, xl... see https://tailwindcss.com/docs/backdrop-blur
|
||||||
|
saturate: 100 # 0, 50, 100... see https://tailwindcss.com/docs/backdrop-saturate
|
||||||
|
brightness: 75 # 0, 50, 75... see https://tailwindcss.com/docs/backdrop-brightness
|
||||||
|
opacity: 50 # 0-100
|
||||||
|
|
||||||
|
cardBlur: xl # xs, md,
|
||||||
|
headerStyle: boxed
|
||||||
|
|
||||||
|
layout:
|
||||||
|
style: columns
|
||||||
|
columns: 4
|
||||||
|
|
||||||
|
quicklaunch:
|
||||||
|
searchDescriptions: true
|
||||||
|
hideInternetSearch: true
|
||||||
|
showSearchSuggestions: true
|
||||||
|
hideVisitURL: true
|
||||||
|
provider: duckduckgo
|
||||||
|
|
||||||
|
showStats: true
|
||||||
|
|
||||||
|
bookmarks:
|
||||||
|
showCategories: true
|
||||||
|
showIcons: true
|
||||||
|
target: _blank
|
||||||
|
columns: 4
|
||||||
|
pinned:
|
||||||
|
- Essential Tools:code-server
|
||||||
|
- Content Creation:MkDocs
|
||||||
|
- Community & Data:Monica CRM
|
||||||
|
- Development:Ollama
|
42
configs/homepage-local/widgets.yaml
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/info-widgets/
|
||||||
|
|
||||||
|
- logo:
|
||||||
|
icon: https://changemaker.bnkops.com/logo.svg # optional
|
||||||
|
|
||||||
|
- resources:
|
||||||
|
cpu: true
|
||||||
|
memory: true
|
||||||
|
disk: /
|
||||||
|
|
||||||
|
- greeting:
|
||||||
|
text_size: xs
|
||||||
|
text: Localhost Website
|
||||||
|
href: http://localhost:4001
|
||||||
|
|
||||||
|
- greeting:
|
||||||
|
text_size: xs
|
||||||
|
text: changemaker
|
||||||
|
href: https://changemaker.bnkops.com
|
||||||
|
|
||||||
|
- datetime:
|
||||||
|
text_size: xl
|
||||||
|
format:
|
||||||
|
dateStyle: short
|
||||||
|
timeStyle: short
|
||||||
|
hour12: true
|
||||||
|
|
||||||
|
- search:
|
||||||
|
provider: duckduckgo
|
||||||
|
target: _blank
|
||||||
|
|
||||||
|
- openmeteo:
|
||||||
|
label: Edmonton # optional
|
||||||
|
latitude: 53.5461
|
||||||
|
longitude: -113.4938
|
||||||
|
timezone: America/Edmonton # optional
|
||||||
|
units: metric # or imperial
|
||||||
|
cache: 5 # Time in minutes to cache API responses, to stay within limits
|
||||||
|
format: # optional, Intl.NumberFormat options
|
||||||
|
maximumFractionDigits: 1
|
65
configs/homepage/bookmarks.yaml
Executable file
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/bookmarks
|
||||||
|
|
||||||
|
- Essential Tools:
|
||||||
|
- Code Server:
|
||||||
|
- abbr: CS
|
||||||
|
href: https://github.com/coder/code-server
|
||||||
|
- Flatnotes:
|
||||||
|
- abbr: FN
|
||||||
|
href: https://github.com/dullage/flatnotes
|
||||||
|
- Listmonk:
|
||||||
|
- abbr: LM
|
||||||
|
href: https://listmonk.app/docs/
|
||||||
|
- NocoDB:
|
||||||
|
- abbr: NC
|
||||||
|
href: https://docs.nocodb.com/
|
||||||
|
|
||||||
|
- Content Creation:
|
||||||
|
- MkDocs:
|
||||||
|
- abbr: MD
|
||||||
|
href: https://www.mkdocs.org/
|
||||||
|
- Excalidraw:
|
||||||
|
- abbr: EX
|
||||||
|
href: https://github.com/excalidraw/excalidraw
|
||||||
|
- Gitea:
|
||||||
|
- abbr: GT
|
||||||
|
href: https://docs.gitea.com/
|
||||||
|
- OpenWebUI:
|
||||||
|
- abbr: OW
|
||||||
|
href: https://docs.openwebui.com/
|
||||||
|
|
||||||
|
- Community & Data:
|
||||||
|
- Monica CRM:
|
||||||
|
- abbr: MC
|
||||||
|
href: https://www.monicahq.com/documentation/
|
||||||
|
- Answer:
|
||||||
|
- abbr: AS
|
||||||
|
href: https://answer.apache.org/docs/
|
||||||
|
- Ferdium:
|
||||||
|
- abbr: FD
|
||||||
|
href: https://github.com/ferdium/ferdium-app
|
||||||
|
- Rocket.Chat:
|
||||||
|
- abbr: RC
|
||||||
|
href: https://docs.rocket.chat/
|
||||||
|
|
||||||
|
- Development:
|
||||||
|
- Ollama:
|
||||||
|
- abbr: OL
|
||||||
|
href: https://github.com/ollama/ollama
|
||||||
|
- Portainer:
|
||||||
|
- abbr: PT
|
||||||
|
href: https://docs.portainer.io/
|
||||||
|
- Mini-QR:
|
||||||
|
- abbr: QR
|
||||||
|
href: https://github.com/lyqht/mini-qr
|
||||||
|
- ConvertX:
|
||||||
|
- abbr: CX
|
||||||
|
href: https://github.com/c4illin/convertx
|
||||||
|
- n8n:
|
||||||
|
- abbr: N8
|
||||||
|
href: https://docs.n8n.io/
|
||||||
|
- Github:
|
||||||
|
- abbr: GH
|
||||||
|
href: https://github.com/
|
0
configs/homepage/custom.css
Executable file
0
configs/homepage/custom.js
Executable file
10
configs/homepage/docker.yaml
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/docker/
|
||||||
|
|
||||||
|
# my-docker:
|
||||||
|
# host: 127.0.0.1
|
||||||
|
# port: 2375
|
||||||
|
|
||||||
|
# my-docker:
|
||||||
|
# socket: /var/run/docker.sock
|
2
configs/homepage/kubernetes.yaml
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# sample kubernetes config
|
1805
configs/homepage/logs/homepage.log
Executable file
79
configs/homepage/services.yaml
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/services/
|
||||||
|
|
||||||
|
- Essential Tools:
|
||||||
|
- code-server:
|
||||||
|
href: https://code-server.betteredmonton.org
|
||||||
|
description: VS Code in the browser
|
||||||
|
icon: code-server
|
||||||
|
- Flatnotes:
|
||||||
|
href: https://flatnotes.betteredmonton.org
|
||||||
|
description: Note-taking app - connected directly to blog
|
||||||
|
icon: flatnotes
|
||||||
|
- Listmonk:
|
||||||
|
href: https://listmonk.betteredmonton.org
|
||||||
|
description: Newsletter & mailing list manager
|
||||||
|
icon: listmonk
|
||||||
|
- NocoDB:
|
||||||
|
href: https://nocodb.betteredmonton.org
|
||||||
|
description: Open Source Airtable Alternative
|
||||||
|
icon: mdi-database
|
||||||
|
|
||||||
|
- Content Creation:
|
||||||
|
- MkDocs:
|
||||||
|
href: https://live.betteredmonton.org
|
||||||
|
description: Website generator & documentation
|
||||||
|
icon: mkdocs
|
||||||
|
- Excalidraw:
|
||||||
|
href: https://excalidraw.betteredmonton.org
|
||||||
|
description: Collaborative drawing tool
|
||||||
|
icon: mdi-draw-pen
|
||||||
|
- Gitea:
|
||||||
|
href: https://gitea.betteredmonton.org
|
||||||
|
description: Self-hosted Git service
|
||||||
|
icon: gitea
|
||||||
|
- OpenWebUI:
|
||||||
|
href: https://open-webui.betteredmonton.org
|
||||||
|
description: UI for Ollama models
|
||||||
|
icon: mdi-robot-happy
|
||||||
|
|
||||||
|
- Community & Data:
|
||||||
|
- Monica CRM:
|
||||||
|
href: https://monica.betteredmonton.org
|
||||||
|
description: Personal CRM
|
||||||
|
icon: monica
|
||||||
|
- Answer:
|
||||||
|
href: https://answer.betteredmonton.org
|
||||||
|
description: Q&A platform for teams
|
||||||
|
icon: mdi-help-circle
|
||||||
|
- Ferdium:
|
||||||
|
href: https://ferdium.betteredmonton.org
|
||||||
|
description: All-in-one messaging app
|
||||||
|
icon: ferdium
|
||||||
|
- Rocket.Chat:
|
||||||
|
href: https://rocket.betteredmonton.org
|
||||||
|
description: Team collaboration platform
|
||||||
|
icon: mdi-rocket
|
||||||
|
|
||||||
|
- Development:
|
||||||
|
- Ollama:
|
||||||
|
href: https://ollama.betteredmonton.org
|
||||||
|
description: Local AI model server
|
||||||
|
icon: ollama
|
||||||
|
- Portainer:
|
||||||
|
href: https://portainer.betteredmonton.org
|
||||||
|
description: Docker management UI
|
||||||
|
icon: portainer
|
||||||
|
- Mini QR:
|
||||||
|
href: https://mini-qr.betteredmonton.org
|
||||||
|
description: QR Code Generator
|
||||||
|
icon: mdi-qrcode-edit
|
||||||
|
- ConvertX:
|
||||||
|
href: https://convertx.betteredmonton.org
|
||||||
|
description: File conversion tool
|
||||||
|
icon: mdi-file-sync
|
||||||
|
- n8n:
|
||||||
|
href: https://n8n.betteredmonton.org
|
||||||
|
description: Workflow automation
|
||||||
|
icon: n8n
|
42
configs/homepage/settings.yaml
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/settings/
|
||||||
|
|
||||||
|
title: Changemaker
|
||||||
|
description: Changemaker is a self-hosted platform for political organizing, activism, and community building.
|
||||||
|
theme: dark # or light
|
||||||
|
color: purple
|
||||||
|
|
||||||
|
background:
|
||||||
|
image: /images/background.png
|
||||||
|
blur: xs # sm, "", md, xl... see https://tailwindcss.com/docs/backdrop-blur
|
||||||
|
saturate: 100 # 0, 50, 100... see https://tailwindcss.com/docs/backdrop-saturate
|
||||||
|
brightness: 75 # 0, 50, 75... see https://tailwindcss.com/docs/backdrop-brightness
|
||||||
|
opacity: 50 # 0-100
|
||||||
|
|
||||||
|
cardBlur: xl # xs, md,
|
||||||
|
headerStyle: boxed
|
||||||
|
|
||||||
|
layout:
|
||||||
|
style: columns
|
||||||
|
columns: 4
|
||||||
|
|
||||||
|
quicklaunch:
|
||||||
|
searchDescriptions: true
|
||||||
|
hideInternetSearch: true
|
||||||
|
showSearchSuggestions: true
|
||||||
|
hideVisitURL: true
|
||||||
|
provider: duckduckgo
|
||||||
|
|
||||||
|
showStats: true
|
||||||
|
|
||||||
|
bookmarks:
|
||||||
|
showCategories: true
|
||||||
|
showIcons: true
|
||||||
|
target: _blank
|
||||||
|
columns: 4
|
||||||
|
pinned:
|
||||||
|
- Essential Tools:code-server
|
||||||
|
- Content Creation:MkDocs
|
||||||
|
- Community & Data:Monica CRM
|
||||||
|
- Development:Ollama
|
34
configs/homepage/widgets.yaml
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
# For configuration options and examples, please see:
|
||||||
|
# https://gethomepage.dev/configs/info-widgets/
|
||||||
|
|
||||||
|
- resources:
|
||||||
|
cpu: true
|
||||||
|
memory: true
|
||||||
|
disk: /
|
||||||
|
|
||||||
|
- greeting:
|
||||||
|
text_size: xl
|
||||||
|
text: betteredmonton
|
||||||
|
href: https://betteredmonton.org
|
||||||
|
|
||||||
|
- datetime:
|
||||||
|
text_size: xl
|
||||||
|
format:
|
||||||
|
dateStyle: short
|
||||||
|
timeStyle: short
|
||||||
|
hour12: true
|
||||||
|
|
||||||
|
- search:
|
||||||
|
provider: duckduckgo
|
||||||
|
target: _blank
|
||||||
|
|
||||||
|
- openmeteo:
|
||||||
|
label: Edmonton # optional
|
||||||
|
latitude: 53.5461
|
||||||
|
longitude: -113.4938
|
||||||
|
timezone: America/Edmonton # optional
|
||||||
|
units: metric # or imperial
|
||||||
|
cache: 5 # Time in minutes to cache API responses, to stay within limits
|
||||||
|
format: # optional, Intl.NumberFormat options
|
||||||
|
maximumFractionDigits: 1
|
0
convertx-data/.gitkeep
Normal file
0
data/.gitkeep
Normal file
564
docker-compose.yml
Executable file
@ -0,0 +1,564 @@
|
|||||||
|
services:
|
||||||
|
|
||||||
|
bnkops.landing.server:
|
||||||
|
image: lscr.io/linuxserver/nginx:latest
|
||||||
|
container_name: bnkops.landing.server
|
||||||
|
environment:
|
||||||
|
- PUID=${USER_ID:-1000} # Uses USER_ID from your .env file, defaults to 1000
|
||||||
|
- PGID=${GROUP_ID:-1000} # Uses GROUP_ID from your .env file, defaults to 1000
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
volumes:
|
||||||
|
- ./site:/config/www # Mounts your static site to Nginx's web root
|
||||||
|
ports:
|
||||||
|
- "4007:80" # Exposes Nginx's port 80 to host port 4001
|
||||||
|
restart:
|
||||||
|
unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Homepage App
|
||||||
|
homepage-changemaker:
|
||||||
|
image: ghcr.io/gethomepage/homepage:latest
|
||||||
|
container_name: homepage-changemaker
|
||||||
|
ports:
|
||||||
|
- 3010:3000
|
||||||
|
volumes:
|
||||||
|
- ./configs/homepage:/app/config
|
||||||
|
- ./assets/icons:/app/public/icons
|
||||||
|
- ./assets/images:/app/public/images
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
- HOMEPAGE_ALLOWED_HOSTS=*
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
homepage-changemaker-local:
|
||||||
|
image: ghcr.io/gethomepage/homepage:latest
|
||||||
|
container_name: homepage-changemaker-local
|
||||||
|
ports:
|
||||||
|
- 3011:3000
|
||||||
|
volumes:
|
||||||
|
- ./configs/homepage-local:/app/config
|
||||||
|
- ./assets/icons:/app/public/icons
|
||||||
|
- ./assets/images:/app/public/images
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
- HOMEPAGE_ALLOWED_HOSTS=*
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# n8n - Workflow Automation Tool
|
||||||
|
n8n:
|
||||||
|
image: docker.n8n.io/n8nio/n8n
|
||||||
|
container_name: n8n-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${N8N_PORT:-5678}:5678"
|
||||||
|
environment:
|
||||||
|
- N8N_HOST=${N8N_HOST:-n8n.${DOMAIN}}
|
||||||
|
- N8N_PORT=5678
|
||||||
|
- N8N_PROTOCOL=https
|
||||||
|
- NODE_ENV=production
|
||||||
|
- WEBHOOK_URL=https://${N8N_HOST:-n8n.${DOMAIN}}/
|
||||||
|
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE:-UTC}
|
||||||
|
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY:-changeMe}
|
||||||
|
- N8N_USER_MANAGEMENT_DISABLED=false
|
||||||
|
- N8N_DEFAULT_USER_EMAIL=${N8N_USER_EMAIL:-admin@example.com}
|
||||||
|
- N8N_DEFAULT_USER_PASSWORD=${N8N_USER_PASSWORD:-changeMe}
|
||||||
|
volumes:
|
||||||
|
- n8n_data:/home/node/.n8n
|
||||||
|
- ./local-files:/files
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# OpenWebUI - AI Chat Interface
|
||||||
|
open-webui:
|
||||||
|
image: ghcr.io/open-webui/open-webui:main
|
||||||
|
container_name: open-webui-changemaker
|
||||||
|
ports:
|
||||||
|
- "${OPEN_WEBUI_PORT:-3005}:8080"
|
||||||
|
volumes:
|
||||||
|
- open-webui:/app/backend/data
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
depends_on:
|
||||||
|
- ollama
|
||||||
|
|
||||||
|
# Excalidraw services
|
||||||
|
excalidraw:
|
||||||
|
image: kiliandeca/excalidraw
|
||||||
|
container_name: excalidraw-changemaker
|
||||||
|
healthcheck:
|
||||||
|
disable: true
|
||||||
|
ports:
|
||||||
|
- "${EXCALIDRAW_PORT:-3333}:80"
|
||||||
|
environment:
|
||||||
|
BACKEND_V2_GET_URL: ${EXCALIDRAW_PUBLIC_URL:-http://localhost:3333}/api/v2/scenes/
|
||||||
|
BACKEND_V2_POST_URL: ${EXCALIDRAW_PUBLIC_URL:-http://localhost:3333}/api/v2/scenes/
|
||||||
|
LIBRARY_URL: ${EXCALIDRAW_LIBRARY_URL:-https://libraries.excalidraw.com}
|
||||||
|
LIBRARY_BACKEND: ${EXCALIDRAW_LIBRARY_BACKEND:-https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries}
|
||||||
|
SOCKET_SERVER_URL: ${EXCALIDRAW_PUBLIC_SOCKET_URL:-http://localhost:3333}/
|
||||||
|
STORAGE_BACKEND: "http"
|
||||||
|
HTTP_STORAGE_BACKEND_URL: ${EXCALIDRAW_PUBLIC_URL:-http://localhost:3333}/api/v2
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
depends_on:
|
||||||
|
- excalidraw-storage-backend
|
||||||
|
- excalidraw-room
|
||||||
|
- redis-excalidraw
|
||||||
|
|
||||||
|
excalidraw-storage-backend:
|
||||||
|
image: kiliandeca/excalidraw-storage-backend
|
||||||
|
container_name: excalidraw-storage-backend-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
STORAGE_URI: redis://redis-excalidraw:6379
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
depends_on:
|
||||||
|
- redis-excalidraw
|
||||||
|
|
||||||
|
excalidraw-room:
|
||||||
|
image: excalidraw/excalidraw-room
|
||||||
|
container_name: excalidraw-room-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
redis-excalidraw:
|
||||||
|
image: redis:6.2-alpine
|
||||||
|
container_name: redis-excalidraw-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- redis_excalidraw_data:/data
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# listmonk app
|
||||||
|
listmonk-app:
|
||||||
|
image: listmonk/listmonk:latest
|
||||||
|
container_name: listmonk_app
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "9000:9000"
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
hostname: ${LISTMONK_HOSTNAME}
|
||||||
|
depends_on:
|
||||||
|
- 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:-}
|
||||||
|
volumes:
|
||||||
|
- ./assets/uploads:/listmonk/uploads:rw
|
||||||
|
|
||||||
|
# Postgres database
|
||||||
|
listmonk-db:
|
||||||
|
image: postgres:17-alpine
|
||||||
|
container_name: listmonk-db
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "0.0.0.0:5432:5432"
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: ${POSTGRES_USER}
|
||||||
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
|
POSTGRES_DB: ${POSTGRES_DB}
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 6
|
||||||
|
volumes:
|
||||||
|
- type: volume
|
||||||
|
source: listmonk-data
|
||||||
|
target: /var/lib/postgresql/data
|
||||||
|
|
||||||
|
# Monica CRM
|
||||||
|
monica-app:
|
||||||
|
image: monica
|
||||||
|
container_name: monica-app-changemaker
|
||||||
|
depends_on:
|
||||||
|
- monica-db
|
||||||
|
ports:
|
||||||
|
- 8085:80
|
||||||
|
environment:
|
||||||
|
- APP_KEY=${MONICA_APP_KEY}
|
||||||
|
- DB_HOST=monica-db
|
||||||
|
- DB_USERNAME=${MONICA_DB_USERNAME}
|
||||||
|
- DB_PASSWORD=${MONICA_DB_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- data:/var/www/html/storage
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Monica Database
|
||||||
|
monica-db:
|
||||||
|
image: mariadb:11
|
||||||
|
container_name: monica-db-changemaker
|
||||||
|
environment:
|
||||||
|
- MYSQL_RANDOM_ROOT_PASSWORD=true
|
||||||
|
- MYSQL_DATABASE=${MONICA_MYSQL_DATABASE}
|
||||||
|
- MYSQL_USER=${MONICA_MYSQL_USER}
|
||||||
|
- MYSQL_PASSWORD=${MONICA_MYSQL_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- mysql:/var/lib/mysql
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# MkDocs Documentation
|
||||||
|
mkdocs:
|
||||||
|
image: squidfunk/mkdocs-material
|
||||||
|
container_name: mkdocs-changemaker
|
||||||
|
volumes:
|
||||||
|
- ./mkdocs:/docs:rw
|
||||||
|
- ./assets/images:/docs/assets/images:rw
|
||||||
|
user: "${USER_ID:-1000}:${GROUP_ID:-1000}"
|
||||||
|
ports:
|
||||||
|
- "${MKDOCS_PORT:-4000}:8000"
|
||||||
|
environment:
|
||||||
|
- SITE_URL=${BASE_DOMAIN:-https://changeme.org}
|
||||||
|
command: serve --dev-addr=0.0.0.0:8000 --watch-theme --livereload
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
mkdocs-site-server:
|
||||||
|
image: lscr.io/linuxserver/nginx:latest
|
||||||
|
container_name: mkdocs-site-server-changemaker
|
||||||
|
environment:
|
||||||
|
- PUID=${USER_ID:-1000} # Uses USER_ID from your .env file, defaults to 1000
|
||||||
|
- PGID=${GROUP_ID:-1000} # Uses GROUP_ID from your .env file, defaults to 1000
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
volumes:
|
||||||
|
- ./mkdocs/site:/config/www # Mounts your static site to Nginx's web root
|
||||||
|
ports:
|
||||||
|
- "4001:80" # Exposes Nginx's port 80 to host port 4001
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Flatnotes - Note-taking app
|
||||||
|
flatnotes:
|
||||||
|
container_name: flatnotes-changemaker
|
||||||
|
image: dullage/flatnotes:latest
|
||||||
|
environment:
|
||||||
|
PUID: ${FLATNOTES_PUID:-1000}
|
||||||
|
PGID: ${FLATNOTES_PGID:-1000}
|
||||||
|
FLATNOTES_AUTH_TYPE: ${FLATNOTES_AUTH_TYPE:-password}
|
||||||
|
FLATNOTES_USERNAME: ${FLATNOTES_USERNAME}
|
||||||
|
FLATNOTES_PASSWORD: ${FLATNOTES_PASSWORD}
|
||||||
|
FLATNOTES_SECRET_KEY: ${FLATNOTES_SECRET_KEY}
|
||||||
|
volumes:
|
||||||
|
- ./mkdocs/docs/notes:/data
|
||||||
|
ports:
|
||||||
|
- "${FLATNOTES_PORT:-8080}:8080"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
code-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.code-server
|
||||||
|
container_name: code-server-changemaker
|
||||||
|
environment:
|
||||||
|
- DOCKER_USER=${USER_NAME:-coder}
|
||||||
|
- DEFAULT_WORKSPACE=/home/coder/mkdocs
|
||||||
|
user: "${USER_ID:-1000}:${GROUP_ID:-1000}"
|
||||||
|
volumes:
|
||||||
|
- ./configs/code-server/.config:/home/coder/.config
|
||||||
|
- ./configs/code-server/.local:/home/coder/.local
|
||||||
|
- ./mkdocs:/home/coder/mkdocs/
|
||||||
|
ports:
|
||||||
|
- "${CODE_SERVER_PORT:-8888}:8080"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
ollama:
|
||||||
|
image: ollama/ollama
|
||||||
|
container_name: ollama-changemaker
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- driver: nvidia
|
||||||
|
count: all
|
||||||
|
capabilities: [gpu]
|
||||||
|
volumes:
|
||||||
|
- ollama:/root/.ollama
|
||||||
|
ports:
|
||||||
|
- "11435:11434"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Gitea - Git service
|
||||||
|
gitea-app:
|
||||||
|
image: docker.gitea.com/gitea:1.23.7
|
||||||
|
container_name: gitea_changemaker
|
||||||
|
environment:
|
||||||
|
- USER_UID=${USER_ID}
|
||||||
|
- USER_GID=${GROUP_ID}
|
||||||
|
- GITEA__database__DB_TYPE=${GITEA_DB_TYPE}
|
||||||
|
- GITEA__database__HOST=${GITEA_DB_HOST}
|
||||||
|
- GITEA__database__NAME=${GITEA_DB_NAME}
|
||||||
|
- GITEA__database__USER=${GITEA_DB_USER}
|
||||||
|
- GITEA__database__PASSWD=${GITEA_DB_PASSWD}
|
||||||
|
- GITEA__server__ROOT_URL=${GITEA_ROOT_URL}
|
||||||
|
- GITEA__server__HTTP_PORT=${GITEA_WEB_PORT}
|
||||||
|
- GITEA__server__PROTOCOL=http
|
||||||
|
- GITEA__server__DOMAIN=${GITEA_DOMAIN}
|
||||||
|
- GITEA__server__ENABLE_GZIP=true
|
||||||
|
- GITEA__server__PROXY_PROTOCOL=true
|
||||||
|
- GITEA__server__PROXY_PROXY_PROTOCOL_TLS=true
|
||||||
|
- GITEA__server__PROXY_ALLOW_SUBNET=0.0.0.0/0
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- gitea
|
||||||
|
volumes:
|
||||||
|
- gitea_data:/data
|
||||||
|
- /etc/timezone:/etc/timezone:ro
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
ports:
|
||||||
|
- "${GITEA_WEB_PORT}:3030"
|
||||||
|
- "${GITEA_SSH_PORT}:22"
|
||||||
|
depends_on:
|
||||||
|
- gitea-db
|
||||||
|
|
||||||
|
gitea-db:
|
||||||
|
image: mysql:8
|
||||||
|
container_name: gitea_mysql_changemaker
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=${GITEA_DB_ROOT_PASSWORD}
|
||||||
|
- MYSQL_USER=${GITEA_DB_USER}
|
||||||
|
- MYSQL_PASSWORD=${GITEA_DB_PASSWD}
|
||||||
|
- MYSQL_DATABASE=${GITEA_DB_NAME}
|
||||||
|
networks:
|
||||||
|
- gitea
|
||||||
|
volumes:
|
||||||
|
- mysql_data:/var/lib/mysql
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${GITEA_DB_USER}", "-p${GITEA_DB_PASSWD}"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
portainer:
|
||||||
|
image: portainer/portainer-ce:lts
|
||||||
|
container_name: portainer-changemaker
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
- DISABLE_HTTP_REDIRECT=true
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
ports:
|
||||||
|
- "8005:8000"
|
||||||
|
- "9444:9443"
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- portainer_data:/data
|
||||||
|
|
||||||
|
# Mini-QR - QR Code Generator
|
||||||
|
mini-qr:
|
||||||
|
image: ghcr.io/lyqht/mini-qr:latest
|
||||||
|
container_name: mini-qr
|
||||||
|
ports:
|
||||||
|
- 8081:8080
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Ferdium - Multiple messaging app client
|
||||||
|
ferdium:
|
||||||
|
image: lscr.io/linuxserver/ferdium:latest
|
||||||
|
container_name: ferdium-changemaker
|
||||||
|
security_opt:
|
||||||
|
- seccomp:unconfined #optional
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
- CUSTOM_PORT=3009
|
||||||
|
- CUSTOM_HTTPS_PORT=3006
|
||||||
|
volumes:
|
||||||
|
- ./configs/ferdium:/config
|
||||||
|
ports:
|
||||||
|
- 3009:3009
|
||||||
|
- 3006:3006
|
||||||
|
shm_size: "1gb"
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Apache Answer - Q&A Platform
|
||||||
|
answer:
|
||||||
|
image: apache/answer
|
||||||
|
container_name: answer-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- DB_TYPE=sqlite3
|
||||||
|
- PAGINATION_PAGE_SIZE=10
|
||||||
|
- LANGUAGE=en-US
|
||||||
|
- TZ=Etc/UTC
|
||||||
|
ports:
|
||||||
|
- "${ANSWER_APP_PORT:-9080}:80"
|
||||||
|
volumes:
|
||||||
|
- ./answer-data:/data
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# NocoDB - Open Source Airtable Alternative
|
||||||
|
nocodb:
|
||||||
|
depends_on:
|
||||||
|
root_db:
|
||||||
|
condition: service_healthy
|
||||||
|
environment:
|
||||||
|
NC_DB: "pg://root_db:5432?u=postgres&p=password&d=root_db"
|
||||||
|
image: "nocodb/nocodb:latest"
|
||||||
|
ports:
|
||||||
|
- "8090:8080"
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- "nc_data:/usr/app/data"
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
root_db:
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: root_db
|
||||||
|
POSTGRES_PASSWORD: password
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
healthcheck:
|
||||||
|
interval: 10s
|
||||||
|
retries: 10
|
||||||
|
test: "pg_isready -U \"$$POSTGRES_USER\" -d \"$$POSTGRES_DB\""
|
||||||
|
timeout: 2s
|
||||||
|
image: postgres:16.6
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- "db_data:/var/lib/postgresql/data"
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# ConvertX - File Conversion Tool
|
||||||
|
convertx:
|
||||||
|
image: ghcr.io/c4illin/convertx
|
||||||
|
container_name: convertx-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${CONVERTX_PORT:-3100}:3000"
|
||||||
|
environment:
|
||||||
|
- JWT_SECRET=${CONVERTX_JWT_SECRET:-aLongAndSecretStringUsedToSignTheJSONWebToken1234}
|
||||||
|
volumes:
|
||||||
|
- ./convertx-data:/app/data
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# Rocket.Chat - Team Chat Platform
|
||||||
|
rocketchat:
|
||||||
|
image: ${ROCKETCHAT_IMAGE:-registry.rocket.chat/rocketchat/rocket.chat}:${ROCKETCHAT_RELEASE:-latest}
|
||||||
|
container_name: rocketchat-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MONGO_URL: "mongodb://${ROCKETCHAT_MONGODB_HOST:-mongodb-rocketchat}:${ROCKETCHAT_MONGODB_PORT:-27017}/${ROCKETCHAT_MONGODB_DATABASE:-rocketchat}?replicaSet=${ROCKETCHAT_MONGODB_REPLICA_SET:-rs0}"
|
||||||
|
MONGO_OPLOG_URL: "mongodb://${ROCKETCHAT_MONGODB_HOST:-mongodb-rocketchat}:${ROCKETCHAT_MONGODB_PORT:-27017}/local?replicaSet=${ROCKETCHAT_MONGODB_REPLICA_SET:-rs0}"
|
||||||
|
ROOT_URL: ${ROCKETCHAT_ROOT_URL:-http://localhost:${ROCKETCHAT_PORT:-3004}}
|
||||||
|
PORT: ${ROCKETCHAT_CONTAINER_PORT:-3000}
|
||||||
|
DEPLOY_METHOD: docker
|
||||||
|
DEPLOY_PLATFORM: ${ROCKETCHAT_DEPLOYMENT_ENVIRONMENT:-changemaker}
|
||||||
|
ports:
|
||||||
|
- "${ROCKETCHAT_PORT:-3004}:${ROCKETCHAT_CONTAINER_PORT:-3000}"
|
||||||
|
depends_on:
|
||||||
|
- mongodb-rocketchat
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:${ROCKETCHAT_CONTAINER_PORT:-3000}/api/info"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
# MongoDB for Rocket.Chat
|
||||||
|
mongodb-rocketchat:
|
||||||
|
image: docker.io/bitnami/mongodb:${ROCKETCHAT_MONGODB_VERSION:-6.0}
|
||||||
|
container_name: mongodb-rocketchat-changemaker
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- mongodb_rocketchat_data:/bitnami/mongodb
|
||||||
|
environment:
|
||||||
|
MONGODB_REPLICA_SET_MODE: primary
|
||||||
|
MONGODB_REPLICA_SET_NAME: ${ROCKETCHAT_MONGODB_REPLICA_SET:-rs0}
|
||||||
|
MONGODB_PORT_NUMBER: ${ROCKETCHAT_MONGODB_PORT:-27017}
|
||||||
|
MONGODB_INITIAL_PRIMARY_HOST: ${ROCKETCHAT_MONGODB_HOST:-mongodb-rocketchat}
|
||||||
|
MONGODB_INITIAL_PRIMARY_PORT_NUMBER: ${ROCKETCHAT_MONGODB_PORT:-27017}
|
||||||
|
MONGODB_ADVERTISED_HOSTNAME: ${ROCKETCHAT_MONGODB_HOST:-mongodb-rocketchat}
|
||||||
|
MONGODB_ENABLE_JOURNAL: ${ROCKETCHAT_MONGODB_ENABLE_JOURNAL:-true}
|
||||||
|
ALLOW_EMPTY_PASSWORD: ${ROCKETCHAT_MONGODB_ALLOW_EMPTY_PASSWORD:-yes}
|
||||||
|
networks:
|
||||||
|
- changemaker
|
||||||
|
|
||||||
|
networks:
|
||||||
|
changemaker:
|
||||||
|
driver: bridge
|
||||||
|
gitea:
|
||||||
|
external: false
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
listmonk-data:
|
||||||
|
data:
|
||||||
|
name: data
|
||||||
|
mysql:
|
||||||
|
name: mysql
|
||||||
|
ollama:
|
||||||
|
gitea_data:
|
||||||
|
driver: local
|
||||||
|
mysql_data:
|
||||||
|
driver: local
|
||||||
|
portainer_data:
|
||||||
|
name: portainer_data_changemaker
|
||||||
|
redis_excalidraw_data:
|
||||||
|
driver: local
|
||||||
|
open-webui:
|
||||||
|
driver: local
|
||||||
|
notused:
|
||||||
|
nocodb_db_data:
|
||||||
|
driver: local
|
||||||
|
n8n_data:
|
||||||
|
driver: local
|
||||||
|
mongodb_rocketchat_data:
|
||||||
|
driver: local
|
||||||
|
db_data: {}
|
||||||
|
nc_data: {}
|
||||||
|
|
||||||
|
|
||||||
|
|
62
example.cloudflare.config.yml
Executable file
@ -0,0 +1,62 @@
|
|||||||
|
tunnel: your-tunnel-id-here # e.g. 1234567890abcdef
|
||||||
|
credentials-file: /path/to/your/.cloudflared/your-tunnel-id.json # e.g. /home/user/.cloudflared/[insert tunnel number].json
|
||||||
|
ingress:
|
||||||
|
|
||||||
|
- hostname: bnkops.com
|
||||||
|
service: http://localhost:4007
|
||||||
|
|
||||||
|
- hostname: homepage.bnkops.com
|
||||||
|
service: http://localhost:3010
|
||||||
|
|
||||||
|
- hostname: excalidraw.bnkops.com
|
||||||
|
service: http://localhost:3333
|
||||||
|
|
||||||
|
- hostname: listmonk.bnkops.com
|
||||||
|
service: http://localhost:9000
|
||||||
|
|
||||||
|
- hostname: monica.bnkops.com
|
||||||
|
service: http://localhost:8085
|
||||||
|
|
||||||
|
- hostname: live.bnkops.com
|
||||||
|
service: http://localhost:4000
|
||||||
|
|
||||||
|
- hostname: docs.bnkops.com
|
||||||
|
service: http://localhost:4001
|
||||||
|
|
||||||
|
- hostname: flatnotes.bnkops.com
|
||||||
|
service: http://localhost:8089
|
||||||
|
|
||||||
|
- hostname: code-server.bnkops.com
|
||||||
|
service: http://localhost:8888
|
||||||
|
|
||||||
|
- hostname: ollama.bnkops.com
|
||||||
|
service: http://localhost:11435
|
||||||
|
|
||||||
|
- hostname: open-webui.bnkops.com
|
||||||
|
service: http://localhost:3005
|
||||||
|
|
||||||
|
- hostname: gitea.bnkops.com
|
||||||
|
service: http://localhost:3030
|
||||||
|
|
||||||
|
- hostname: mini-qr.bnkops.com
|
||||||
|
service: http://localhost:8081
|
||||||
|
|
||||||
|
- hostname: ferdium.bnkops.com
|
||||||
|
service: http://localhost:3009
|
||||||
|
|
||||||
|
- hostname: answer.bnkops.com
|
||||||
|
service: http://localhost:9080
|
||||||
|
|
||||||
|
- hostname: nocodb.bnkops.com
|
||||||
|
service: http://localhost:8090
|
||||||
|
|
||||||
|
- hostname: n8n.bnkops.com
|
||||||
|
service: http://localhost:5678
|
||||||
|
|
||||||
|
- hostname: convertx.bnkops.com
|
||||||
|
service: http://localhost:3100
|
||||||
|
|
||||||
|
- hostname: rocket.bnkops.com
|
||||||
|
service: http://localhost:3004
|
||||||
|
|
||||||
|
- service: http_status:404
|
0
gitea/.gitkeep
Normal file
0
local-files/.gitkeep
Normal file
BIN
mkdocs/.cache/plugin/social/009239887e0066e84decd97010487236.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
mkdocs/.cache/plugin/social/040e68c3f61db597e9f4d66475e81e44.png
Executable file
After Width: | Height: | Size: 31 KiB |
BIN
mkdocs/.cache/plugin/social/0a321ae47aa5f19a94bad0a6b3527909.png
Executable file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/0e896585c354c04fce391858165f5469.png
Executable file
After Width: | Height: | Size: 28 KiB |
BIN
mkdocs/.cache/plugin/social/0edcfbe7de0e9c5cdc201bcbf8341a26.png
Executable file
After Width: | Height: | Size: 29 KiB |
BIN
mkdocs/.cache/plugin/social/11eddd217f8f1dca49338240d04bef34.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
mkdocs/.cache/plugin/social/16a6b963a052c2a001ff83f3fa3478cb.png
Executable file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/176adeea182945f42f29f56ea0990118.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
mkdocs/.cache/plugin/social/188fcd9debf939e06086da96482f3bd3.png
Executable file
After Width: | Height: | Size: 45 KiB |
BIN
mkdocs/.cache/plugin/social/19b24b921fd022e5d9fc881854a7b1bd.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/1d9e203d87864599ec4c3bc1abcbc238.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
mkdocs/.cache/plugin/social/1e870e6fa879dd3472820baf8e7e7ee5.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
mkdocs/.cache/plugin/social/229ca28f3385243d05c9e7b267ee9b4a.png
Executable file
After Width: | Height: | Size: 36 KiB |
BIN
mkdocs/.cache/plugin/social/241727720f758c95ff442d7681c25ace.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
mkdocs/.cache/plugin/social/2418703e04831f0d28652528991d5122.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
mkdocs/.cache/plugin/social/27f194aac73256c5be0a3b01f2d16c00.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
mkdocs/.cache/plugin/social/2950a2eae725369581600a873424afe7.png
Executable file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/2a7647a3250b1c891f3e2808c942f534.png
Executable file
After Width: | Height: | Size: 37 KiB |
BIN
mkdocs/.cache/plugin/social/2d7fb0bf805232ebed711128f98a90ea.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
mkdocs/.cache/plugin/social/2df2ae0f3b02a685f248ab0733273cd2.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
mkdocs/.cache/plugin/social/30a66b2150646e91feeaab2ac672a95e.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
mkdocs/.cache/plugin/social/35b539c0b334449b4e2c1c182b089fd0.png
Executable file
After Width: | Height: | Size: 23 KiB |
BIN
mkdocs/.cache/plugin/social/37af91b947563cfd57c7dd3c2326edca.png
Executable file
After Width: | Height: | Size: 33 KiB |
BIN
mkdocs/.cache/plugin/social/37b5a2b5216b1fb5bb268443cbdb05ad.png
Executable file
After Width: | Height: | Size: 35 KiB |
BIN
mkdocs/.cache/plugin/social/3eb26ca7c0d65eff534eef809faabe20.png
Executable file
After Width: | Height: | Size: 43 KiB |
BIN
mkdocs/.cache/plugin/social/41dca0736ac6f6814e7534397b187f12.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/423e6a7253801d0933c944bbd0eba4e6.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
mkdocs/.cache/plugin/social/494c04d750a88741f8258d130ae71d1d.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
mkdocs/.cache/plugin/social/4958348fe1b6bd90b4fd6a89cee05c85.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
mkdocs/.cache/plugin/social/4b505b493daa2eaa00af1e54385e7460.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/5007a41ec0dff7b6b554baac7c5a1a49.png
Executable file
After Width: | Height: | Size: 30 KiB |
BIN
mkdocs/.cache/plugin/social/55d9a82d5c00bbbdf7a28f8b8da13a56.png
Executable file
After Width: | Height: | Size: 36 KiB |
BIN
mkdocs/.cache/plugin/social/5718f0d626984f4890c0f9d1aace8bc1.png
Executable file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/5b1f13809b54fb6f1cd9a2f27cb9adb0.png
Executable file
After Width: | Height: | Size: 26 KiB |
BIN
mkdocs/.cache/plugin/social/5dd6c2b317236ece0323e3554439dd32.png
Executable file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/5f08470cf12cc91b66285b1aeca00cec.png
Executable file
After Width: | Height: | Size: 30 KiB |
BIN
mkdocs/.cache/plugin/social/63f8dbcb8417c125d7854f3c5d9e87f9.png
Executable file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/672dab5fa594eb205ad81a9cfaee1731.png
Executable file
After Width: | Height: | Size: 37 KiB |
BIN
mkdocs/.cache/plugin/social/6778924bcafde68377d7857fc20fdcf3.png
Executable file
After Width: | Height: | Size: 22 KiB |
BIN
mkdocs/.cache/plugin/social/6cf0398ab0758cd78bdd96abf2ff3cd8.png
Executable file
After Width: | Height: | Size: 29 KiB |
BIN
mkdocs/.cache/plugin/social/777fb82c4ad01b9346a253615eec9218.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
mkdocs/.cache/plugin/social/78665d31fe89c09c144545f939a794eb.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
mkdocs/.cache/plugin/social/7f2e11a8682a970f92863d7eaf490aac.png
Executable file
After Width: | Height: | Size: 29 KiB |
BIN
mkdocs/.cache/plugin/social/80e822786544993c11142461d554a721.png
Executable file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/904cfe3c5f74dfcdf5a5ce4e86826278.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
mkdocs/.cache/plugin/social/920a03af416c939db45c935e42f65545.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/934f31e9f5c31dcc4246821299545a66.png
Executable file
After Width: | Height: | Size: 43 KiB |
BIN
mkdocs/.cache/plugin/social/9d370af692e8bcf58a481bc714882487.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
mkdocs/.cache/plugin/social/a0a41d7b1efc42f1f54c6b83fd281387.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
mkdocs/.cache/plugin/social/a5989e9da2edaf14f83a548b3e6bdbd4.png
Executable file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/aa56a3515e799b91aba84927c88e7b51.png
Executable file
After Width: | Height: | Size: 31 KiB |
BIN
mkdocs/.cache/plugin/social/abda447ba1bda804518dadb6d0ac6d27.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
mkdocs/.cache/plugin/social/ac9c8f8d78404702ce28026f01b77f17.png
Executable file
After Width: | Height: | Size: 35 KiB |
BIN
mkdocs/.cache/plugin/social/b29aba8403a8046078bdbabe9e21d373.png
Executable file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/b3e3e08490f041ba4cc4619e7f84c91d.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
mkdocs/.cache/plugin/social/b48d5bb489f3c7226f096b4f425ba317.png
Executable file
After Width: | Height: | Size: 25 KiB |
BIN
mkdocs/.cache/plugin/social/b6f6a1b19061b807f8c540be6e0486c4.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
mkdocs/.cache/plugin/social/be97cbbce8d4c5c82f17c1eab4a8e94d.png
Normal file
After Width: | Height: | Size: 32 KiB |