Skip to content

DSDP 3 - Memasang Moodle dengan Cara Konvensional dan Berbasis Kontainer

License

Notifications You must be signed in to change notification settings

andisugandi/jagoanhosting-pasang-moodle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

Memasang Moodle dengan Cara Konvensional dan Berbasis Kontainer

Tulisan ini dalam rangka mendukung kegiatan Workshop Digital School Development Program (DSDP) #03: Memasang Moodle dengan Cara Konvensional dan Berbasis Kontainer.

Berkas presentasinya dapat diperoleh di: jagoanhosting-pasang-moodle.pdf.

Manakah yang Terbaik?

  1. Memasang Moodle Cara Konvensional, atau
  2. Memasang Moodle Berbasis Kontainer?

Memasang Moodle Cara Konvensional

jagoanhosting-pasang-moodle

1. Sediakan Server (VPS).

  • Pasang VPS sesuai keinginan.
  • Dalam tutorial ini, penulis menggunakan Linux CentOS 7: CentOS Linux release 7.9.2009 (Core).
  • Sebagai awal, kita pastikan firewall sudah dipasang dan diatur dengan tepat:
    sudo yum install firewalld
    sudo systemctl enable --now firewalld
    sudo firewall-cmd --permanent --add-interface=eth0 --zone=public
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all --zone=public

2. Pasang Paket.

  • Web Server

    sudo yum update
    sudo yum install httpd httpd-tools
    sudo systemctl enable --now httpd
    sudo systemctl status httpd
    sudo firewall-cmd --permanent --add-service={http,https} --zone=public
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all --zone=public
  • Modul PHP

    sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    sudo rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    sudo yum-config-manager --enable remi-php74
    sudo yum install php php-fpm php-cli php-pspell php-curl php-gd php-intl php-mysqlnd php-xml php-xmlrpc php-ldap php-zip php-json php-soap php-opcache php-readline php-mbstring php-sodium
    sudo echo '<?php phpinfo(); ?>' > /var/www/html/info.php
    sudo systemctl restart httpd
  • Basis Data

    Tambahkan berkas repositori baru MariaDB.repo, dengan menggunakan penyunting teks yang biasa anda gunakan (mungkin nano?).

    Saya menggunakan vim. Pasang paketnya jika belum: sudo yum install vim .

    sudo vim /etc/yum.repos.d/MariaDB.repo

    Isinya:

    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.5/centos7-amd64
    gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1
    sudo yum install MariaDB-server MariaDB-client

3. Konfigurasi.

  • Web Server

    sudo vim /etc/httpd/conf.d/web1.namasekolah.com.conf

    isinya:

    <VirtualHost *:80>
     ServerName web1.namasekolah.com
     DocumentRoot /var/www/html/moodle
     DirectoryIndex index.html index.htm index.php index.php4 index.php5
     <Directory /var/www/html/moodle>
         Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch
         Allow from all
         AllowOverride All   
     </Directory>
     ErrorLog /var/log/httpd/web1.namasekolah.com_error_log
     CustomLog /var/log/httpd/web1.namasekolah.com_access_log combined
    </VirtualHost>
    sudo systemctl reload httpd
  • Modul PHP

    sudo vim /etc/php.ini

    Ubah nilai baris max_input_vars sehingga berisi nilai: 10000.

    max_input_vars = 10000
    sudo systemctl restart httpd
  • Basis Data

    sudo vim /etc/my.cnf.d/server.cnf

    Sesuaikan isi [mariadb] menjadi seperti berikut:

    [mariadb]
    innodb_file_per_table = 1
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    skip-character-set-client-handshake
    sudo systemctl enable --now mariadb

    Lakukan instruksi berikut agar akun root dapat memiliki kata kunci saat menggunakan shell layanan basis data:

    sudo mysql_secure_installation

    Selanjutnya akses shell layanan MySQL:

    mysql -u root -p

    Membuat basis data yang nanti digunakan oleh Moodle:

    CREATE DATABASE moodledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'moodleuser'@'localhost' IDENTIFIED BY 't4ny4adm1n';
    GRANT ALL ON moodledb.* TO 'moodleuser'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;

4. Unduh Kode Moodle.

Duplikasi kode Moodle menggunakan Git:

sudo yum install git
cd /var/www/html
sudo git clone https://github.com/moodle/moodle.git

Memilih Versi Moodle:

cd moodle
sudo git branch --track MOODLE_311_STABLE origin/MOODLE_311_STABLE
sudo git checkout MOODLE_311_STABLE
sudo mkdir /var/moodledata

Pastikan kepemilikian Kode Web Moodle oleh akun web werver (apache):

sudo chown apache:apache -R /var/www/html/moodle /var/moodledata
sudo chmod 777 /var/moodledata

Untuk distro Linux turunan Red Hat, terutama yang mengaktifkan fitur SELinux, hak akses baca-tulis ke direktori Moodle oleh web server harus didefinisikan dengan tepat:

