PROJECTS_DIRECTORY="all-my-web-ides" \
WORKSPACE_NAME="demo-python-ide" \
KEY_NAME="github_perso" \
GIT_USER_EMAIL="[email protected]" \
GIT_USER_NAME="@bob" \
GIT_HOST="github.com" \
SOURCE_CODE_PROJECT_NAME="hello-world" \
./initialize-workspace.sh
Created
August 18, 2025 15:08
-
-
Save k33g/49244e2264fda3f47832e6e1416fedce to your computer and use it in GitHub Desktop.
Creating a Web IDE for a Python Project with Docker and Docker Compose
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
services: | |
web-ide: | |
build: | |
context: . | |
dockerfile: Dockerfile | |
ports: | |
- 3000:3000 | |
volumes: | |
- ./workspace:/home/workspace:cached | |
- ./keys:/home/openvscode-server/.ssh | |
- type: bind | |
source: /var/run/docker.sock | |
target: /var/run/docker.sock | |
init: true | |
restart: unless-stopped |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FROM --platform=$BUILDPLATFORM gitpod/openvscode-server:latest | |
LABEL maintainer="@k33g_org" | |
ARG TARGETOS | |
ARG TARGETARCH | |
ARG USER_NAME=openvscode-server | |
USER root | |
# ------------------------------------ | |
# Install Tools | |
# ------------------------------------ | |
RUN <<EOF | |
apt-get update | |
apt-get install -y openssh-client curl wget git fonts-powerline | |
EOF | |
# ------------------------------------ | |
# Install Python | |
# ------------------------------------ | |
RUN <<EOF | |
apt-get update | |
apt-get install -y software-properties-common | |
add-apt-repository -y ppa:deadsnakes/ppa | |
apt-get update | |
apt-get install -y python3.9 python3.9-distutils python3.9-dev python3.9-venv | |
curl -sS https://bootstrap.pypa.io/get-pip.py | python3.9 | |
# Create symlinks | |
ln -sf /usr/bin/python3.9 /usr/bin/python3 | |
ln -sf /usr/bin/python3.9 /usr/bin/python | |
ln -sf /usr/local/bin/pip3.9 /usr/local/bin/pip3 | |
ln -sf /usr/local/bin/pip3.9 /usr/local/bin/pip | |
EOF | |
# ------------------------------------ | |
# Install Docker | |
# ------------------------------------ | |
RUN <<EOF | |
# Add Docker's official GPG key: | |
apt-get update | |
apt-get install -y ca-certificates curl gnupg | |
install -m 0755 -d /etc/apt/keyrings | |
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg | |
chmod a+r /etc/apt/keyrings/docker.gpg | |
# Add the repository to Apt sources: | |
echo \ | |
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ | |
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ | |
tee /etc/apt/sources.list.d/docker.list > /dev/null | |
apt-get update | |
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin | |
EOF | |
RUN <<EOF | |
groupadd docker | |
usermod -aG docker ${USER_NAME} | |
newgrp docker | |
EOF | |
RUN adduser ${USER_NAME} docker | |
# Switch to the specified user | |
USER ${USER_NAME} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
: <<'COMMENT' | |
This script will create a workspace directory, | |
set up the necessary environment variables, and configure Git. | |
COMMENT | |
# -------------------------------------- | |
# Initialize workspace | |
# -------------------------------------- | |
mkdir -p ${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace | |
cat > "${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.bashrc" << 'EOF' | |
sudo chmod 666 /var/run/docker.sock | |
parse_git_branch() { | |
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/' | |
} | |
# Prompt avec couleurs | |
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ ' | |
EOF | |
echo "β Workspace initialized with .bashrc" | |
# -------------------------------------- | |
# Generate project.env | |
# -------------------------------------- | |
echo "SSH_PUBLIC_KEY=\"$(cat $HOME/.ssh/${KEY_NAME}.pub)\"" > project.env | |
echo "SSH_PRIVATE_KEY=\"$(cat $HOME/.ssh/${KEY_NAME} | base64 -w 0)\"" >> project.env | |
echo "GIT_USER_EMAIL=${GIT_USER_EMAIL}" >> project.env | |
echo "GIT_USER_NAME=${GIT_USER_NAME}" >> project.env | |
echo "GIT_HOST=${GIT_HOST}" >> project.env | |
echo "β project.env file created" | |
# -------------------------------------- | |
# Git configuration | |
# -------------------------------------- | |
# Check if project.env exists | |
if [ ! -f "project.env" ]; then | |
echo "β Error: project.env file not found" | |
exit 1 | |
fi | |
source project.env | |
# Create keys directory if it doesn't exist | |
mkdir -p ${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys | |
USER_NAME=openvscode-server | |
PRIVATE_KEY_NAME=git_repository_key | |
PUBLIC_KEY_NAME=git_repository_key.pub | |
echo "π Initializing the environment..." | |
echo "π€ Configuring Git $USER_NAME" | |
if [ -f "./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.ssh/config" ]; then | |
echo "π Git configuration already exists" | |
else | |
echo "π¦ Configuring git user" | |
echo "[user]" > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo " email = ${GIT_USER_EMAIL}" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo " name = ${GIT_USER_NAME}" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo "[safe]" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
#TODO: how to add the projects | |
#echo " directory = ./workspace/${PROJECT_NAME}" >> ./workspace/.gitconfig | |
echo "[http]" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo " postBuffer = 524288000" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo " lowSpeedLimit = 1000" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo " lowSpeedTime = 300" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo "[init]" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo " defaultBranch = main" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
chmod 644 ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/.gitconfig | |
echo "π€ Configuring Git" | |
# ./workspace/keys maps on ./workspace/.ssh | |
echo "Host $GIT_HOST" > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config | |
echo " HostName $GIT_HOST" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config | |
echo " User git" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config | |
echo " IdentityFile ~/.ssh/$PRIVATE_KEY_NAME" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config | |
echo " StrictHostKeyChecking no" >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config | |
chmod 600 ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/config | |
# [[ ! -z $SSH_PUBLIC_KEY ]] && | |
echo $SSH_PUBLIC_KEY > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/$PUBLIC_KEY_NAME | |
# [[ ! -z $SSH_PRIVATE_KEY ]] && | |
echo $SSH_PRIVATE_KEY | base64 -d > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/$PRIVATE_KEY_NAME | |
chmod 600 ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/keys/$PRIVATE_KEY_NAME | |
fi | |
# -------------------------------------- | |
# Create a demo project | |
# -------------------------------------- | |
mkdir -p ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/${SOURCE_CODE_PROJECT_NAME} | |
# create a README file | |
echo "# ${SOURCE_CODE_PROJECT_NAME}" > ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/${SOURCE_CODE_PROJECT_NAME}/README.md | |
echo "This is a demo project for the web IDE." >> ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/workspace/${SOURCE_CODE_PROJECT_NAME}/README.md | |
# -------------------------------------- | |
# Copy Dockerfile and Compose file | |
# -------------------------------------- | |
cp -f ./Dockerfile ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/Dockerfile | |
cp -f ./compose.yml ./${PROJECTS_DIRECTORY}/${WORKSPACE_NAME}/compose.yml | |
echo "β Dockerfile and compose files copied to workspace project" | |
# -------------------------------------- | |
# Remove the project.env file | |
# -------------------------------------- | |
rm -f project.env | |
echo "β project.env file removed" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment