# Docker Development Setup ## Cloning the project git clone git@github.com:SFDO-Tooling/MetaDeploy cd MetaDeploy ## Docker and Docker-Compose Installation To download and install Docker Desktop please visit: and follow the installation instructions to download Docker if needed. To verify you have successfully installed Docker, run: docker -v _You should see something like the following:_ : `Docker version 20.10.14, build a224086` The latest version of Docker Desktop comes with docker-compose installed. To verify you have successfully installed docker-compose, run: docker-compose -v _You should see something like the following:_ Docker Compose version v2.5.1 If docker-compose is not installed, visit and follow the installation instructions to download docker-compose. ### Running MetaDeploy In Docker Below are the following steps necessary to run MetaDeploy on Docker: 1. [.env File Creation and Variable Declaration](#env-file-creation-and-variable-declaration) 2. [Building Your Docker Containers](#building-your-docker-containers) 3. [Running Your Docker Containers](#running-your-docker-containers) ## .env File Creation And Variable Declaration Please begin by making a copy of `env.example` and renaming it `.env` in your root project directory: cp env.example .env Edit this file to change `DJANGO_SECRET_KEY` and `DJANGO_HASHID_SALT` to any two different arbitrary string values. Next, run the following commands to generate a database encryption key: pip install cryptography python >>> from cryptography.fernet import Fernet >>> Fernet.generate_key() This will output a bytestring, e.g. `b'mystring='`. Copy only the contents of `'...'`, and add it to your `.env` file as `DB_ENCRYPTION_KEY`, e.g. `DB_ENCRYPTION_KEY="mystring="`. To exit the Python shell, press `Ctrl-Z` and then `Enter` on Windows, or `Ctrl-D` on OS X or Linux. Alternatively, you could also type the Python command `exit()` and press `Enter`. > **Note** > MetaDeploy needs a connection to the GitHub API to fetch repositories for installation. This can be set up using a personal GitHub account by providing your personal access token as `GITHUB_TOKEN` _or_ by using a GitHub App and setting `GITHUB_APP_ID` and `DOCKER_GITHUB_APP_KEY` (with newlines encoded as `\n` for Docker). > > To use a Personal Access Token (which requires a scope of `repo::public_repo`), see: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token **SFDX_CLIENT_CALLBACK_URL** Callback url of the connected Salesforce app. The variable has already been set to the proper value for projects running under localhost. **SFDX_CLIENT_ID** Consumer key of the connected app that MetaDeploy will use for authenticating to any persistent org. **SFDX_CLIENT_SECRET** Consumer secret of the connected app. **DEVHUB_USERNAME** The username associated with your Dev Hub. If you have the Salesforce CLI setup it should be the username with the `(D)` next to it when running `sfdx force:org:list`. **DOCKER_SFDX_HUB_KEY** This represents the private key (with newlines encoded as `\n` for Docker) corresponding to a certificate that was uploaded to the "Use digital signatures" setting of the Salesforce connected app. Ensure a newline char (`\n`) comes after `-----END PRIVATE KEY-----`. Only required if you enable scratch orgs for a plan. ## Building Your Docker Containers > **Note** > VS Code users: refer to [Docker development using VS Code](#docker-development-using-vs-code). This next section assumes you have installed `docker` and `docker-compose`. Additionally it assumes you have a `.env` file in the root directory of this project, a template of variables needed can be found in `env.example`. To configure and run your environment you must run two commands in the project root. Note that `docker-compose build` will take some significant time to build the first time but will be much faster for subsequent builds. It is also important to note that once you bring up the web application it will take a minute or two to build. docker-compose build ## Running Your Docker Containers MetaDeploy's docker container comes out of the box with development test data and the creation of a default admin user. If you would like to disable this functionality please add a `DJANGO_SETTINGS_MODULE` environment variable in the web service section of the docker-compose file to set it from its default value (set in Dockerfile) from `config.settings.local` to `config.settings.production`. For examples of how to do this please see [setting docker-compose environment variables](https://docs.docker.com/compose/environment-variables/). Then run the following command: docker-compose up -d or docker-compose up (for debug mode) This command may take a few minutes to finish. Once it's done, visit `localhost:8000/admin/login` and login with the following credentials if `DJANGO_SETTINGS_MODULE` is `config.settings.local`: **username** `admin` **password** `password` From here you should be able to run builds. However note that this default account will not be created when `BUILD_ENV` is set to `production`. ## Docker Commands To stop your virtual containers run the following command (the docker-compose stop command will stop your containers, but it won't remove them): docker-compose stop To start your virtual containers run the following command: docker-compose start To bring your virtual containers up for the first time run the following command: docker-compose up -d To bring your virtual containers down run the following command: > **Note** > The docker-compose down command will stop your containers, but also removes the stopped containers as well as any networks that were created. docker-compose down Removes stopped service containers. To remove your stopped containers enter the following commands > **Warning** > This will destroy anything that is in the virtual environment, however the database data will persist docker-compose rm (then enter `y` when prompted. If you would like to clear the database as well include a -v flag i.e. `docker-compose down -v`) To view all running services run the following command: docker-compose ps If you'd like to test something out manually in that test environment for any reason you can run the following: In order to run relevant management commands like `manage.py makemigrations`, or if you'd like to test something out manually in that test environment for any reason you can run the following: docker-compose exec web bash After this you will be inside of a linux commandline, and are free to test around in your container. Or you could directly run a command like this: docker-compose exec web python manage.py makemigrations ## Docker development using VS Code Because front-end and back-end dependencies are installed in a Docker container instead of locally, text editors that rely on locally-installed packages (e.g. for code formatting/linting on save) need access to the running Docker container. [VS Code](https://code.visualstudio.com/) supports this using the [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) extension pack. Once you have the extension pack installed, when you open the MetaDeploy folder in VS Code, you will be prompted to "Reopen in Container". Doing so will effectively run `docker-compose up` and reload your window, now running inside the Docker container. If you do not see the prompt, run the "Remote-Containers: Open Folder in Container\..." command from the VS Code Command Palette to start the Docker container. A number of project-specific VS Code extensions will be automatically installed for you within the Docker container. See `.devcontainer/devcontainer.json` and `.devcontainer/docker-compose.dev.yml` for Docker-specific VS Code settings. The first build will take a number of minutes, but subsequent builds will be significantly faster. Similarly to the behavior of `docker-compose up`, VS Code automatically runs database migrations and starts the development server/watcher. To run any local commands, open an [integrated terminal](https://code.visualstudio.com/docs/editor/integrated-terminal) in VS Code (`Ctrl-`\`) and use any of the development commands (this terminal runs inside the Docker container and can run all the commands that can be run in RUNNING.RST and CONTRIBUTING.RST): $ python manage.py migrate # run database migrations $ yarn serve # start the development server/watcher For any commands, when using the VS Code integrated terminal inside the Docker container, omit any `docker-compose run --rm web...` prefix, e.g.: $ python manage.py promote_superuser $ yarn test:js $ python manage.py truncate_data $ python manage.py populate_data `yarn serve` is run for you on connection to container. You can view the running app at in your browser. For more detailed instructions and options, see the [VS Code documentation](https://code.visualstudio.com/docs/remote/containers).