From 3b73457de3140ec28d42fc089bd332903202d042 Mon Sep 17 00:00:00 2001 From: missytake Date: Tue, 19 Aug 2025 10:46:23 +0200 Subject: [PATCH] www: introduce www_folder config item fix #529 --- CHANGELOG.md | 3 +++ README.md | 12 ++++++++++++ chatmaild/src/chatmaild/config.py | 1 + cmdeploy/src/cmdeploy/__init__.py | 26 +++++++++++++++++++------- cmdeploy/src/cmdeploy/www.py | 5 ++++- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4727133f..da339afc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## untagged +- Make www upload path configurable + ([#618](https://github.com/chatmail/relay/pull/618)) + - Check whether GCC is installed in initenv.sh ([#608](https://github.com/chatmail/relay/pull/608)) diff --git a/README.md b/README.md index 7ba08fdb..9f60d113 100644 --- a/README.md +++ b/README.md @@ -255,6 +255,18 @@ This starts a local live development cycle for chatmail web pages: - Starts a browser window automatically where you can "refresh" as needed. +#### Custom web pages + +You can skip uploading a web page +by setting `www_folder=disabled` in `chatmail.ini`. + +If you want to manage your web pages outside this git repository, +you can set `www_folder` in `chatmail.ini` to a custom directory on your computer. +`cmdeploy run` will upload it as the server's home page, +and if it contains a `src/index.md` file, +will build it with hugo. + + ## Mailbox directory layout Fresh chatmail addresses have a mailbox directory that contains: diff --git a/chatmaild/src/chatmaild/config.py b/chatmaild/src/chatmaild/config.py index 0cac3ea4..ec323142 100644 --- a/chatmaild/src/chatmaild/config.py +++ b/chatmaild/src/chatmaild/config.py @@ -33,6 +33,7 @@ class Config: self.password_min_length = int(params["password_min_length"]) self.passthrough_senders = params["passthrough_senders"].split() self.passthrough_recipients = params["passthrough_recipients"].split() + self.www_folder = params.get("www_folder") self.filtermail_smtp_port = int(params["filtermail_smtp_port"]) self.filtermail_smtp_port_incoming = int( params["filtermail_smtp_port_incoming"] diff --git a/cmdeploy/src/cmdeploy/__init__.py b/cmdeploy/src/cmdeploy/__init__.py index 9a4e4229..6aa7c5b0 100644 --- a/cmdeploy/src/cmdeploy/__init__.py +++ b/cmdeploy/src/cmdeploy/__init__.py @@ -11,7 +11,7 @@ from io import StringIO from pathlib import Path from chatmaild.config import Config, read_config -from pyinfra import facts, host +from pyinfra import facts, host, logger from pyinfra.api import FactBase from pyinfra.facts.files import File from pyinfra.facts.server import Sysctl @@ -751,12 +751,24 @@ def deploy_chatmail(config_path: Path, disable_mail: bool) -> None: packages=["fcgiwrap"], ) - www_path = importlib.resources.files(__package__).joinpath("../../../www").resolve() - - build_dir = www_path.joinpath("build") - src_dir = www_path.joinpath("src") - build_webpages(src_dir, build_dir, config) - files.rsync(f"{build_dir}/", "/var/www/html", flags=["-avz"]) + reporoot = importlib.resources.files(__package__).joinpath("../../../").resolve() + www_path = Path(config.www_folder) + # if www_folder was not set, use default directory + if not config.www_folder: + www_path = reporoot.joinpath("www") + # if www_folder was set to a non-existing folder, skip upload + if not www_path.is_dir(): + logger.warning("Building web pages is disabled in chatmail.ini, skipping") + else: + build_dir = www_path.joinpath("build") + src_dir = www_path.joinpath("src") + # if www_folder is a hugo page, build it + if src_dir.joinpath("index.md").is_file(): + build_webpages(src_dir, build_dir, config) + # if it is not a hugo page, upload it as is + else: + build_dir = www_path + files.rsync(f"{build_dir}/", "/var/www/html", flags=["-avz"]) _install_remote_venv_with_chatmaild(config) debug = False diff --git a/cmdeploy/src/cmdeploy/www.py b/cmdeploy/src/cmdeploy/www.py index 9dd404ba..253cc527 100644 --- a/cmdeploy/src/cmdeploy/www.py +++ b/cmdeploy/src/cmdeploy/www.py @@ -3,6 +3,7 @@ import importlib.resources import time import traceback import webbrowser +from pathlib import Path import markdown from chatmaild.config import read_config @@ -106,7 +107,9 @@ def main(): config = read_config(inipath) config.webdev = True assert config.mail_domain - www_path = reporoot.joinpath("www") + www_path = Path(config.www_folder) + if not config.www_folder: + www_path = reporoot.joinpath("www") src_path = www_path.joinpath("src") stats = None build_dir = www_path.joinpath("build")