sudo semanage fcontext -at httpd_sys_rw_content_t '/var/www/moodle(/.*)?'
sudo restorecon -Rv '/var/www/moodle/'
sudo semanage fcontext -at httpd_sys_rw_content_t '/var/moodledata(/.*)?'
sudo restorecon -Rv '/var/moodledata/'

5. Pasang Sertifikat SSL/TLS.

sudo yum install certbot mod_ssl python2-certbot-apache
sudo certbot --apache

6. Pasang (Deploy) Moodle di VPS via Web-Installer.

  • Isi kolom kredensial yang diminta dengan data yang bersesuaian (nama basis data, akun pengaksesnya, beserta kata kunci akun tersebut).

7. Optimasi (jika perlu).


Jika memang pilihan untuk memasang (deploy) Moodle adalah dengan menggunakan fasilitas Kontainer (Docker), maka layanan web server dan basis datanya harus dimatikan terlebih dahulu dari VPS yang pernah digunakan sebelumnya, lalu paket keduanya dihapus.

Pada layanan web berbasis kontainer, listen port nomor: 80 dan 443 akan dilakukan oleh Load Balancer dari Traefik.


Memasang Moodle Berbasis Kontainer

1. Sediakan Server (VPS).

  • Pasang VPS sesuai keinginan.

  • Dalam tutorial ini, penulis menggunakan Linux CentOS 7: CentOS Linux release 7.9.2009 (Core).

  • Pastikan tidak ada layanan web dan basis data yang sedang berjalan:

    sudo systemctl stop httpd
    sudo systemctl stop mariadb
  • Jangan lupa, juga pastikan tidak ada paket web server (misal: httpd) dan basis data yang terpasang:

    sudo yum remove httpd MariaDB-server MariaDB-client
  • Selanjutnya (jika belum), pasang dan atur firewall dengan tepat:

    sudo yum install firewalld
    sudo systemctl enable --now firewalld
    sudo firewall-cmd --permanent --add-interface=eth0 --zone=public
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all --zone=public

2. Pasang Mesin Kontainer (Docker) + Docker Compose.

  • Pastikan paket Docker versi bawaan dihapus terlebih dahulu:

    sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  • Tambahkan repositori resmi Docker, lalu pasang paketnya:

    sudo yum install yum-utils
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install docker-ce docker-ce-cli containerd.io
  • Jalankan layanan Docker, lalu tambahkan akun yang kita gunakan ke group docker:

    sudo systemctl enable --now docker
    sudo usermod -aG docker $USER

Lakukan logout, lalu login kembali.

  • Selanjutnya pasang Docker Compose:

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    sudo systemctl restart docker
  • Akhirnya periksa apakah binari Docker dan Docker Compose sudah bisa dijalankan:

    docker --version
    docker-compose --version

3. Konfigurasi Load Balancer & Sertifikat SSL/TLS via Traefik.

  • Persiapkan susunan berkas dan direktori yang diperlukan:

    mkdir ~/traefik && cd ~/traefik
    mkdir -p data/configurations
    touch docker-compose.yml
    touch data/acme.json
    touch data/configurations/dynamic.yml
    touch data/traefik.yml
    chmod 600 data/acme.json
    traefik/
    ├── data
    │   ├── acme.json
    │   ├── configurations
    │   │   └── dynamic.yml
    │   └── traefik.yml
    └── docker-compose.yml
    
    2 directories, 4 files
  • Buatkan kata kunci untuk login akun admin Traefik agar dapat mengakses Dashboard Traefik:

    htpasswd -nb admin passwordUntukAkunAdminTrafik

    Hasilnya keluarannya misal seperti ini:

    admin:$apr1$karakteracakpunyaandamestinyaberbedadanunik

