summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/university/gitlab-advanced/elasticsearch.md203
1 files changed, 203 insertions, 0 deletions
diff --git a/doc/university/gitlab-advanced/elasticsearch.md b/doc/university/gitlab-advanced/elasticsearch.md
new file mode 100644
index 00000000000..ee846fbaba6
--- /dev/null
+++ b/doc/university/gitlab-advanced/elasticsearch.md
@@ -0,0 +1,203 @@
+# Elasticsearch
+
+This document covers additional configuration options to integrate Elasticsearch
+with GitLab.
+
+More detailed information of what this feature is and it's options is available
+at the [Elasticsearch Integration](https://docs.gitlab.com/ee/integration/elasticsearch.html#elasticsearch-integration)
+doc.
+
+***
+
+## Elasticsearch Docker Container
+
+For this setup we want to have GitLab as a container and Elasticsearch as another
+container both communicating through a Docker bridge network. This example is
+running on an EC2 instance so we'll be seeing some specific AWS values as part
+of the code blocks but also notice that this setup does require at least 8GB of
+RAM.
+
+Update the host machine:
+
+```
+sudo apt-get update
+```
+
+Install and test Docker
+
+```
+wget -qO- https://get.docker.com/ | sh
+sudo docker run hello-world
+```
+Now we can create the network where `gitlab` stands for the network name.
+
+```
+ sudo docker network create gitlab
+```
+
+Get GitLab's Docker image and start a container. In this code block we are using
+ the public DNS as both the hostname and the `external_url` value which means it
+ will be accessible through this value in your browser.
+
+The publish options are exposing the ports but notice that I'm changing the SSH
+ port as it collides with the host's SSH. We can also change the volumes where
+ we want our configuration, data and home directory to be stored.
+
+An important option to note is `--detach` which will run the container in the
+background and configure GitLab when it first starts up. I like having a session
+open for logs so I usually change that for `-it` to view the output of the
+ configuration.
+
+```
+sudo docker run --detach \
+ --hostname ec2-52-15-116-57.us-east-2.compute.amazonaws.com \
+ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://ec2-52-15-116-57.us-east-2.compute.amazonaws.com';" \
+ --publish 443:443 \
+ --publish 80:80 \
+ --publish 2289:22 \
+ --name gitlab \
+ --restart always \
+ --volume /srv/gitlab/config:/etc/gitlab \
+ --volume /srv/gitlab/logs:/var/log/gitlab \
+ --volume /srv/gitlab/data:/var/opt/gitlab \
+ --network gitlab \
+ gitlab/gitlab-ee:latest
+```
+
+Let's turn to Elasticsearch now. For GItLab preior to version 9.0 we need
+Elasticsearch version 2.4 and from 9.0 upwards we need version 5.1. Also notice
+that version 2.4 requires manually installing the `delete-by-query` plugin.
+
+Download the Elasticsearch image and start a container. We're also connecting it
+to our `gitlab` network. If installing a different version you should change the
+number at the end of the command.
+
+```
+sudo docker run -d --name elasticsearch --network gitlab elasticsearch:5.1
+```
+
+If you went with the 2.4 version you can login in to the container and install
+the plugin with:
+
+```
+sudo docker exec -it elasticsearch /bin/bash
+bin/plugin install delete-by-query
+exit
+```
+
+You can now confirm the Elasticsearch is reachable by loging into the `gitlab`
+container and trying to access it.
+
+```
+sudo docker exec -it gitlab /bin/bash
+curl http://elasticsearch.gitlab:9200
+exit
+```
+
+From the admin UI you'll need to activate Elasticsearch by going to the Settings
+screen which you'll find under the gear icon's drop down menu.
+
+Closer to the bottom there is an Elasticsearch section with two checkboxes that
+you'll need to click on: `Elasticsearch indexing` and
+`Search with Elasticsearch enabled`. Finally add the url we tested through the
+container `http://elasticsearch.gitlab:9200`. Don't forget to save the changes.
+
+The final part of this configuration is to create the indexes on the `gitlab`
+ container. We'll just index everything but if you have a larger instance please
+ go through the indexing procedure from the docs.
+
+```
+sudo docker exec -it gitlab /bin/bash
+gitlab-rake gitlab:elastic:create_empty_index
+gitlab-rake gitlab:elastic:index_repositories
+exit
+```
+
+Done! Go into your instance and try searching for a code pattern. You will now
+see the code and merge request categories.
+
+If you would like to version control your Docker images make sure to commit the
+ changes.
+
+```
+docker commit <container-id> <username>/<image-name>:<version>
+```
+
+***
+
+## AWS Elasticsearch Service
+
+This setup uses the AWS Elasticsearch cluster service. This is not a best
+practice guide, it's more of a getting started or proof of concept so please
+make sure to review the final setup and change it to meet your team's
+requirements.
+
+The first step here is dealing with the Access Policy. I have created an IAM user
+ and attached a policy to it. You can also use your own user to test this out.
+
+At the IAM screen choose Policies -> Create Policy -> Create your own policy.
+I'll leave this one open but make sure to scope it better afterwords.
+
+```
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Action": [
+ "es:*"
+ ],
+ "Effect": "Allow",
+ "Resource": "*"
+ }
+ ]
+}
+```
+
+After saving this you can choose Users on the left panel and select the one that
+we'll be using for this. Click on Add Permissions and then Attach existing
+policies directly. Look for the recently saved policy and select it.
+
+Before moving out of the IAM screen we'll need to get a few more details. Look
+ for the user again and copy the `User ARN` from it's profile screen. Now click
+ on the security credentials tab and press the Create access key button. Make
+ sure to copy the Access and Secret access key. We'll be using this info in
+ shortly.
+
+Now we can start creating an Elasticsearch cluster. Navigate to the
+Elasticsearch service. The name is unimportant just make sure to choose the 5.1
+Elasticsearch version. I would also suggest at least a medium sized instance for
+the cluster node type. Now for the policy choose from the dropdown menu the
+ `Allow or deny access to one or more AWS accounts or IAM users`. On the pop up
+ screen choose to allow and paste the User's ARN in the text field. now save and
+ confirm.
+
+It takes a while but when the cluster is finally ready make sure to copy the
+Endpoint value.
+
+Now let's go back to our GitLab UI. From the admin UI you'll need to activate
+Elasticsearch by going to the Settings screen which you'll find under the gear
+icon's drop down menu.
+
+Closer to the bottom there is an Elasticsearch section with two checkboxes that
+you'll need to click on: `Elasticsearch indexing` and
+`Search with Elasticsearch enabled`. For the url paste the Endpoint value from
+the cluster we created but be sure to prepend `https://`. Now on the section
+below we need to add specific AWS values. First check the
+`Using AWS hosted Elasticsearch with IAM credentials` checkbox. For the region
+you can find that as part of the Endpoint's url or just find it in the AWS web
+console. Now the `AWS Access Key` and `AWS Secret Access Key` are the two values
+we copied from the IAM user profile under the security credentials tab.
+Don't forget to save the changes.
+
+The final part of this configuration is to create the indexes on the `gitlab`
+instance. We'll just index everything but if you have a larger instance please
+ go through the indexing procedure from the docs. SSH into the GitLab instance
+server and run the following commands:
+
+```
+sudo gitlab-rake gitlab:elastic:create_empty_index
+sudo gitlab-rake gitlab:elastic:index_repositories
+```
+
+Done! Go into your instance and try searching for a code pattern. You will now
+see the code and merge request categories. \ No newline at end of file