diff --git a/2022-11-10-13-50-29.png b/2022-11-10-13-50-29.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d31ca123316b5f283d2772638daddc53f25dae4
Binary files /dev/null and b/2022-11-10-13-50-29.png differ
diff --git a/2022-11-10-18-10-25.png b/2022-11-10-18-10-25.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad456f0a16270a4c2bbee8e4fc96e344ed7ee8f5
Binary files /dev/null and b/2022-11-10-18-10-25.png differ
diff --git a/2022-11-10-18-15-55.png b/2022-11-10-18-15-55.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f7fe39aa6d1d6d787b37f7180003a442a07377c
Binary files /dev/null and b/2022-11-10-18-15-55.png differ
diff --git a/2022-11-10-18-21-20.png b/2022-11-10-18-21-20.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad456f0a16270a4c2bbee8e4fc96e344ed7ee8f5
Binary files /dev/null and b/2022-11-10-18-21-20.png differ
diff --git a/2022-11-10-18-30-19.png b/2022-11-10-18-30-19.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebbbf89a1c903f2a1b0ebc14165df1e9b2f50c12
Binary files /dev/null and b/2022-11-10-18-30-19.png differ
diff --git a/2022-11-10-18-31-15.png b/2022-11-10-18-31-15.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2f0dec9e6dedcb2fb5150f9cc324039350e2964
Binary files /dev/null and b/2022-11-10-18-31-15.png differ
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..3aeceaf54d5a3821a9850b36a8a011e43ea5456b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,5 @@
+FROM openjdk:17-alpine
+ARG JAR_FILE=belajarbelajar/build/libs/belajarbelajar-0.0.1-SNAPSHOT.jar
+COPY ${JAR_FILE} app.jar
+EXPOSE 9099
+ENTRYPOINT ["java","-jar","/app.jar"]
diff --git a/README.md b/README.md
index df3dba84a69ba2c1ad4fa29d2b038e088fc8c3af..7a68d7547f0d300360eaf5a8ce72363c594d788f 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,68 @@
 ## Authors
 * **Hilmi Al Biruni** - *2006463843* - *APAP-B*
 ---
