diff --git a/official-templates/better-a1111/Dockerfile b/official-templates/better-a1111/Dockerfile new file mode 100644 index 0000000..1d9fef9 --- /dev/null +++ b/official-templates/better-a1111/Dockerfile @@ -0,0 +1,100 @@ +# Stage 1: Base Image +FROM madiator2011/better-base:cuda12.1 as base + +ARG PYTHON_VERSION1=3.11 + +# Install additional packages including zstd +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && \ + apt-get install -y pv git rsync libtcmalloc-minimal4 bc zstd && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Stage 2: A1111 Installation +FROM base as a1111-install + +# Create virtual environment with the correct path +RUN mkdir -p /workspace && python -m venv /workspace/ba1111 + +# Set environment variables for the virtual environment +ENV VIRTUAL_ENV="/workspace/ba1111" +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# Clone AUTOMATIC1111 Stable Diffusion WebUI and additional repositories +RUN git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git /stable-diffusion-webui && \ + mkdir -p /stable-diffusion-webui/repositories && \ + git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui-assets.git /stable-diffusion-webui/repositories/stable-diffusion-webui-assets && \ + git clone https://github.com/Stability-AI/stablediffusion.git /stable-diffusion-webui/repositories/stable-diffusion && \ + git clone https://github.com/Stability-AI/stablediffusion.git /stable-diffusion-webui/repositories/stable-diffusion-stability-ai && \ + git clone https://github.com/Stability-AI/generative-models.git /stable-diffusion-webui/repositories/generative-models && \ + git clone https://github.com/crowsonkb/k-diffusion.git /stable-diffusion-webui/repositories/k-diffusion && \ + git clone https://github.com/salesforce/BLIP.git /stable-diffusion-webui/repositories/BLIP && \ + rm /stable-diffusion-webui/webui-user.sh + +# Activate the virtual environment and install packages +RUN $VIRTUAL_ENV/bin/pip install --upgrade pip setuptools wheel && \ + $VIRTUAL_ENV/bin/pip install -r /stable-diffusion-webui/requirements_versions.txt && \ + $VIRTUAL_ENV/bin/pip install accelerate wheel && \ + $VIRTUAL_ENV/bin/pip install ipykernel ipywidgets && \ + $VIRTUAL_ENV/bin/pip install "https://github.com/openai/CLIP/archive/d50d76daa670286dd6cacf3bcd80b5e4823fc8e1.zip" && \ + $VIRTUAL_ENV/bin/pip install "https://github.com/mlfoundations/open_clip/archive/bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b.zip" && \ + $VIRTUAL_ENV/bin/pip install bitsandbytes==0.43.3 && \ + $VIRTUAL_ENV/bin/python -m ipykernel install --name "python3" --display-name "Python 3 (Better A1111 Venv)" && \ + $VIRTUAL_ENV/bin/pip install -U xformers --index-url https://download.pytorch.org/whl/cu121 + +# Create tar archive and compress with zstd +RUN tar -cf - -C /workspace ba1111 | zstd -T0 -f -o /ba1111.tar.zst + +# Remove the original venv to save space in the image +RUN rm -rf /workspace/ba1111 + +# New stage for uploading ba1111.tar.zst to MinIO +FROM a1111-install as uploader + +# Install boto3 +RUN pip install boto3 + +# Set MinIO configuration using environment variables +ENV MINIO_ENDPOINT=https://s3.madiator.com +ENV MINIO_ACCESS_KEY="" +ENV MINIO_SECRET_KEY="" +ENV MINIO_BUCKET="better" + +# Copy the upload script +COPY upload_to_minio.py /upload_to_minio.py + +# Set the entrypoint to the upload script +ENTRYPOINT ["python", "/upload_to_minio.py"] + +# Stage 3: Final Image +FROM a1111-install as final + +# Set environment variables for runtime +ENV VIRTUAL_ENV="/workspace/ba1111" +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# Copy the README.md +COPY README.md /usr/share/nginx/html/README.md + +# NGINX Proxy +COPY --from=proxy nginx.conf /etc/nginx/nginx.conf +COPY --from=proxy readme.html /usr/share/nginx/html/readme.html + +# Copy all necessary scripts +COPY --from=scripts start.sh / +COPY pre_start.sh /pre_start.sh +COPY webui-user.sh /stable-diffusion-webui/webui-user.sh +RUN chmod +x /start.sh /pre_start.sh /stable-diffusion-webui/webui-user.sh +COPY settings.json /root/.local/share/code-server/User/settings.json + +# Copy the tar.zst archive and Stable Diffusion WebUI +COPY --from=a1111-install /ba1111.tar.zst /ba1111.tar.zst +COPY --from=a1111-install /stable-diffusion-webui /stable-diffusion-webui + +# Welcome Message +COPY --from=logo runpod.txt /etc/runpod.txt +RUN echo 'cat /etc/runpod.txt' >> /root/.bashrc && \ + echo 'echo -e "\nFor detailed documentation and guides, please visit:\n\033[1;34mhttps://docs.runpod.io/\033[0m and \033[1;34mhttps://blog.runpod.io/\033[0m\n\n"' >> /root/.bashrc + +# CMD +CMD [ "/start.sh" ] \ No newline at end of file diff --git a/official-templates/better-a1111/README.md b/official-templates/better-a1111/README.md new file mode 100644 index 0000000..3fb5ea4 --- /dev/null +++ b/official-templates/better-a1111/README.md @@ -0,0 +1,7 @@ +## Build Options + +To build with default options, run `docker buildx bake`, to build a specific target, run `docker buildx bake `. + +## Ports + +- 22/tcp (SSH) diff --git a/official-templates/better-a1111/docker-bake.hcl b/official-templates/better-a1111/docker-bake.hcl new file mode 100644 index 0000000..56c54bd --- /dev/null +++ b/official-templates/better-a1111/docker-bake.hcl @@ -0,0 +1,17 @@ +group "default" { + targets = ["light"] +} + +target "light" { + contexts = { + scripts = "../../container-template" + proxy = "../../container-template/proxy" + logo = "../../container-template" + } + dockerfile = "Dockerfile" + args = { + BASE_IMAGE = "madiator2011/better-base:cuda12.1", + PYTHON_VERSION = "3.11" + } + tags = ["madiator2011/better-a1111:light"] +} \ No newline at end of file diff --git a/official-templates/better-a1111/pre_start.sh b/official-templates/better-a1111/pre_start.sh new file mode 100644 index 0000000..f628ec6 --- /dev/null +++ b/official-templates/better-a1111/pre_start.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Exit immediately if a command exits with a non-zero status +set -e + +# Function to print colorized feedback +print_feedback() { + GREEN='\033[0;32m' + NC='\033[0m' # No Color + echo -e "${GREEN}[Forge Startup]:${NC} $1" +} + +# Function to run rsync with progress bar and optimizations +rsync_with_progress() { + rsync -aHvx --info=progress2 --ignore-existing --update --stats "$@" +} + +# Check if the NO_SYNC variable is set to true +if [ "${NO_SYNC}" == "true" ]; then + print_feedback "Skipping sync and startup as per environment variable setting." + exec bash -c 'sleep infinity' +fi + +print_feedback "Starting A1111 setup..." + +# Extract the virtual environment if it doesn't exist +if [ ! -d "/workspace/ba1111" ]; then + print_feedback "Extracting virtual environment..." + mkdir -p /workspace/ba1111 + tar -xzf /ba1111.tar.gz -C /workspace/ba1111 +else + print_feedback "Virtual environment already exists, skipping extraction..." +fi + +# Activate the virtual environment +source /workspace/ba1111/bin/activate + +# Check if Stable Diffusion WebUI a111 exists in the workspace +if [ ! -d "/workspace/stable-diffusion-webui" ] || [ -z "$(ls -A /workspace/stable-diffusion-webui)" ]; then + print_feedback "Stable Diffusion WebUI A1111 not found or empty. Syncing all files..." + rsync_with_progress /stable-diffusion-webui/ /workspace/stable-diffusion-webui/ + print_feedback "Initial sync completed." +else + print_feedback "Stable Diffusion WebUI A1111 found. Skipping sync to preserve user modifications." +fi + +# Change to the a111 directory +cd /workspace/stable-diffusion-webui + +# Modify webui.sh to allow running as root, only if needed +print_feedback "Checking webui.sh configuration..." +if grep -q "can_run_as_root=0" webui.sh; then + print_feedback "Modifying webui.sh to allow running as root..." + sed -i 's/can_run_as_root=0/can_run_as_root=1/' webui.sh +else + print_feedback "webui.sh already configured to run as root or configuration not found." +fi + +# Create logs directory if it doesn't exist +mkdir -p /workspace/logs + +# Start webui-user.sh and log output +print_feedback "Starting webui-user.sh..." +./webui.sh -f > >(tee /workspace/logs/a1111.log) 2>&1 & \ No newline at end of file diff --git a/official-templates/better-a1111/settings.json b/official-templates/better-a1111/settings.json new file mode 100644 index 0000000..fbfa4ca --- /dev/null +++ b/official-templates/better-a1111/settings.json @@ -0,0 +1,21 @@ +{ + "workbench.colorTheme": "Default Dark Modern", + "workbench.startupEditor": "none", + "workbench.enableExperiments": false, + "telemetry.enableTelemetry": false, + "telemetry.enableCrashReporter": false, + "security.workspace.trust.enabled": false, + "update.mode": "manual", + "extensions.autoUpdate": false, + "python.showStartPage": false, + "jupyter.experiments.enabled": false, + "jupyter.askForKernelRestart": false, + "jupyter.askForKernelSource": false, + "jupyter.alwaysTrustNotebooks": true, + "extensions.ignoreRecommendations": true, + "files.autoSave": "afterDelay", + "files.autoSaveDelay": 1000, + "python.defaultInterpreterPath": "/workspace/ba1111/bin/python", + "python.analysis.extraPaths": ["/workspace/ba1111/lib/python3.11/site-packages"], + "jupyter.notebookFileRoot": "/workspace" +} \ No newline at end of file diff --git a/official-templates/better-a1111/upload_to_minio.py b/official-templates/better-a1111/upload_to_minio.py new file mode 100644 index 0000000..01b3cb8 --- /dev/null +++ b/official-templates/better-a1111/upload_to_minio.py @@ -0,0 +1,32 @@ +import os +import boto3 +from botocore.client import Config + +# MinIO configuration +minio_endpoint = os.environ.get('MINIO_ENDPOINT', 'https://s3.madiator.com') +minio_access_key = os.environ.get('MINIO_ACCESS_KEY', '') +minio_secret_key = os.environ.get('MINIO_SECRET_KEY', '') +minio_bucket = os.environ.get('MINIO_BUCKET', 'better') + +# File to upload +file_path = '/ba1111.tar.zst' +object_name = 'ba1111/ba1111.tar.zst' + +# Get file size +file_size = os.path.getsize(file_path) + +# Create a client with the MinIO configuration +s3_client = boto3.client('s3', + endpoint_url=minio_endpoint, + aws_access_key_id=minio_access_key, + aws_secret_access_key=minio_secret_key, + config=Config(signature_version='s3v4'), + region_name='us-east-1') + +# Upload the file +try: + s3_client.upload_file(file_path, minio_bucket, object_name) + print(f"File {file_path} uploaded successfully to {minio_bucket}/{object_name}") + print(f"File size: {file_size} bytes") +except Exception as e: + print(f"Error uploading file: {str(e)}") \ No newline at end of file diff --git a/official-templates/better-a1111/webui-user.sh b/official-templates/better-a1111/webui-user.sh new file mode 100644 index 0000000..d98646e --- /dev/null +++ b/official-templates/better-a1111/webui-user.sh @@ -0,0 +1,46 @@ +#!/bin/bash +######################################################### +# Uncomment and change the variables below to your need:# +######################################################### + +# Install directory without trailing slash +export install_dir="/workspace" + +# Name of the subdirectory +export clone_dir="stable-diffusion-webui" + +# Commandline arguments for webui.py, for example: +export COMMANDLINE_ARGS="--listen --port 7860 --enable-insecure-extension-access --api --xformers" + +# python3 executable +export python_cmd="python3" + +# git executable +export GIT="git" + +# python3 venv without trailing slash (defaults to ${install_dir}/${clone_dir}/venv) +export venv_dir="/workspace/ba1111" + +# script to launch to start the app +#export LAUNCH_SCRIPT="launch.py" + +# install command for torch +#export TORCH_COMMAND="pip install torch==1.12.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113" + +# Requirements file to use for stable-diffusion-webui +#export REQS_FILE="requirements_versions.txt" + +# Fixed git repos +#export K_DIFFUSION_PACKAGE="" +#export GFPGAN_PACKAGE="" + +# Fixed git commits +#export STABLE_DIFFUSION_COMMIT_HASH="" +#export CODEFORMER_COMMIT_HASH="" +#export BLIP_COMMIT_HASH="" + +# Uncomment to enable accelerated launch +#export ACCELERATE="True" + +# Uncomment to disable TCMalloc +#export NO_TCMALLOC="True" \ No newline at end of file