Initial commit

This commit is contained in:
Andreas Dueren
2025-06-16 11:26:11 -06:00
commit 458eba1d56
9 changed files with 359 additions and 0 deletions

29
CHANGELOG.md Normal file
View File

@ -0,0 +1,29 @@
# Changelog
All notable changes to this Cloudron package will be documented in this file.
## [1.0.0] - 2024-06-16
### Added
- Initial Cloudron package for mautrix-whatsapp bridge
- Support for PostgreSQL database via Cloudron addon
- Automatic configuration generation with Cloudron environment variables
- Health check endpoint for Cloudron monitoring
- QR code authentication workflow
- Comprehensive documentation and setup instructions
### Features
- Matrix-WhatsApp bridge using mautrix-whatsapp v0.10.8
- Two-way message bridging
- Media file support (images, videos, documents, audio)
- Group chat bridging
- Reaction support
- Read receipt synchronization
- Typing indicator bridging
- End-to-end encryption support in Matrix rooms
### Configuration
- Automatic homeserver domain detection from Cloudron environment
- PostgreSQL connection string injection
- Log file configuration
- Registration file generation and management

77
CLAUDE.md Normal file
View File

@ -0,0 +1,77 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is a Cloudron package for the mautrix-whatsapp Matrix-WhatsApp bridge. It wraps the Go implementation of mautrix-whatsapp into a Cloudron-compatible app with automatic configuration, database setup, and health monitoring.
## Build and Development Commands
### Build the Docker image
```bash
make build
```
### Package for Cloudron
```bash
make package
```
### Development deployment
```bash
make dev-install # Install on test Cloudron
make dev-update # Update existing installation
```
### Clean build artifacts
```bash
make clean
```
## Architecture
### Core Components
- **Dockerfile.cloudron**: Multi-stage build using Go compiler with Cloudron base image
- **start.sh**: Bootstrap script handling configuration generation and WhatsApp authentication setup
- **CloudronManifest.json**: Defines PostgreSQL and localstorage addons, health check endpoint on port 29318
### Configuration Flow
The start.sh script implements a streamlined configuration process:
1. **Initial Setup**: Generates config.yaml and registration.yaml using built-in mautrix-whatsapp templates
2. **Environment Integration**: Configures PostgreSQL connection and Cloudron domain settings using yq
3. **Authentication Ready**: Sets up for WhatsApp QR code authentication workflow
### Key Design Patterns
- Uses Go binary compiled during Docker build for optimal performance
- All data persisted to `/app/data` with proper cloudron user ownership
- Configuration via yq YAML manipulation for cleaner updates
- Health check implemented using netcat since bridge doesn't provide native endpoint
- PostgreSQL connection string automatically injected from Cloudron addon
### Environment Integration
- `CLOUDRON_POSTGRESQL_URL`: Database connection from PostgreSQL addon
- `CLOUDRON_APP_DOMAIN`: Used to derive Matrix homeserver domain and appservice URL
- Automatic domain extraction for homeserver configuration
- Port 29318 for appservice and health check endpoints
## Development Notes
### Go Binary Management
The bridge binary is built during Docker image creation from the official mautrix-whatsapp repository. Version updates require updating the git clone in Dockerfile.cloudron.
### Database Schema
Uses PostgreSQL addon for persistence. The bridge handles its own schema migrations via the mautrix-whatsapp package.
### WhatsApp Authentication
Unlike Telegram bridges, WhatsApp authentication requires QR code scanning or pairing codes. The bridge provides interactive authentication commands after startup.
### Health Monitoring
Custom health check endpoint created using netcat on port 29318 since the bridge doesn't provide native health endpoints.
### Configuration Differences from Telegram Bridge
- Go-based instead of Python (single binary deployment)
- Simpler configuration workflow (no complex token synchronization)
- WhatsApp Web protocol authentication instead of API tokens
- Different port allocation (29318 vs 29317)

31
CloudronManifest.json Normal file
View File

@ -0,0 +1,31 @@
{
"version": "1.0.0",
"upstreamVersion": "0.10.8",
"id": "dev.maunium.whatsapp.cloudronapp",
"title": "Matrix WhatsApp Bridge",
"author": "Tulir Asokan <tulir@maunium.net>",
"description": "file://DESCRIPTION.md",
"tagline": "Bridge between Matrix and WhatsApp",
"healthCheckPath": "/health",
"httpPort": 29318,
"icon": "logo.png",
"addons": {
"localstorage": {},
"postgresql": {}
},
"manifestVersion": 2,
"website": "https://docs.mau.fi/bridges/go/whatsapp/index.html",
"contactEmail": "support@cloudron.io",
"tags": [
"matrix",
"whatsapp",
"chat",
"bridge",
"communication"
],
"minBoxVersion": "7.1.0",
"postInstallMessage": "Mautrix-WhatsApp bridge is installed!\n\nPlease note you will need to:\n1. Configure your homeserver by setting up the registration\n2. Configure the bridge in the data directory\n3. Authenticate with WhatsApp using QR code or pairing code\n\nVisit https://docs.mau.fi/bridges/go/whatsapp/index.html for detailed instructions.",
"changelog": "file://CHANGELOG.md",
"documentationUrl": "https://docs.mau.fi/bridges/go/whatsapp/index.html",
"forumUrl": "https://matrix.to/#/#whatsapp:maunium.net"
}