+## Tutorial 8
+### Pertanyaan 1: Apa itu Dockerfile dan docker-compose.yaml? Apa fungsinya?
+
+#### Dockerfile adalah file environment agar dapat menggunakan Docker pada proyek springboot tersebut.
+#### Sedangkan docker-compose.yaml adalah alat untuk mendefinisikan dan menjalankan satu atau lebih container yang saling terkait pada sebuah command
+
+### Pertanyaan 2: Screenshot hasil perubahan anda. Setelah anda menyelesaikan tutorial ini, menurut anda, mengapa kita perlu mengganti port?
+
+![](2022-11-10-13-50-29.png)
+
+#### Perubahan port pada docker-compose.yml dilakukan agar kita bisa menggunakan cabang port dari 8080, yaitu 10127. Hal ini untuk mengurangi traffic dengan aplikasi yang menggunakan port serupa.
+
+### Pertanyaan 3: Mengapa terdapat versi dev dan prod? File apa yang menentukan konfigurasi mana yang dipakai? Apa yang harus dilakukan untuk menjalankan versi prod? (hint: baca file pada langkah 3 dengan teliti)
+
+#### application-dev.yml berfokus digunakan untuk tahap development dan productivity, sedangkan application-prod.yml berfokus digunakan untuk tahap performance dan scalability. application-prod.yml juga digunakan untuk menentukan konfigurasi yang dipakai karena didalamnya didefinisikan suatu port tertentu, yaitu 8080 untuk prod dan 2020 untuk prod2. 
+
+#### Dalam menggunakan versi prod, kita memanggilnya pada app.env di bagian *SPRING_PROFILES_ACTIVE*.  Lalu, pada docker-compose.yml akan memanggil app.env pada *env_file:*. Dari docker-compose.yml akan digunakan oleh Dockerfile sehingga application-prod.yml berhasil digunakan.
+
+### Pertanyaan 4: Apa saja yang terjadi di langkah ini?
+
+#### Saya berpindah ke directory belajarbelajar, lalu melakukan build jar agar menggunakan build versi terbaru, kemudian melakukan build image dengan *docker-compose up*. Command tersebut berfungsi untuk membangun, membuat, memulai, dan melampirkan container untuk service. Secara tidak langsung, container akan dibuat dan langsung dijalankan tanpa tambahan command lainnya
+
+### Pertanyaan 5: Sertakan screenshot container yang sedang berjalan (versi gui atau cli, pilih salah satu). Apa itu docker container, images, dan volume?
+
+![](2022-11-10-18-10-25.png)
+
+#### Docker container adalah sebuah env untuk docker image yang berisikan paket software agar dapat menjalankan aplikasi seperti kode, config, runtime, system tools, dan system libraries.
+#### Docker images adalah sebuah file yang digunakan untuk mengeksekusi kode pada docker container
+#### Docker volume adalah sebuah file untuk menyimpan data pada aplikasi dari docker container
+
+### Pertanyaan 6: Apa perbedaan docker-compose down dan stop?
+
+#### *docker-compose down* berfungsi untuk memberhentikan container sekaligus menghapus container, sehingga perlu dilakukan *docker-compose build*.
+#### *docker-compose stop* berfungsi hanya untuk memberhentikan container tanpa menghapus container.
+
+### Pertanyaan 7: Sertakan screenshot mengakses laman kirti milik anda melalui browser (seperti screenshot di atas)
+
+![](2022-11-10-18-15-55.png)
+
+### Pertanyaan 8: Ceritakan pengalaman anda melakukan deployment ke Kirti. Kendala apa yang anda alami?
+
+#### Hasil dari deployment menggunakan Kirti menurut saya cukup menyenangkan karena kita bisa melihat hasil nyata aplikasi lewat link, yaitu apap-127 dengan domain cs.ui.ac.id. Kendala yang saya alami adalah server kawung sering overload sehingga saya selalu overtime saat melakukan build dan deployment. Contoh spesifiknya adalah saat melakukan upload frontend dan backend, hanya frontend saya yang terupload di kawung, sedangkan backend tidak.
+
+### Pertanyaan 9: Buka container docker Anda, lalu screenshot. Apa perbedaan tampilan container sekarang dengan tampilan container pada langkah tutorial docker di awal tadi?
+
+*maaf, saya tidak sempat menyertakan screenshoot di awal tahap docker*
+![](2022-11-10-18-21-20.png)
+
+#### Perbedaannya adalah pada tahap awal docker, hanya terdiri dari tutorial-apap, db-1, dan web-1. Sedangkan di tahap sekarang, bertambah menjadi tutorial-apap, db-1, web2-1, web-1.
+#### Hal ini dikarenakan pada tahap ini saya membuat 2 port sehingga membutuhkan 2 container, yaitu web2-1 dan web-1.
+
+### Pertanyaan 10: Sertakan screenshot tampilan web ketika pertama kali menjalankan localhost:9090 dan tampilan web ketika halaman di-refresh.
+#### Port 8080 sebelum melakukan refresh
+![](2022-11-10-18-30-19.png)
+
+#### Port 2020 setelag melakukan refresh
+![](2022-11-10-18-31-15.png)
+
+### Pertanyaan 11: Kendala apa yang anda hadapi ketika melakukan tutorial bagian nginx?
+
+#### Kendala saya adalah ketidaktelitian saya saat melakukan configurasi pada docker-compose.yml. Selain itu, tidak ada kendala lain.
+
 ## Tutorial 7
 ### Pertanyaan 1: Jelaskan secara singkat perbedaan Otentikasi dan Otorisasi! Di bagian mana (dalam kode yang telah anda buat) konsep tersebut diimplementasi?
 
