diff --git a/README.md b/README.md index fed75d2..25e2793 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,97 @@ -# digital_garden +# Automated Docker Deployment for My Quartz Digital Garden -Self-hosted, auto-updating deployment for a Quartz digital garden using Docker, NGINX, and Docker Compose. Content is synced from an Obsidian vault by a cron-managed script. \ No newline at end of file +**Last Updated:** May 29, 2025 + +## 1. Overview + +This repository contains the configuration and automation scripts to build, deploy, and automatically update a [Quartz](https://quartz.jzhao.xyz/) static site using Docker. The site content is sourced directly from a specified Obsidian vault directory, allowing for seamless updates when notes are changed. + +The setup uses: +- **Docker:** To containerize the Quartz build process and the NGINX web server. +- **Docker Compose:** To manage the Docker build and deployment lifecycle. +- **NGINX:** As the web server for the static site, with custom configuration for Quartz's clean URLs. +- **Multi-Stage Dockerfile:** For an efficient build, separating the Node.js build environment from the final NGINX runtime environment. +- **Shell Script (`update_quartz_docker.sh`):** The core automation script that handles: + - Cloning/updating the Quartz framework source code. + - Detecting changes in your Obsidian content. + - Preparing content for the Docker build. + - Triggering Docker image rebuilds and container deployments. +- **Cron Job:** For scheduling the `update_quartz_docker.sh` script to run periodically. + +## 2. Prerequisites + +Before you begin, ensure you have the following installed on your host system (e.g., NALTHIS): +- [Docker Engine](https://docs.docker.com/engine/install/) +- [Docker Compose](https://docs.docker.com/compose/install/) (The script uses `docker-compose` V1/V2 syntax) +- `git` +- `rsync` (used by the update script for copying content: `sudo apt install rsync`) +- Your Obsidian vault containing the Quartz content accessible on the host system. + +## 3. Repository Structure + +Key files in this repository: +- `Dockerfile`: Defines the multi-stage Docker build for building Quartz and serving it with NGINX. +- `docker-compose.yml`: Configures the Docker Compose service for the Quartz site. +- `update_quartz_docker.sh`: The main automation script for updates and deployment. +- `custom_nginx.conf`: Custom NGINX configuration for serving Quartz (handles clean URLs). +- `quartz.config.ts`: Your primary Quartz configuration file. +- `quartz.layout.ts`: (If customized) Your Quartz layout configuration. +- `.gitignore`: Ignores transient files, including the cloned `quartz/` directory. + +**External/Ignored Directories (managed by `update_quartz_docker.sh`):** +- `./quartz/`: A local clone of the Quartz framework, managed by the update script. This directory is added to `.gitignore`. +- `./content/`: A temporary directory created by the update script during builds to hold a copy of your Obsidian content. This directory is added to `.gitignore`. + +## 4. Setup and Configuration + +1. **Clone this Repository:** + ```bash + git clone my-quartz-deployment + cd my-quartz-deployment + ``` + +2. **Configure `update_quartz_docker.sh`:** + Open `update_quartz_docker.sh` and carefully review and update the following configuration variables at the top of the script: + * `QUARTZ_PROJECT_DIR`: Should be the absolute path to this `my-quartz-deployment` repository on your host. (e.g., `/home/hoid/projects/my-quartz-deployment`). + * `OBSIDIAN_CONTENT_SOURCE`: **Crucial!** The absolute path to the specific folder in your Obsidian vault that contains the Markdown files and assets for your Quartz site (e.g., `/home/hoid/docker/obsidian/vaults/weeslahw_coppermind/Digital_Garden`). + * `QUARTZ_FRAMEWORK_BRANCH`: The branch or tag of the `jackyzha0/quartz` repository you want to use (e.g., `v4`, `main`, or a specific version tag like `v4.2.5`). + * `DOCKER_COMPOSE_CMD`: The absolute path to your `docker-compose` executable. Find this by running `which docker-compose` in your terminal. (e.g., `/usr/local/bin/docker-compose`). + * `LOG_FILE`: Path to where the script will write its logs. + +3. **Customize Quartz Files:** + * Ensure your `quartz.config.ts`, `quartz.layout.ts` (if used), and any other custom Quartz files (e.g., in `assets/`, `components/` if you have them at the root of this deployment repo) are set up as desired. + * Verify `custom_nginx.conf` meets your needs (the default provided should work for Quartz). + +4. **Make the script executable:** + ```bash + chmod +x update_quartz_docker.sh + ``` + +## 5. How It Works + +The automation relies on the `update_quartz_docker.sh` script: + +1. **Quartz Framework:** The script first ensures a local clone of the Quartz framework (from the branch/tag specified in `QUARTZ_FRAMEWORK_BRANCH`) exists in the `./quartz/` directory. It will clone it if missing or attempt to update it if it exists. +2. **Change Detection:** It checks if any files in your `OBSIDIAN_CONTENT_SOURCE` directory are newer than a timestamp file (`.last_build_content_timestamp`) stored in this project's root. If no changes are detected, the script exits early. +3. **Content Preparation:** If changes are found (or on the first run): + * It removes any old temporary `./content/` directory. + * It creates a new `./content/` directory. + * It uses `rsync` to copy all files from your `OBSIDIAN_CONTENT_SOURCE` into this temporary `./content/` directory. This directory now becomes part of the Docker build context. +4. **Docker Deployment:** + * It runs `docker stop ` and `docker rm -f ` to preemptively remove any existing container with the target name, ensuring a clean slate. + * It runs `docker-compose down --remove-orphans --volumes` to further clean up any resources managed by Docker Compose for this project. + * It then runs `docker-compose up -d --build --remove-orphans`. This command: + * Builds a new Docker image using the `Dockerfile`. The `Dockerfile` copies the `./quartz/`, your custom config files (like `quartz.config.ts`), and the prepared `./content/` directory into the builder stage. `npm ci` is run using the framework's `package.json`, and then `npx quartz build` compiles your site. The resulting static files are copied into a final NGINX image. + * Starts a new container from the freshly built image in detached mode (`-d`). +5. **Timestamp & Cleanup:** + * If the deployment is successful, the `.last_build_content_timestamp` file is updated. + * The temporary `./content/` directory is removed to keep the project directory clean. + +## 6. Usage + +### A. Manual Deployment/Update + +You can run the script manually at any time to build and deploy your site: +```bash +cd /path/to/your/my-quartz-deployment +./update_quartz_docker.sh \ No newline at end of file