diff --git a/.dockerignore b/.dockerignore
index 2086dcb4d0a437bec9b6d85dae32037f758e0f0c..4c2d65fd36330334d8922c862f46393aac7db945 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,4 +1,4 @@
 README.md
 CHANGELOG.md
 docker-compose.yml
-Dockerfile
+Dockerfile
\ No newline at end of file
diff --git a/.env.example b/.env.example
index 155d08ba3ce80129bd2cc7958044701bd2e13c6f..99ebfcd82502671c9c9cd37fac01219ad5564bf4 100644
--- a/.env.example
+++ b/.env.example
@@ -1,6 +1,7 @@
 APP_ENV=local
 APP_DEBUG=true
 APP_LOG_LEVEL=debug
+LOG_CHANNEL=stderr
 APP_KEY=
 APP_URL=http://localhost
 
@@ -21,7 +22,8 @@ CACHE_DRIVER=redis
 SESSION_DRIVER=file
 QUEUE_CONNECTION=sync
 
-REDIS_HOST=127.0.0.1
+REDIS_CACHE_HOST=redis
+REDIS_HOST=redis
 REDIS_PASSWORD=null
 REDIS_PORT=6379
 
diff --git a/Dockerfile b/Dockerfile
index 23f7fcf7c5e6b3d2d4b157bc4324506aaed35c12..09d993697a9a602f786534ac617d39b9cece8f41 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM alpine:latest
+FROM alpine:3.11.3
 
 RUN apk add --update \
     nginx \
@@ -29,7 +29,11 @@ RUN apk add --update \
 
 WORKDIR /html
 
-RUN sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stdout/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/;daemonize = yes/daemonize = no/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/listen = 127.0.0.1:9000/listen = 9000/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;catch_workers_output = yes/catch_workers_output = yes/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/group = nobody/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/pm.max_children = 5/pm.max_children = 100/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/pm.start_servers = 2/pm.start_servers = 5/g' /etc/php7/php-fpm.d/www.conf && \
@@ -56,6 +60,7 @@ RUN sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
 
 COPY config/nginx.conf /etc/nginx/nginx.conf
 COPY config/nginx-default.conf /etc/nginx/conf.d/default.conf
+RUN sed -i 's/fastcgi_pass phpfpm:9000;/fastcgi_pass localhost:9000;/g' /etc/nginx/conf.d/default.conf 
 COPY --chown=root:nginx . /html
 
 WORKDIR /html
@@ -64,7 +69,4 @@ EXPOSE 80
 CMD chown -R root:nginx storage/logs/metager bootstrap/cache && \
     chmod -R g+w storage/logs/metager bootstrap/cache && \
     crond -L /dev/stdout && \
-    nginx && \
-    php-fpm7 -D && \
-    redis-server /etc/redis.conf && \
-    su -s /bin/sh -c 'php artisan requests:fetcher' nginx
+    php-fpm7
diff --git a/Dockerfile.dev b/DockerfileDev
similarity index 59%
rename from Dockerfile.dev
rename to DockerfileDev
index d195e6bf5cd1a08dd2adb5be276069c37ddc7ffe..18748bf88d48fbf1832b27c6de4e80b33f9d16bb 100644
--- a/Dockerfile.dev
+++ b/DockerfileDev
@@ -1,4 +1,4 @@
-FROM alpine:latest
+FROM alpine:3.11.3
 
 RUN apk add --update \
     nginx \
@@ -23,12 +23,17 @@ RUN apk add --update \
     php7-gd \
     php7-json \
     php7-pcntl \