diff --git a/app.env b/app.env
new file mode 100644
index 0000000000000000000000000000000000000000..89bfe2d08b9ca2a5173f401f4616f97c266e0004
--- /dev/null
+++ b/app.env
@@ -0,0 +1,6 @@
+SPRING_PROFILES_ACTIVE=prod
+
+MYSQL_ROOT_PASSWORD=password123456!
+MYSQL_DATABASE=apap_db
+MYSQL_USER=apap_user
+MYSQL_PASSWORD=password1234!
\ No newline at end of file
diff --git a/app2.env b/app2.env
new file mode 100644
index 0000000000000000000000000000000000000000..7cf6d34976102b60d78cabe650b3fc112e79f01a
--- /dev/null
+++ b/app2.env
@@ -0,0 +1,6 @@
+SPRING_PROFILES_ACTIVE=prod2
+
+MYSQL_ROOT_PASSWORD=password123456!
+MYSQL_DATABASE=apap_db
+MYSQL_USER=apap_user
+MYSQL_PASSWORD=password1234!
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PageController.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PageController.java
index 9562431bcbaf3df89642520299f240346a66956e..22a163fae835514416b9a171d00c6f71b71ccb78 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PageController.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PageController.java
@@ -9,6 +9,7 @@ import apap.tutorial.belajarbelajar.service.UserService;
 import apap.tutorial.belajarbelajar.setting.Setting;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
 import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.User;
@@ -44,7 +45,8 @@ public class PageController {
     }
 
     @RequestMapping("/login")