Simpan untuk nanti digunakan di berkas data/configurations/dynamic.yml.

  • Isi berkas docker-compose.yml:

    version: '3.9'
    
    services:
      traefik:
        image: traefik:v2.4
        container_name: traefik
        restart: always
        security_opt:
          - no-new-privileges:true
        ports:
          - 80:80
          - 443:443
        volumes:
          - /etc/localtime:/etc/localtime:ro
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - ./data/traefik.yml:/traefik.yml:ro
          - ./data/acme.json:/acme.json
          # Add folder with dynamic configuration yml
          - ./data/configurations:/configurations
        networks:
          - proxy
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=proxy"
          - "traefik.http.routers.traefik-secure.entrypoints=websecure"
          - "traefik.http.routers.traefik-secure.rule=Host(`web1.namasekolah.com`)"
          - "traefik.http.routers.traefik-secure.middlewares=user-auth@file"
          - "traefik.http.routers.traefik-secure.service=api@internal"
    
    networks:
      proxy:
        external: true
  • Isi berkas data/traefik.yml:

    api:
      dashboard: true
    
    entryPoints:
      web:
        address: :80
        http:
          redirections:
            entryPoint:
              to: websecure
    
      websecure:
        address: :443
        http:
          middlewares:
            - secureHeaders@file
            - nofloc@file
          tls:
            certResolver: letsencrypt
    
    pilot:
      dashboard: false
    
    providers:
      docker:
        endpoint: "unix:///var/run/docker.sock"
        exposedByDefault: false
      file:
        filename: /configurations/dynamic.yml
    
    certificatesResolvers:
      letsencrypt:
        acme:
          email: [email protected]
          storage: acme.json
          keyType: EC384
          httpChallenge:
            entryPoint: web
    
      buypass:
        acme:
          email: [email protected]
          storage: acme.json
          caServer: https://api.buypass.com/acme/directory
          keyType: EC256
          httpChallenge:
            entryPoint: web
  • Isi berkas data/configurations/dynamic.yml:

    # Dynamic configuration
    http:
      middlewares:
        nofloc:
          headers:
            customResponseHeaders:
              Permissions-Policy: "interest-cohort=()"
        secureHeaders:
          headers:
            sslRedirect: true
            forceSTSHeader: true
            stsIncludeSubdomains: true
            stsPreload: true
            stsSeconds: 31536000   
    
        # UserName : admin
        # Password : passwordUntukAkunAdminTrefik
        user-auth:
          basicAuth:
            users:
              - "admin:$apr1$ntilzY14$fDIINe9XxjPnVV6kt1V.1/"
    
    tls:
      options:
        default:
          cipherSuites:
            - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
            - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
            - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
            - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
            - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
            - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
          minVersion: VersionTLS12
  • Jangan lupa untuk membuatkan Docker Network: proxy terlebih dahulu:

    docker network create proxy

4. Konfigurasi Image Moodle (Persistent Volume Moodle, moodledata, MariaDB).

  • Siapkan direktori Moodle & buat berkas docker-compose.yml di dalamnya:

    mkdir ~/moodle && cd ~/moodle
    vim docker-compose.yml

    Berikut isi berkas docker-compose.yml:

    version: '3.7'
    
    services:
      mariadb:
        image: 'docker.io/bitnami/mariadb:10.5-debian-10'
        container_name: mariadb
        environment:
          # Bagian ini HARUS DIGANTI dengan mengikuti panduan:
          # “Manage sensitive data with Docker secrets”
          # https://docs.docker.com/engine/swarm/secrets
          - MARIADB_ROOT_PASSWORD=jagoanhosting
          - MARIADB_USER=jagoanhostinguser
          - MARIADB_DATABASE=jagoanhostingdb
          - MARIADB_PASSWORD=jagoanhosting
          # ---Agar informasi kredensial dapat aman
          - MARIADB_CHARACTER_SET=utf8mb4
          - MARIADB_COLLATE=utf8mb4_unicode_ci
        networks:
          - moodlenetwork
        volumes:
          - 'moodle-mariadb:/bitnami/mariadb'
      moodle:
        image: 'docker.io/bitnami/moodle:3-debian-10'
        container_name: moodle
        environment:
          - MOODLE_DATABASE_HOST=mariadb
          - MOODLE_DATABASE_PORT_NUMBER=3306
          # Bagian ini HARUS DIGANTI dengan mengikuti panduan:
          # “Manage sensitive data with Docker secrets”
          # https://docs.docker.com/engine/swarm/secrets
          - MOODLE_DATABASE_USER=jagoanhostinguser
          - MOODLE_DATABASE_NAME=jagoanhostingdb
          - MOODLE_PASSWORD=jagoanhosting
          - [email protected]
          - MOODLE_DATABASE_PASSWORD=jagoanhosting
          # ---Agar informasi kredensial dapat aman
          - PHP_MEMORY_LIMIT=1024M
          - PHP_POST_MAX_SIZE=1024M
          - PHP_UPLOAD_MAX_FILESIZE=1024M
          - PHP_MAX_EXECUTION_TIME=46800
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=proxy"
          - "traefik.http.routers.moodle-secure.entrypoints=websecure"
          - "traefik.http.routers.moodle-secure.rule=Host(`web2.namasekolah.com`)"
        volumes:
          - 'moodle_data:/bitnami/moodle'
          - 'moodledata_data:/bitnami/moodledata'
        networks:
          - moodlenetwork
          - proxy
        depends_on:
          - mariadb
    
    volumes:
      moodle-mariadb:
        driver: local
      moodle_data:
        driver: local
      moodledata_data:
        driver: local
    
    networks:
      moodlenetwork:
      proxy:
        external: true

5. Jalankan Kontainer Traefik.

  • Pastikan sedang berada di dalam direktori traefik, lalu jalankan perintah docker-compose:
    cd ~/traefik
    docker-compose up -d

6. Jalankan Kontainer Moodle.

  • Pastikan sedang berada di dalam direktori moodle, lalu jalankan perintah docker-compose:

    cd ~/moodle
    docker-compose up -d

7. Optimasi (jika perlu).

About

DSDP 3 - Memasang Moodle dengan Cara Konvensional dan Berbasis Kontainer

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published