Skip to content

Commit

Permalink
Merge pull request #140 from entelecheia/main
Browse files Browse the repository at this point in the history
  • Loading branch information
entelecheia authored Apr 5, 2024
2 parents 5f69ae9 + 3a814bd commit 5d1d1b7
Show file tree
Hide file tree
Showing 10 changed files with 254 additions and 29 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
<!--next-version-placeholder-->

## v0.38.7 (2024-03-28)

### Fix

* **configuration:** Remove unnecessary commented-out code and prompts for various services. ([`ed66e3d`](https://github.com/entelecheia/dotfiles/commit/ed66e3d475b54db3fd49de54af30fa39cc460c96))

## v0.38.6 (2024-03-27)

### Fix
Expand Down
106 changes: 106 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,112 @@ Easily manage and synchronize your dotfiles across multiple environments with th

The Dotfiles project offers a comprehensive solution for managing and synchronizing your dotfiles across various environments, including local development, CI/CD pipelines, and production systems. With this tool, you can effortlessly maintain a consistent development environment, simplifying collaboration and reducing the time spent on setting up new machines. The Dotfiles project uses the Chezmoi framework, providing a secure and flexible way to manage your configuration files. The project also includes support for additional integrations, such as Docker, GitHub repositories, and password management tools, further enhancing your development experience. Get started with the Dotfiles project today and enjoy a seamless, hassle-free configuration management process.

## Getting started

The following guide will walk you through the process of installing and initializing the Dotfiles project on your machine. This will help you set up a consistent development environment across different systems, simplifying your workflow and making it easier to collaborate with others.

### Prerequisites

Before proceeding with the installation, ensure that your system has the following tools:

- `wget` or `curl`: To fetch the installation script from the internet.
- `git`: To clone the Dotfiles repository.

Most Linux distributions come with these tools pre-installed. If not, you can install them using your package manager.

### Installing Dotfiles

To install the Dotfiles project on your machine, you need to fetch the installation script and execute it. You can do this using either `wget` or `curl`:

#### Using `wget`:

```bash
sh -c "$(wget -qO- https://dotfiles.entelecheia.ai/install)"
```

#### Using `curl`:

```bash
sh -c "$(curl -fsSL https://dotfiles.entelecheia.ai/install)"
```

Running the above command will download the installation script and execute it, cloning the Dotfiles repository to your machine and setting up the necessary configurations.

![install dotfiles script](https://github.com/entelecheia/dotfiles/blob/main/docs/figs/install_dotfiles_script.png?raw=true)
For unattended installations such as in a dockerfile, you can use the environment variables to initialize the dotfiles automatically. For example:

```dockerfile
# install dotfiles
ARG USER_FULLNAME="John Doe"
ARG USER_EMAIL="[email protected]"
ARG GITHUB_USERNAME="john-doe"
ARG SYSTEM_HOSTNANE="devcon-arm64"

ENV USER_FULLNAME=$USER_FULLNAME
ENV USER_EMAIL=$USER_EMAIL
ENV GITHUB_USERNAME=$GITHUB_USERNAME
ENV SYSTEM_HOSTNAME=$SYSTEM_HOSTNAME
ENV WORKSPACE_LOCATION="/"
ENV DOTFILES_APPLY_ROOTMOI=0
ENV REMOTE_CONTAINERS=1

RUN sh -c "$(wget -qO- https://dotfiles.entelecheia.ai/install)"

CMD ["zsh"]
```

Or you can provide the environment variables in the command line:

```bash
USER_FULLNAME="John Doe" \
USER_EMAIL="[email protected]" \
GITHUB_USERNAME="john-doe" \
SYSTEM_HOSTNAME="devcon-arm64" \
WORKSPACE_LOCATION="/" \
DOTFILES_APPLY_ROOTMOI=0 \
REMOTE_CONTAINERS=1 \
sh -c "$(wget -qO- https://dotfiles.entelecheia.ai/install)"
```

### Initializing Dotfiles

After the installation, the initialization process will start automatically. This step applies the configurations defined in your dotfiles to your system, ensuring a consistent development environment.

![initialize dotfiles](https://github.com/entelecheia/dotfiles/blob/main/docs/figs/initialize_dotfiles.png?raw=true)

If you need to re-initialize your dotfiles manually, you can run the following command:

```bash
dotu init
```

This command will update your system with the latest configurations from your dotfiles, keeping your environment up-to-date and in sync with any changes you've made.

Once the initialization process is complete, you can start using your newly configured development environment. Feel free to explore the available configurations and customize them to your preferences.

## Repositories and repository templates for setting up your own dotfiles

- [dotdrop-files](https://github.com/entelecheia/dotdrop-files)
- [password-store](https://github.com/entelecheia/password-store)
- [passage-store](https://github.com/entelecheia/passage-store)

## Installing the font on **Windows**

1. [Download Fira Code Regular Nerd Font Complete](https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/complete/Fira%20Code%20Regular%20Nerd%20Font%20Complete.ttf).
2. Open the downloaded file and click **Install**.
3. Restart **Windows Terminal** or **VS Code**.

### Configuring the font in **VS Code**

1. Open settings by pressing <kbd>Ctrl/Cmd</kbd>+<kbd>,</kbd>.
2. Change the font family to **FiraCode Nerd Font** in **_Terminal › Integrated: Font Family_**.

### Configuring the font in **Windows Terminal**

1. On **Windows Terminal**, press <kbd>Ctrl</kbd>+<kbd>,</kbd> to open the settings.
2. Go to **_Profiles -> Defaults_** in the left panel. Then, go to **_Additional settings -> Appearance_**.
3. At **_Text -> Font face_**, enable the **_Show all fonts_** option and select **_FiraCode Nerd Font_**. Like below:

## Changelog

See the [CHANGELOG] for more information.
Expand Down
2 changes: 1 addition & 1 deletion chezmoi/.chezmoidata.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
DOTFILES_VERSION: 0.38.6
DOTFILES_VERSION: 0.38.7
packages:
- name: 1password-cli
apt: true
Expand Down
7 changes: 7 additions & 0 deletions chezmoi/dot_config/shrc/20-export.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,10 @@ fi
if command -v fig >/dev/null 2>&1 && [ -d "${HOME}/.fig/bin" ]; then
export PATH="${HOME}/.fig/bin:${PATH}"
fi

{{ if not .system.is_wsl -}}
# Allow connections from any host
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
# Allow connections from Docker containers
export LIBGL_ALWAYS_INDIRECT=1
{{- end }}
132 changes: 108 additions & 24 deletions chezmoi/dot_local/bin/executable_dk-compose.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Options:
--variant IMAGE_VARIANT Specify a variant for the Docker image.
--from-project Use the project directory to build the Docker image.
--project-directory DIR Specify the project directory. Default is the Docker name inside the workspace project directory.
--project-id PROJECT_ID Specify the project id to differentiate between multiple containers.
--dockerfiles-directory DIR Specify the directory containing Docker files. Default is the .docker directory inside the project directory.
-c, --compose-file FILE Specify the Docker Compose file. Default is docker-compose.yaml inside the Docker files directory.
-e, --env-file FILE Specify the environment file for Docker Compose.
Expand All @@ -29,6 +30,7 @@ Options:
--push Push the Docker image after building it.
--registry CONTAINER_REGISTRY Specify the Docker registry.
-n, --name IMAGE_NAME Specify the name of the Docker image.
--service SERVICE_NAME Specify the name of the Docker service.
--network NETWORK_NAME Specify the Docker network.
-u, --username USERNAME Specify the username. Default is the current user.
-h, --help Display this help message.
Expand All @@ -41,8 +43,9 @@ dk-compose build my-service --variant app --version latest --from-project --proj

# declare arguments
COMMAND=""
DOCKER_PROJECT_NAME=""
IMAGE_VARIANT="base"
DOCKER_PROJECT_NAME=${DOCKER_PROJECT_NAME:-""}
DOCKER_PROJECT_ID=${DOCKER_PROJECT_ID:-"default"}
IMAGE_VARIANT=${IMAGE_VARIANT:-"base"}
PROJECT_DIR=""
DOCKERFILES_DIR=""
COMPOSE_FILENAME=""
Expand All @@ -54,8 +57,9 @@ SECRET_ENV_FILE=""
IMAGE_VERSION=""
LATEST="false"
PUSH="false"
FROM_PROJECT="false"
FROM_PROJECT="true"
IMAGE_NAME=""
SERVICE_NAME="workspace"
CONTAINER_NETWORK_NAME=""
CONTAINER_REGISTRY=${CONTAINER_REGISTRY:-"{{ .docker.container_registry }}"}
USERNAME=${USERNAME:-"{{ .chezmoi.username }}"}
Expand All @@ -66,20 +70,24 @@ set +u
# first argument is the command
COMMAND="$1"
shift
if [[ "$COMMAND" != "build" ]] && [[ "$COMMAND" != "run" ]] && [[ "$COMMAND" != "up" ]] && [[ "$COMMAND" != "down" ]] && [[ "$COMMAND" != "config" ]]; then
if [[ "$COMMAND" == "" ]] || [[ "$COMMAND" == "-h" ]] || [[ "$COMMAND" == "--help" ]]; then
echo "Usage: $0 $USAGE" >&2
exit 1
fi
if [[ "$COMMAND" != "build" ]] && [[ "$COMMAND" != "run" ]] && [[ "$COMMAND" != "up" ]] && [[ "$COMMAND" != "down" ]] && [[ "$COMMAND" != "config" ]] && [[ "$COMMAND" != "push" ]]; then
echo "Invalid command: $COMMAND" >&2
echo "Usage: $0 $USAGE" >&2
exit 1
fi
# check second argument starts with a dash
# if it does, it's an option and DOCKER_PROJECT_NAME can be the last argument
# if not, it's the DOCKER_PROJECT_NAME
if [[ "$1" != -* ]]; then
if [[ "$1" != -* ]] && [[ $# -gt 0 ]]; then
# if no arguments, print usage
if [[ $# -eq 0 ]]; then
echo "Usage: $0 $USAGE" >&2
exit 1
fi
# if [[ $# -eq 0 ]]; then
# echo "Usage: $0 $USAGE" >&2
# exit 1
# fi
DOCKER_PROJECT_NAME="$1"
shift
fi
Expand All @@ -103,6 +111,13 @@ while [[ $# -gt 0 ]]; do
--project-directory=*)
PROJECT_DIR="${1#*=}"
;;
--project-id)
DOCKER_PROJECT_ID="$2"
shift
;;
--project-id=*)
DOCKER_PROJECT_ID="${1#*=}"
;;
--dockerfiles-directory)
DOCKERFILES_DIR="$2"
shift
Expand Down Expand Up @@ -165,6 +180,13 @@ while [[ $# -gt 0 ]]; do
--name=*)
IMAGE_NAME="${1#*=}"
;;
--service)
SERVICE_NAME="$2"
shift
;;
--service=*)
SERVICE_NAME="${1#*=}"
;;
--registry)
CONTAINER_REGISTRY="$2"
shift
Expand Down Expand Up @@ -222,10 +244,22 @@ export IMAGE_VERSION
DOCKERFILES_SHARE_DIR=${DOCKERFILES_SHARE_DIR:-"{{ .docker.share_dir }}"}
# check PATHs
if [[ -z "$PROJECT_DIR" ]]; then
PROJECT_DIR="${WORKSPACE_PROJECT_DIR}/${DOCKER_PROJECT_NAME}"
if [[ -z "$DOCKER_PROJECT_NAME" ]]; then
PROJECT_DIR="."
else
PROJECT_DIR="${WORKSPACE_PROJECT_DIR}/${DOCKER_PROJECT_NAME}"
fi
fi
# if project directory does not exist, try WORKSPACE_CONTAINER_DIR
if [[ ! -d "$PROJECT_DIR" ]]; then
PROJECT_DIR="${WORKSPACE_CONTAINER_DIR}/${DOCKER_PROJECT_NAME}"
fi
# if project directory does not exist, try current directory
if [[ ! -d "$PROJECT_DIR" ]]; then
PROJECT_DIR="./${DOCKER_PROJECT_NAME}"
fi
# if project directory does not exist or FROM_PROJECT is false, use dockerfile repo path
if [[ ! -d "$PROJECT_DIR" ]] || [[ "$FROM_PROJECT" != "false" ]]; then
if [[ ! -d "$PROJECT_DIR" ]] || [[ "$FROM_PROJECT" == "false" ]]; then
PROJECT_DIR="${DOCKERFILES_SHARE_DIR}/src/${DOCKER_PROJECT_NAME}"
fi
# if it still does not exist, exit
Expand All @@ -244,12 +278,8 @@ if [[ -n "$COMPOSE_FILENAME" ]]; then
else
if [[ -n "$IMAGE_VARIANT" ]]; then
# {base_name}-{IMAGE_VARIANT}.{ext}
COMPOSE_FILENAME="docker-compose-${IMAGE_VARIANT}.yaml"
COMPOSE_FILENAME="docker-compose.${IMAGE_VARIANT}.yaml"
COMPOSE_FILE="${DOCKERFILES_DIR}/${COMPOSE_FILENAME}"
if [[ ! -f "$COMPOSE_FILE" ]]; then
COMPOSE_FILENAME="docker-compose.${IMAGE_VARIANT}.yaml"
COMPOSE_FILE="${DOCKERFILES_DIR}/${COMPOSE_FILENAME}"
fi
else
# {base_name}.{ext}
COMPOSE_FILENAME="docker-compose.yaml"
Expand All @@ -273,7 +303,6 @@ if [[ -n "$CONTAINER_REGISTRY" ]]; then
export CONTAINER_REGISTRY
fi
# export user id and group id
export USERNAME
USER_UID="$(id -u)"
USER_GID="$(id -g)"
export USER_UID
Expand All @@ -291,6 +320,45 @@ if [[ -f "$DOCKER_GLOBAL_ENV_FILE" ]]; then
set +a
fi

# project env file
ENV_ARGS=""
if [[ -f "$ENV_FILE" ]]; then
ENV_ARGS="--env-file ${ENV_FILE}"
log_task "Loading environment variables for the services from ${ENV_FILE}"
fi
# shellcheck disable=SC1091
DOCKER_VERSION_FILE="${DOCKERFILES_DIR}/docker.version"
if [[ -f "$DOCKER_VERSION_FILE" ]]; then
log_task "Loading Docker version from ${DOCKER_VERSION_FILE}"
set -a
# shellcheck disable=SC1090
c source "$DOCKER_VERSION_FILE"
set +a
fi
PROJECT_ID_ENV_FILE="${DOCKERFILES_DIR}/.ids/${DOCKER_PROJECT_ID}.env"
if [ -e "${PROJECT_ID_ENV_FILE}" ]; then
echo "Loading project ID specific environment variables from ${PROJECT_ID_ENV_FILE}"
set -a
# shellcheck disable=SC1091,SC1090
c source "${PROJECT_ID_ENV_FILE}"
set +a
fi
COMMON_ENV_FILE="${DOCKERFILES_DIR}/docker.common.env"
if [ -e "${COMMON_ENV_FILE}" ]; then
echo "Loading common environment variables from ${COMMON_ENV_FILE}"
set -a
# shellcheck disable=SC1091
c source "${COMMON_ENV_FILE}"
set +a
fi
# VARIANT_ENV_FILE="${DOCKERFILES_DIR}/docker.${IMAGE_VARIANT}.env"
# if [ -e "${VARIANT_ENV_FILE}" ]; then
# echo "Loading environment variables from ${VARIANT_ENV_FILE}"
# set -a
# # shellcheck disable=SC1091,SC1090
# c source "${VARIANT_ENV_FILE}"
# set +a
# fi
# shell env file
if [ -z "$SHELL_ENV_FILE" ]; then
if [[ -n "$IMAGE_VARIANT" ]]; then
Expand Down Expand Up @@ -327,12 +395,6 @@ if [[ -f "$SECRET_ENV_FILE" ]]; then
set +a
fi

# project env file
ENV_ARGS=""
if [[ -f "$ENV_FILE" ]]; then
ENV_ARGS="--env-file ${ENV_FILE}"
log_task "Loading environment variables for the services from ${ENV_FILE}"
fi

# if network does not exist, create it
if [[ -n "$CONTAINER_NETWORK_NAME" ]]; then
Expand All @@ -347,12 +409,34 @@ else
log_info "CONTAINER_NETWORK_NAME not set, skipping creation of docker network."
fi

# prepare local workspace to be mounted
echo "Preparing local workspace directories"
[ ! -d "${HOST_WORKSPACE_ROOT}" ] && mkdir -p "${HOST_WORKSPACE_ROOT}"
[ ! -d "${HOST_SCRIPTS_DIR}" ] && cp -r "${DOCKERFILES_DIR}/scripts" "${HOST_SCRIPTS_DIR}"
[ ! -d "${HOST_SSH_DIR}" ] && mkdir -p "${HOST_SSH_DIR}"
[ ! -d "${HOST_CACHE_DIR}" ] && mkdir -p "${HOST_CACHE_DIR}"
[ ! -d "${HOST_HF_HOME}" ] && mkdir -p "${HOST_HF_HOME}"
[ ! -d "${HOST_GH_CONFIG_DIR}" ] && mkdir -p "${HOST_GH_CONFIG_DIR}"
[ ! -d "${HOST_PASSAGE_DIR}" ] && mkdir -p "${HOST_PASSAGE_DIR}"

if docker --version &>/dev/null; then
if [ "${COMMAND}" == "push" ]; then
CMD="docker push ${CONTAINER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
elif [ "${COMMAND}" == "login" ]; then
echo "GITHUB_CR_PAT: $GITHUB_CR_PAT"
CMD="docker login ghcr.io -u $GITHUB_USERNAME"
fi
fi
if docker-compose version &>/dev/null; then
log_task "docker compose ${COMMAND} for [${DOCKER_PROJECT_NAME}] with variant [${IMAGE_VARIANT}] and version [${IMAGE_VERSION}] from [${PROJECT_DIR}]"

# change to the directory of the build context
c cd "${PROJECT_DIR}" || exit 1
CMD="docker-compose --project-directory ${PROJECT_DIR} -f ${COMPOSE_FILE} ${ENV_ARGS} ${COMMAND} ${ADDITIONAL_ARGS}"
if [ "${COMMAND}" == "run" ]; then
CMD="docker-compose --project-directory ${PROJECT_DIR} -f ${COMPOSE_FILE} ${ENV_ARGS} ${COMMAND} ${SERVICE_NAME} ${ADDITIONAL_ARGS}"
else
CMD="docker-compose --project-directory ${PROJECT_DIR} -f ${COMPOSE_FILE} ${ENV_ARGS} ${COMMAND} ${ADDITIONAL_ARGS}"
fi
c eval "$CMD" || exit 1

if [[ "$PUSH" == "true" ]]; then
Expand Down
11 changes: 11 additions & 0 deletions chezmoi/dot_local/bin/executable_dotfiles-initialize-zsh.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@ log_task "Initializing ZSH"

zsh_path="/bin/zsh"

# if zsh is not installed, install it
if ! command -v zsh &>/dev/null; then
# {{ if .system.is_sudoer }}
log_task "Installing ZSH"
c sudo apt-get install -y zsh
# {{ else }}
log_error "ZSH is not installed and the user is not a sudoer. Unable to install ZSH and change the default shell."
exit 0
# {{ end }}
fi

if ! getent passwd '{{ .chezmoi.username }}' | cut -d : -f 7- | grep -q "^${zsh_path}$"; then
log_task "Configuring ZSH as default shell"

Expand Down
Loading

0 comments on commit 5d1d1b7

Please sign in to comment.