-    public String login(){
+    public String login(Model model){
+        model.addAttribute("port", serverProperties.getPort());
         return "login";
     }
 
@@ -54,6 +56,8 @@ public class PageController {
     private UserService userService;
     @Autowired
     private RoleService roleService;
+    @Autowired
+    ServerProperties serverProperties;
 
     @GetMapping("/validate-ticket")
     public ModelAndView adminLoginSSO(
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/security/WebSecurityConfig.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/security/WebSecurityConfig.java
index f3446ec392f5942f2344f80e793c650ad6819d45..651a570b56a02d85be64fbc54b091c99b4d25b9e 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/security/WebSecurityConfig.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/security/WebSecurityConfig.java
@@ -37,10 +37,8 @@ public class WebSecurityConfig {
         return http.build();
     }
 
-    @Bean
-    public BCryptPasswordEncoder encoder() {
-        return new BCryptPasswordEncoder();
-    }
+//    @Bean
+    public BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
 
 //    @Autowired
 //    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
@@ -56,6 +54,6 @@ public class WebSecurityConfig {
 
     @Autowired
     public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
-        auth.userDetailsService(userDetailsService).passwordEncoder(encoder());
+        auth.userDetailsService(userDetailsService).passwordEncoder(encoder);
     }
 }
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/application-dev.yml b/belajarbelajar/src/main/resources/application-dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bb17027fc8e8875a05107ad9cc8af5957c1c4584
--- /dev/null
+++ b/belajarbelajar/src/main/resources/application-dev.yml
@@ -0,0 +1,34 @@
+spring:
+
+  # konfigurasi untuk koneksi db
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+
+    # sesuaikan nama database anda dengan di bawah ini
+    url: jdbc:mysql://localhost:3306/apap_db?useSSL=false&serverTimezone=Asia/Jakarta
+
+    # sesuaikan dengan NAMA dan PASSWORD anda dengan username password di bawah ini
+    username: apap_user
+    password: password1234!
+
+  jpa:
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
+        format_sql: true
+
+    # pembuatan database (create || create-drop || validate || update)
+    hibernate.ddl-auto: create-drop
+
+    show-sql: true
+
+
+  # Templates reloading during development
+  thymeleaf:
+    prefix: file:src/main/resources/templates/
+    cache: false
+
+  # Static resources reloading during development
+  web:
+    resources:
+      static-locations: file:src/main/resources/static/
diff --git a/belajarbelajar/src/main/resources/application-prod.yml b/belajarbelajar/src/main/resources/application-prod.yml
new file mode 100644
index 0000000000000000000000000000000000000000..567c15da3db8c23adf5273c83104c32f40214d42
--- /dev/null
+++ b/belajarbelajar/src/main/resources/application-prod.yml
@@ -0,0 +1,26 @@
+server:
+  address: 0.0.0.0
+  port: 8080
+
+spring:
+  # konfigurasi untuk koneksi db
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+
+    # sesuaikan nama database anda dengan di bawah ini
+    url: jdbc:mysql://db:3306/apap_db?useSSL=false&serverTimezone=Asia/Jakarta
+
+    # sesuaikan dengan NAMA dan PASSWORD anda dengan username password di bawah ini
+    username: apap_user
+    password: password1234!
+
+  jpa:
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
+        format_sql: true
+
+    # pembuatan database (create || create-drop || validate || update)
+    hibernate.ddl-auto: create-drop
+
+    show-sql: true
diff --git a/belajarbelajar/src/main/resources/application-prod2.yml b/belajarbelajar/src/main/resources/application-prod2.yml
new file mode 100644
index 0000000000000000000000000000000000000000..acf203666ca8bd0fc5908be08d2c71093a69ab7d
--- /dev/null
+++ b/belajarbelajar/src/main/resources/application-prod2.yml
@@ -0,0 +1,26 @@
+server:
+  address: 0.0.0.0
+  port: 2020
+
+spring:
+  # konfigurasi untuk koneksi db
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+
+    # sesuaikan nama database anda dengan di bawah ini
+    url: jdbc:mysql://db:3306/apap_db?useSSL=false&serverTimezone=Asia/Jakarta
+
+    # sesuaikan dengan NAMA dan PASSWORD anda dengan username password di bawah ini
+    username: apap_user
+    password: password1234!
+
+  jpa:
+    properties:
+      hibernate:
+        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
+        format_sql: true
+
+    # pembuatan database (create || create-drop || validate || update)
+    hibernate.ddl-auto: create-drop
+
+    show-sql: true
diff --git a/belajarbelajar/src/main/resources/application.properties b/belajarbelajar/src/main/resources/application.properties
deleted file mode 100644
index ae57aa1603495696847be013668e89f17c678ac4..0000000000000000000000000000000000000000
--- a/belajarbelajar/src/main/resources/application.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#konfigurasi untuk koneksi MySQL
-spring.sql.init.platform=mysql
-spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
-#sesuaikan NAMA_DATABASE dengan nama database anda
-spring.datasource.url=jdbc:mysql://localhost:3306/belajarbelajar?useSSL=false&serverTimezone=Asia/Jakarta
-
-#sesuaikan dengan NAMA dan PASSWORD mysql anda
-spring.datasource.username=root
-spring.datasource.password=
-
-#error bean
-spring.main.allow-circular-references=true
-
-#optimize query untuk db MySQL
-spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
-
-#pembuatan database (create || create drop || validate || update)
-spring.jpa.hibernate.ddl-auto=update
-
-server.port=8080
diff --git a/belajarbelajar/src/main/resources/application.yml b/belajarbelajar/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e33662a49aa8dfa501b6166b47e8519cbc24e61f
--- /dev/null
+++ b/belajarbelajar/src/main/resources/application.yml
@@ -0,0 +1,5 @@
+
+
+spring:
+  profiles:
+    default: dev
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/login.html b/belajarbelajar/src/main/resources/templates/login.html
index f304bd26e73b5678b83a3912a0a1e66746b5075b..6487513151e47864d6a1210bd315c69b4df9dc6b 100644
--- a/belajarbelajar/src/main/resources/templates/login.html
+++ b/belajarbelajar/src/main/resources/templates/login.html
@@ -18,6 +18,9 @@
         <div class="card-header">
           Log in
         </div>
+        <div class="card-header">
+          <p th:text="'Port: ' + ${port}"></p>
+        </div>
         <div class="card-body">
           <div th:if="${param.error}">
             <span style="color: red">Invalid username and password.</span>
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d9687736a3f7177c91020131550c45ed76d5bc2a
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,54 @@
+version: '2'
+services:
+  web:
+    build:
+      context: .
+    restart: always
+    ports:
+      - "10127:8080"
+    volumes:
+      - ./file-storage:/file-storage
+      - ./log:/log
+    env_file:
+      - app.env
+    depends_on:
+      - db
+    networks:
+      - frontend-network
+      - backend-network
+  web2:
+    build:
+      context: .
+    restart: always
+    ports:
+      - "10128:2020"
+    volumes:
+      - ./file-storage:/file-storage
+      - ./log:/log
+    env_file:
+      - app2.env
+    depends_on:
+      - db
+    networks:
+      - frontend-network
+      - backend-network
+
+  db:
+    image: mariadb:10.4.24
+    restart: always
+    env_file:
+      - app.env
+    volumes:
+      - mysql-db-volume:/var/lib/mysql
+    networks:
+      - backend-network
+
+volumes:
+  mysql-db-volume:
+
+networks:
+  frontend-network:
+    driver: bridge
+  backend-network:
+
+