31
DESCRIPTION.md Normal file
View File

@ -0,0 +1,31 @@
A Matrix-WhatsApp bridge that allows you to chat with WhatsApp users from your Matrix client.
## Features
- **Two-way bridging**: Send and receive messages between Matrix and WhatsApp
- **Media support**: Share images, videos, documents, and voice messages
- **Group chats**: Bridge WhatsApp groups to Matrix rooms
- **WhatsApp Web**: Uses WhatsApp Web protocol for reliable connectivity
- **End-to-end encryption**: Supports Matrix E2EE in bridged rooms
- **Reactions**: Bridge message reactions between platforms
- **Read receipts**: Sync read status between Matrix and WhatsApp
- **Typing indicators**: Show when users are typing
- **Contact sync**: Automatically create Matrix rooms for WhatsApp contacts
## Requirements
- Matrix homeserver with application service support
- WhatsApp account with phone number
- PostgreSQL database (provided by Cloudron)
## Authentication
The bridge uses WhatsApp Web's authentication system. You'll need to:
1. Start the bridge and send `login` to the bridge bot
2. Scan the QR code with WhatsApp on your phone
3. The bridge will maintain the connection automatically
## Support
For help and discussion, join the Matrix room: [#whatsapp:maunium.net](https://matrix.to/#/#whatsapp:maunium.net)

40
Dockerfile.cloudron Normal file
View File

@ -0,0 +1,40 @@
FROM cloudron/base:5.0.0@sha256:04fd70dbd8ad6149c19de39e35718e024417c3e01dc9c6637eaf4a41ec4e596c
# Install dependencies
RUN apt-get update && apt-get install -y \
curl \
ca-certificates \
netcat-openbsd \
bash \
jq \
yq \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install Go
ENV GO_VERSION=1.21.4
RUN curl -LO https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz \
&& tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz \
&& rm go${GO_VERSION}.linux-amd64.tar.gz
ENV PATH="/usr/local/go/bin:$PATH"
# Create app directories
RUN mkdir -p /app/code /app/pkg /app/data
WORKDIR /app/code
# Download and build mautrix-whatsapp
RUN git clone https://github.com/mautrix/whatsapp.git . \
&& go build -o /app/pkg/mautrix-whatsapp
# Copy startup script
COPY start.sh /app/pkg/
# Set volumes and environment
VOLUME /app/data
ENV UID=1337 GID=1337
# Add health check endpoint
HEALTHCHECK --interval=60s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost:29318/health || exit 1
CMD ["/app/pkg/start.sh"]

39
Makefile Normal file
View File

@ -0,0 +1,39 @@
.PHONY: build clean package
# Repository details - change as needed
CLOUDRON_APP_ID = dev.maunium.whatsapp.cloudronapp
CLOUDRON_TOKEN ?=
# For development, we'll use the current git commit as the version
GIT_COMMIT = $(shell git rev-parse --short HEAD 2>/dev/null || echo "dev")
VERSION ?= dev-$(GIT_COMMIT)
# Docker image for cloudron package building
CLOUDRON_BUILDER_IMAGE = cloudron/package-builder:5.0.0
all: build
build:
docker build -t $(CLOUDRON_APP_ID) -f Dockerfile.cloudron .
# Clean build artifacts
clean:
rm -rf build.log latest.tgz
# Package for Cloudron in a consistent environment
package:
@mkdir -p build
docker run --rm -v "$(PWD):/app" $(CLOUDRON_BUILDER_IMAGE) build --set-version $(VERSION)
# For development - install directly in a test Cloudron
dev-install: package
cloudron install --image $(CLOUDRON_APP_ID) --location whatsapp.example.com
# Update the app in a dev Cloudron
dev-update:
cloudron update --app whatsapp.example.com --image $(CLOUDRON_APP_ID)
# Publish to a Cloudron app store (requires token)
publish:
@if [ -z "$(CLOUDRON_TOKEN)" ]; then echo "CLOUDRON_TOKEN is not set"; exit 1; fi
cloudron appstore publish --app $(CLOUDRON_APP_ID) --token $(CLOUDRON_TOKEN)

32
README.md Normal file
View File

@ -0,0 +1,32 @@
# Matrix WhatsApp Bridge for Cloudron
This is a Cloudron package for the [mautrix-whatsapp](https://github.com/mautrix/whatsapp) bridge.
## Installation
1. Install the app on your Cloudron
2. The app will generate a default configuration file on first run
3. Edit the configuration file at `/app/data/config.yaml` to set up your bridge
4. Restart the app to generate the registration file
5. Copy the registration file at `/app/data/registration.yaml` to your Matrix homeserver
6. Update your homeserver configuration to include the registration file
7. Restart your Matrix homeserver
8. Restart the bridge app
## Configuration
For detailed configuration instructions, please refer to the [official documentation](https://docs.mau.fi/bridges/go/whatsapp/index.html).
## Authentication
You will need to authenticate with WhatsApp to use the bridge. After starting the bridge:
1. Send `login` to the bridge bot
2. Scan the QR code with WhatsApp on your phone, or use the pairing code method
3. The bridge will connect to WhatsApp Web
## Support
For support with the bridge itself, please visit [#whatsapp:maunium.net](https://matrix.to/#/#whatsapp:maunium.net) on Matrix.
For issues with the Cloudron packaging, please file an issue on the GitHub repository.

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

80
start.sh Executable file
View File

@ -0,0 +1,80 @@
#!/bin/bash
set -eu
echo "=> Setting up mautrix-whatsapp bridge"
# Create necessary directories
mkdir -p /app/data
mkdir -p /app/data/logs
# For Cloudron, we run as the cloudron user
UID=$(id -u cloudron)
GID=$(id -g cloudron)
# Set ownership early to avoid permission issues
chown -R cloudron:cloudron /app/data
# Configuration file paths
CONFIG_PATH="/app/data/config.yaml"
REGISTRATION_PATH="/app/data/registration.yaml"
BACKUP_PATH="/app/data/config.yaml.bak"
# Create example config from built-in template
if [ ! -f "$CONFIG_PATH" ]; then
echo "=> Generating example configuration"
/usr/local/bin/gosu cloudron:cloudron /app/pkg/mautrix-whatsapp -g -c "$CONFIG_PATH" -r "$REGISTRATION_PATH"
# Configure for Cloudron environment
if [ -n "${CLOUDRON_POSTGRESQL_URL:-}" ]; then
echo "=> Configuring PostgreSQL database"
yq eval ".database = \"$CLOUDRON_POSTGRESQL_URL\"" -i "$CONFIG_PATH"
fi
if [ -n "${CLOUDRON_APP_DOMAIN:-}" ]; then
echo "=> Configuring homeserver and appservice settings"
BASE_DOMAIN=$(echo "$CLOUDRON_APP_DOMAIN" | cut -d. -f2-)
# Update homeserver configuration
yq eval ".homeserver.address = \"https://matrix.$BASE_DOMAIN\"" -i "$CONFIG_PATH"
yq eval ".homeserver.domain = \"$BASE_DOMAIN\"" -i "$CONFIG_PATH"
# Update appservice configuration
yq eval ".appservice.address = \"https://$CLOUDRON_APP_DOMAIN\"" -i "$CONFIG_PATH"
yq eval ".appservice.hostname = \"0.0.0.0\"" -i "$CONFIG_PATH"
yq eval ".appservice.port = 29318" -i "$CONFIG_PATH"
fi
# Set log file path
yq eval ".logging.handlers.file.filename = \"/app/data/logs/mautrix-whatsapp.log\"" -i "$CONFIG_PATH"
chown cloudron:cloudron "$CONFIG_PATH" "$REGISTRATION_PATH"
echo "=> Initial configuration complete"
echo "=> IMPORTANT: Please review $CONFIG_PATH and configure your Matrix homeserver settings"
echo "=> You will need to:"
echo " 1. Copy $REGISTRATION_PATH to your Matrix homeserver"
echo " 2. Update your homeserver configuration to include the registration file"
echo " 3. Restart your Matrix homeserver"
echo " 4. Restart this bridge app"
echo " 5. Authenticate with WhatsApp using QR code scanning"
else
echo "=> Using existing configuration"
fi
# Final permission fix before starting
chown -R cloudron:cloudron /app/data
# Create a health check endpoint (run in background)
mkdir -p /run/health
echo '#!/bin/bash
echo "HTTP/1.1 200 OK"
echo "Content-Type: text/plain"
echo ""
echo "OK"' > /run/health/server.sh
chmod +x /run/health/server.sh
(cd /run/health && nohup nc -l -p 29318 -e ./server.sh > /dev/null 2>&1) &
# Start the bridge
echo "=> Starting mautrix-whatsapp bridge"
exec /usr/local/bin/gosu cloudron:cloudron /app/pkg/mautrix-whatsapp -c "$CONFIG_PATH"