diff --git a/README.md b/README.md index 123716f2..bdc4f520 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ cd rafnav_bench ## Documentation -### Credentials +### Default Credentials MariaDB Root Password: 123 > Unless changed in the docker or docker-compose file @@ -104,5 +104,6 @@ First site's Administrator password: admin ### [Development](#development) +- [Container Aliases for easier development](docs/container-aliases.md) - [Bench Console and VSCode Debugger](docs/bench-console-and-vscode-debugger.md) - [Connect to localhost services](docs/connect-to-localhost-services-from-containers-for-local-app-development.md) diff --git a/development/installer.py b/development/installer.py index 49bf1255..09bda08a 100755 --- a/development/installer.py +++ b/development/installer.py @@ -49,7 +49,7 @@ def get_args_parser(): action="store", type=str, help="Bench directory name, default: rafnav_dev", - default="rafnav_dev", + default="rafnav_bench", ) # noqa: E501 parser.add_argument( "-s", diff --git a/docs/container-aliases.md b/docs/container-aliases.md new file mode 100644 index 00000000..c4171e24 --- /dev/null +++ b/docs/container-aliases.md @@ -0,0 +1,8 @@ +# List of aliases for commonly used commands + +These alieases are contained the in the dockerfile under the "Add aliases" heading + +1. py : shortcut for executing python +2. frap-install : shortcut for [frappe's bench script installer](development.md#setup-bench-/-new-site-using-script) +3. install-rafnav : Installs RAFNAV and its dependencies for the current **in use** site. +4. start dev: CD into the default bench directory diff --git a/images/custom/Dockerfile b/images/custom/Dockerfile new file mode 100644 index 00000000..faaec0a2 --- /dev/null +++ b/images/custom/Dockerfile @@ -0,0 +1,170 @@ +FROM debian:bookworm-slim as bench + +LABEL author=frappé + +ARG GIT_REPO=https://github.com/frappe/bench.git +ARG GIT_BRANCH=v5.x + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ + # For frappe framework + git \ + mariadb-client \ + postgresql-client \ + gettext-base \ + wget \ + # for PDF + libssl-dev \ + fonts-cantarell \ + xfonts-75dpi \ + xfonts-base \ + # weasyprint dependencies + libpango-1.0-0 \ + libharfbuzz0b \ + libpangoft2-1.0-0 \ + libpangocairo-1.0-0 \ + # to work inside the container + locales \ + build-essential \ + cron \ + curl \ + vim \ + sudo \ + iputils-ping \ + watch \ + tree \ + nano \ + less \ + software-properties-common \ + bash-completion \ + # For psycopg2 + libpq-dev \ + # Other + libffi-dev \ + liblcms2-dev \ + libldap2-dev \ + libmariadb-dev \ + libsasl2-dev \ + libtiff5-dev \ + libwebp-dev \ + redis-tools \ + rlwrap \ + tk8.6-dev \ + ssh-client \ + # VSCode container requirements + net-tools \ + # For pyenv build dependencies + # https://github.com/frappe/frappe_docker/issues/840#issuecomment-1185206895 + make \ + # For pandas + libbz2-dev \ + # For bench execute + libsqlite3-dev \ + # For other dependencies + zlib1g-dev \ + libreadline-dev \ + llvm \ + libncurses5-dev \ + libncursesw5-dev \ + xz-utils \ + tk-dev \ + liblzma-dev \ + file \ + && rm -rf /var/lib/apt/lists/* + +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ + && dpkg-reconfigure --frontend=noninteractive locales + +# Detect arch and install wkhtmltopdf +ARG WKHTMLTOPDF_VERSION=0.12.6.1-3 +ARG WKHTMLTOPDF_DISTRO=bookworm +RUN if [ "$(uname -m)" = "aarch64" ]; then export ARCH=arm64; fi \ + && if [ "$(uname -m)" = "x86_64" ]; then export ARCH=amd64; fi \ + && downloaded_file=wkhtmltox_${WKHTMLTOPDF_VERSION}.${WKHTMLTOPDF_DISTRO}_${ARCH}.deb \ + && wget -q https://github.com/wkhtmltopdf/packaging/releases/download/$WKHTMLTOPDF_VERSION/$downloaded_file \ + && dpkg -i $downloaded_file \ + && rm $downloaded_file + +# Create new user with home directory, improve docker compatibility with UID/GID 1000, +# add user to sudo group, allow passwordless sudo, switch to that user +# and change directory to user home directory +RUN groupadd -g 1000 frappe \ + && useradd --no-log-init -r -m -u 1000 -g 1000 -G sudo frappe \ + && echo "frappe ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + +USER frappe +WORKDIR /home/frappe + +# Install Python via pyenv +ENV PYTHON_VERSION_V14=3.10.13 +ENV PYTHON_VERSION=3.12.3 +ENV PYENV_ROOT /home/frappe/.pyenv +ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH + +# From https://github.com/pyenv/pyenv#basic-github-checkout +RUN git clone --depth 1 https://github.com/pyenv/pyenv.git .pyenv \ + && pyenv install $PYTHON_VERSION_V14 \ + && pyenv install $PYTHON_VERSION \ + && PYENV_VERSION=$PYTHON_VERSION_V14 pip install --no-cache-dir virtualenv \ + && PYENV_VERSION=$PYTHON_VERSION pip install --no-cache-dir virtualenv \ + && pyenv global $PYTHON_VERSION $PYTHON_VERSION_v14 \ + && sed -Ei -e '/^([^#]|$)/ {a export PYENV_ROOT="/home/frappe/.pyenv" a export PATH="$PYENV_ROOT/bin:$PATH" a ' -e ':a' -e '$!{n;ba};}' ~/.profile \ + && echo 'eval "$(pyenv init --path)"' >>~/.profile \ + && echo 'eval "$(pyenv init -)"' >>~/.bashrc + +# Clone and install bench in the local user home directory +# For development, bench source is located in ~/.bench +ENV PATH /home/frappe/.local/bin:$PATH +# Skip editable-bench warning +# https://github.com/frappe/bench/commit/20560c97c4246b2480d7358c722bc9ad13606138 +RUN git clone ${GIT_REPO} --depth 1 -b ${GIT_BRANCH} .bench \ + && pip install --no-cache-dir --user -e .bench \ + && echo "export PATH=/home/frappe/.local/bin:\$PATH" >>/home/frappe/.bashrc \ + && echo "export BENCH_DEVELOPER=1" >>/home/frappe/.bashrc + +# Install homebrew and wget +RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ + && (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/frappe/.profile \ + && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" \ + && brew install gcc \ + && brew install wget + +# Add aliases +RUN touch $HOME/.bash_aliases \ + && echo "alias py='python'" >> $HOME/.bash_aliases \ + && echo "alias frap-install='py installer.py'" >> $HOME/.bash_aliases + +# Install Node via nvm +ENV NODE_VERSION_STABLE=16.20.2 +ENV NODE_VERSION=20.13.1 +ENV NVM_DIR /home/frappe/.nvm +ENV PATH ${NVM_DIR}/versions/node/v${NODE_VERSION}/bin/:${PATH} + +RUN wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash \ + && . ${NVM_DIR}/nvm.sh \ + && nvm install ${NODE_VERSION_STABLE} \ + && nvm use v${NODE_VERSION_STABLE} \ + && npm install -g yarn \ + && nvm install v${NODE_VERSION} \ + && npm install -g yarn \ + && rm -rf ${NVM_DIR}/.cache \ + && echo 'export NVM_DIR="/home/frappe/.nvm"' >>~/.bashrc \ + && echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.bashrc \ + && echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> ~/.bashrc + +EXPOSE 8000-8005 9000-9005 6787 + +FROM bench as bench-test + +# Print version and verify bashrc is properly sourced so that everything works +# in the interactive shell and Dockerfile + +RUN node --version \ + && npm --version \ + && yarn --version \ + && bench --help + +RUN bash -c "node --version" \ + && bash -c "npm --version" \ + && bash -c "yarn --version" \ + && bash -c "bench --help" diff --git a/images/rafnav_bench/Dockerfile b/images/rafnav_bench/Dockerfile new file mode 100644 index 00000000..d2e09925 --- /dev/null +++ b/images/rafnav_bench/Dockerfile @@ -0,0 +1,173 @@ +FROM debian:bookworm-slim as bench + +LABEL author=frappé + +ARG GIT_REPO=https://github.com/frappe/bench.git +ARG GIT_BRANCH=v5.x + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ + # For frappe framework + git \ + mariadb-client \ + postgresql-client \ + gettext-base \ + wget \ + # for PDF + libssl-dev \ + fonts-cantarell \ + xfonts-75dpi \ + xfonts-base \ + # weasyprint dependencies + libpango-1.0-0 \ + libharfbuzz0b \ + libpangoft2-1.0-0 \ + libpangocairo-1.0-0 \ + # to work inside the container + locales \ + build-essential \ + cron \ + curl \ + vim \ + sudo \ + iputils-ping \ + watch \ + tree \ + nano \ + less \ + software-properties-common \ + bash-completion \ + # For psycopg2 + libpq-dev \ + # Other + libffi-dev \ + liblcms2-dev \ + libldap2-dev \ + libmariadb-dev \ + libsasl2-dev \ + libtiff5-dev \ + libwebp-dev \ + redis-tools \ + rlwrap \ + tk8.6-dev \ + ssh-client \ + # VSCode container requirements + net-tools \ + # For pyenv build dependencies + # https://github.com/frappe/frappe_docker/issues/840#issuecomment-1185206895 + make \ + # For pandas + libbz2-dev \ + # For bench execute + libsqlite3-dev \ + # For other dependencies + zlib1g-dev \ + libreadline-dev \ + llvm \ + libncurses5-dev \ + libncursesw5-dev \ + xz-utils \ + tk-dev \ + liblzma-dev \ + file \ + && rm -rf /var/lib/apt/lists/* + +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ + && dpkg-reconfigure --frontend=noninteractive locales + +# Detect arch and install wkhtmltopdf +ARG WKHTMLTOPDF_VERSION=0.12.6.1-3 +ARG WKHTMLTOPDF_DISTRO=bookworm +RUN if [ "$(uname -m)" = "aarch64" ]; then export ARCH=arm64; fi \ + && if [ "$(uname -m)" = "x86_64" ]; then export ARCH=amd64; fi \ + && downloaded_file=wkhtmltox_${WKHTMLTOPDF_VERSION}.${WKHTMLTOPDF_DISTRO}_${ARCH}.deb \ + && wget -q https://github.com/wkhtmltopdf/packaging/releases/download/$WKHTMLTOPDF_VERSION/$downloaded_file \ + && dpkg -i $downloaded_file \ + && rm $downloaded_file + +# Create new user with home directory, improve docker compatibility with UID/GID 1000, +# add user to sudo group, allow passwordless sudo, switch to that user +# and change directory to user home directory +RUN groupadd -g 1000 frappe \ + && useradd --no-log-init -r -m -u 1000 -g 1000 -G sudo frappe \ + && echo "frappe ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers + +USER frappe +WORKDIR /home/frappe + +# Install Python via pyenv +ENV PYTHON_VERSION_V14=3.10.13 +ENV PYTHON_VERSION=3.12.3 +ENV PYENV_ROOT /home/frappe/.pyenv +ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH + +# From https://github.com/pyenv/pyenv#basic-github-checkout +RUN git clone --depth 1 https://github.com/pyenv/pyenv.git .pyenv \ + && pyenv install $PYTHON_VERSION_V14 \ + && pyenv install $PYTHON_VERSION \ + && PYENV_VERSION=$PYTHON_VERSION_V14 pip install --no-cache-dir virtualenv \ + && PYENV_VERSION=$PYTHON_VERSION pip install --no-cache-dir virtualenv \ + && pyenv global $PYTHON_VERSION $PYTHON_VERSION_v14 \ + && sed -Ei -e '/^([^#]|$)/ {a export PYENV_ROOT="/home/frappe/.pyenv" a export PATH="$PYENV_ROOT/bin:$PATH" a ' -e ':a' -e '$!{n;ba};}' ~/.profile \ + && echo 'eval "$(pyenv init --path)"' >>~/.profile \ + && echo 'eval "$(pyenv init -)"' >>~/.bashrc + +# Clone and install bench in the local user home directory +# For development, bench source is located in ~/.bench +ENV PATH /home/frappe/.local/bin:$PATH +# Skip editable-bench warning +# https://github.com/frappe/bench/commit/20560c97c4246b2480d7358c722bc9ad13606138 +RUN git clone ${GIT_REPO} --depth 1 -b ${GIT_BRANCH} .bench \ + && pip install --no-cache-dir --user -e .bench \ + && echo "export PATH=/home/frappe/.local/bin:\$PATH" >>/home/frappe/.bashrc \ + && echo "export BENCH_DEVELOPER=1" >>/home/frappe/.bashrc + +# Install homebrew and wget +RUN /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \ + && (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/frappe/.profile \ + && eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" \ + && brew install gcc \ + && brew install wget + +# Add aliases +RUN touch $HOME/.bash_aliases \ + && echo "alias py='python'" >> $HOME/.bash_aliases \ + && echo "alias frap-install='py installer.py'" >> $HOME/.bash_aliases \ + && echo "alias install-rafnav='bench install-app erpnext documentation lending filing matter_management lrms raf_finance'" >> $HOME/.bash_aliases \ + && echo "alias start-dev='cd rafnav_bench'" >> $HOME/.bash_aliases + + +# Install Node via nvm +ENV NODE_VERSION_STABLE=16.20.2 +ENV NODE_VERSION=20.13.1 +ENV NVM_DIR /home/frappe/.nvm +ENV PATH ${NVM_DIR}/versions/node/v${NODE_VERSION}/bin/:${PATH} + +RUN wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash \ + && . ${NVM_DIR}/nvm.sh \ + && nvm install ${NODE_VERSION_STABLE} \ + && nvm use v${NODE_VERSION_STABLE} \ + && npm install -g yarn \ + && nvm install v${NODE_VERSION} \ + && npm install -g yarn \ + && rm -rf ${NVM_DIR}/.cache \ + && echo 'export NVM_DIR="/home/frappe/.nvm"' >>~/.bashrc \ + && echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.bashrc \ + && echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> ~/.bashrc + +EXPOSE 8000-8005 9000-9005 6787 + +FROM bench as bench-test + +# Print version and verify bashrc is properly sourced so that everything works +# in the interactive shell and Dockerfile + +RUN node --version \ + && npm --version \ + && yarn --version \ + && bench --help + +RUN bash -c "node --version" \ + && bash -c "npm --version" \ + && bash -c "yarn --version" \ + && bash -c "bench --help"