+    php7-opcache \
     php7-fileinfo \
     && rm -rf /var/cache/apk/*
 
 WORKDIR /html
 
-RUN sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
+RUN sed -i 's/;error_log = log\/php7\/error.log/error_log = \/dev\/stdout/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/;daemonize = yes/daemonize = no/g' /etc/php7/php-fpm.conf && \
+    sed -i 's/listen = 127.0.0.1:9000/listen = 9000/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/;catch_workers_output = yes/catch_workers_output = yes/g' /etc/php7/php-fpm.d/www.conf && \
+    sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/group = nobody/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/pm.max_children = 5/pm.max_children = 100/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/pm.start_servers = 2/pm.start_servers = 5/g' /etc/php7/php-fpm.d/www.conf && \
@@ -38,6 +43,14 @@ RUN sed -i 's/user = nobody/user = nginx/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/group = www-data/group = nginx/g' /etc/php7/php-fpm.d/www.conf && \
     sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php7/php.ini && \
     sed -i 's/expose_php = On/expose_php = Off/g' /etc/php7/php.ini && \
+    # Opcache configuration
+    sed -i 's/;opcache.enable=1/opcache.enable=1/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.memory_consumption=128/opcache.memory_consumption=128/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.interned_strings_buffer=8/opcache.interned_strings_buffer=8/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.max_accelerated_files=10000/opcache.max_accelerated_files=10000/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.max_wasted_percentage=5/opcache.max_wasted_percentage=5/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.validate_timestamps=1/opcache.validate_timestamps=1/g' /etc/php7/php.ini && \
+    sed -i 's/;opcache.revalidate_freq=2/opcache.revalidate_freq=300/g' /etc/php7/php.ini && \
     echo "daemonize yes" >> /etc/redis.conf && \
     ln -s /dev/null /var/log/nginx/access.log && \
     ln -s /dev/stdout /var/log/nginx/error.log && \
@@ -51,7 +64,4 @@ EXPOSE 80
 CMD chown -R root:nginx storage/logs/metager bootstrap/cache && \
     chmod -R g+w storage/logs/metager bootstrap/cache && \
     crond -L /dev/stdout && \
-    nginx && \
-    php-fpm7 -D && \
-    redis-server /etc/redis.conf && \
-    su -s /bin/sh -c 'php artisan requests:fetcher' nginx
+    php-fpm7
diff --git a/DockerfileDev.ignore b/DockerfileDev.ignore
new file mode 100644
index 0000000000000000000000000000000000000000..d6b954efbf510e511a85c7b357dddbcd530b9801
--- /dev/null
+++ b/DockerfileDev.ignore
@@ -0,0 +1,5 @@
+README.md
+CHANGELOG.md
+vendor/*
+node_modules/*
+storage/logs/*
\ No newline at end of file
diff --git a/app/Console/Commands/RequestFetcher.php b/app/Console/Commands/RequestFetcher.php
index f932b92b0339f5ec9d85d6e24ddfacd23af53372..f6305c3916520f79d6f852caba73e9656a58d6c0 100644
--- a/app/Console/Commands/RequestFetcher.php
+++ b/app/Console/Commands/RequestFetcher.php
@@ -50,10 +50,17 @@ class RequestFetcher extends Command
      */
     public function handle()
     {
+        $pidFile = "/tmp/fetcher";
         pcntl_signal(SIGINT, [$this, "sig_handler"]);
         pcntl_signal(SIGTERM, [$this, "sig_handler"]);
         pcntl_signal(SIGHUP, [$this, "sig_handler"]);
 
+        touch($pidFile);
+
+        if (!file_exists($pidFile)) {
+            return;
+        }
+
         try {
             $blocking = false;
             $redis = Redis::connection("cache");
@@ -108,9 +115,8 @@ class RequestFetcher extends Command
                     usleep(50 * 1000);
                 }
             }
-        } catch (\Exception $e) {
-            Log::error($e->getMessage());
         } finally {
+            unlink($pidFile);
             curl_multi_close($this->multicurl);
         }
     }
diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml
index e619fd5a112375ee9aac7e21700acb2f1e2c2a60..977aee9cdf9f312e550c5dddb16818d063168aff 100644
--- a/chart/templates/deployment.yaml
+++ b/chart/templates/deployment.yaml
@@ -39,7 +39,8 @@ spec:
         persistentVolumeClaim:
           claimName: mglogs
       containers:
-      - name: {{ .Chart.Name }}
+      # Main PHP-FPM Container
+      - name: {{ .Chart.Name }}-phpfpm
         image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
         imagePullPolicy: {{ .Values.image.pullPolicy }}
         {{- if .Values.application.secretName }}
@@ -48,23 +49,42 @@ spec:
             name: {{ .Values.application.secretName }}
         {{- end }}
         env:
-{{- if .Values.postgresql.managed }}
-        - name: POSTGRES_USER
-          valueFrom:
-            secretKeyRef:
-              name: app-postgres
-              key: username
-        - name: POSTGRES_PASSWORD
-          valueFrom:
-            secretKeyRef:
-              name: app-postgres
-              key: password
-        - name: POSTGRES_HOST
-          valueFrom:
-            secretKeyRef:
-              name: app-postgres
-              key: privateIP
-{{- end }}
+        - name: DATABASE_URL
+          value: {{ .Values.application.database_url | quote }}
+        - name: GITLAB_ENVIRONMENT_NAME
+          value: {{ .Values.gitlab.envName }}
+        - name: GITLAB_ENVIRONMENT_URL
+          value: {{ .Values.gitlab.envURL }}
+        ports:
+        - name: "{{ .Values.service.name }}-phpfpm"
+          containerPort: 9000
+        livenessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-phpfpm"
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-phpfpm"
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+        volumeMounts:
+        - name: mglogs-persistent-storage
+          mountPath: /html/storage/logs/metager
+          readOnly: false
+        resources:
+{{ toYaml .Values.resources | indent 12 }}
+      # Nginx Container
+      - name: {{ .Chart.Name }}-nginx
+        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+        command: ["nginx"]
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        {{- if .Values.application.secretName }}
+        envFrom:
+        - secretRef:
+            name: {{ .Values.application.secretName }}
+        {{- end }}
+        env:
         - name: DATABASE_URL
           value: {{ .Values.application.database_url | quote }}
         - name: GITLAB_ENVIRONMENT_NAME
@@ -98,10 +118,41 @@ spec:
 {{- end }}
           initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
           timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
-        volumeMounts:
-        - name: mglogs-persistent-storage
-          mountPath: /html/storage/logs/metager
-          readOnly: false
-        resources:
-{{ toYaml .Values.resources | indent 12 }}
+      # Redis Container
+      - name: {{ .Chart.Name }}-redis
+        image: "redis:6.0-rc1-alpine"
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        ports:
+        - name: "{{ .Values.service.name }}-redis"
+          containerPort: 6379
+        livenessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-redis"
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          tcpSocket:
+            port: "{{ .Values.service.name }}-redis"
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
+      # Fetcher Container
+      - name: {{ .Chart.Name }}-fetcher
+        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+        command: ["su"]
+        args: ["-s", "/bin/sh", "-c", "php artisan requests:fetcher", "nginx"]
+        imagePullPolicy: {{ .Values.image.pullPolicy }}
+        livenessProbe:
+          exec:
+            command:
+            - cat
+            - /tmp/fetcher
+          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
+        readinessProbe:
+          exec:
+            command:
+            - cat
+            - /tmp/fetcher
+          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
+          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
 {{- end -}}
diff --git a/config/nginx-default.conf b/config/nginx-default.conf
index c61d290a95ede5b12f8c539e18689a46a795aab2..e418b8d6d53316d2b680e762ed1024f03b58ff14 100644
--- a/config/nginx-default.conf
+++ b/config/nginx-default.conf
@@ -14,7 +14,7 @@ server {
     location ~ \.php$ {
         try_files $uri /index.php =404;
         fastcgi_split_path_info ^(.+\.php)(/.+)$;
-        fastcgi_pass 127.0.0.1:9000;
+        fastcgi_pass phpfpm:9000;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         include fastcgi_params;
diff --git a/config/nginx.conf b/config/nginx.conf
index 37937533858b6ce991610d9ce3c0a1bfe6b24e15..96b512b5d167229b8eeb3fd3fc35865e455ef503 100644
--- a/config/nginx.conf
+++ b/config/nginx.conf
@@ -5,6 +5,7 @@ worker_processes  100;
 error_log  /var/log/nginx/error.log warn;
 pid        /var/run/nginx.pid;
 
+daemon off;
 
 events {
     worker_connections  1024;
diff --git a/docker-compose.yml b/docker-compose.yml
index f2e6c8b45036c7b098c66c97360aa871dd22516f..6a63508b548c0602508534101aabecd00c55ad0b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -28,20 +28,43 @@ services:
       - MYSQL_USER=metager
       - MYSQL_PASSWORD=metager
       - MYSQL_DATABASE=metager
-  web:
+  redis:
+    restart: on-failure
+    image: redis:6.0-rc1-alpine
+  phpfpm:
     depends_on:
       - "mgdb"
       - "dependencies"
       - "phpdeps"
       - "assets"
+      - "redis"
     restart: on-failure
     build:
       context: .
       dockerfile: Dockerfile.dev
+    image: metager:latest
+    working_dir: /html
+    volumes:
+      - .:/html
+  nginx:
+    depends_on:
+      - "phpfpm"
+    restart: on-failure
+    image: metager:latest
     working_dir: /html
+    command: nginx
     volumes:
       - .:/html
       - ./config/nginx.conf:/etc/nginx/nginx.conf
       - ./config/nginx-default.conf:/etc/nginx/conf.d/default.conf
     ports: 
     - "8080:80"
+  worker:
+    depends_on:
+      - "phpfpm"
+    restart: on-failure
+    image: metager:latest
+    working_dir: /html
+    volumes:
+      - .:/html
+    command: "su -s /bin/sh -c 'php artisan requests:fetcher' nginx"