Membuat Server Foto seperti Google Photos

Seminggu ini saya agak mengesampingkan project PLTS ataupun mikrokontroller saya. Perhatian saya tersita oleh riset dan eksperimen untuk mencari alternatif atau cara agar saya tidak ketergantungan dengan layanan google photos. Pasalnya, storage saya di google one, suatu layanan storage dari google berbayar, sudah mulai mendekati penuh.

Selama beberapa tahun ini, lupa dari sejak kapan, saya berlangganan google storage sebesar 100 GB. Penyimpanan ini termasuk untuk gmail, drive, dan google photos. Layanan ini sangat membantu saya yang memang seneng fotografi, mengabadikan momen, dan suka menata arsip digital terutama foto. Saya tidak perlu pusing kehilangan hasil jepretan karena secara otomatis foto-foto saya di-backup ke cloud oleh google photos, selain backup manual yang sering saya lakukan juga ketika HP penuh.

Saya lebih percaya hasil backup google photos daripada backup manual yang sudah saya lakukan. Backup manual sering kali menyebabkan redundancy dan juga kemungkinan foto yang ter-skip. Selain itu, kedisiplinan dalam membuat kerapihan pengarsipan foto digital kadang naik dan turun sehingga tidak konsisten.

Alternatif Solusi

Seminggu yang lalu, sejak tulisan ini dibuat, saya menemukan solusi open source sebagai alternatif dari Google Photos. Ada beberapa produk yang direkomendasikan oleh AI dan salah satunya bernama Immich. Sampai sekarang saya masih amazed dengan Immich, mirip sekali dengan Google Photos. Bagi orang yang sudah terbiasa pakai google photos, saya yakin akan mudah sekali menyukainya. Fitur-fitur seperti people face recognition, smart search, timeline, maps, dll, tersedia juga di immich. Hal ini tidak terlepas dari kemajuan teknologi machine learning yang juga disematkan di immich.

Setelah itu saya terbawa suasana hingga melakukan eksperimen penuh dengan immich. Awalnya saya coba di laptop untuk melakukan evaluasi dari fitur-fitur dan pengalaman pengguna. Cukup puas dengan eksperimen lokal di laptop, saya tingkatkan dengan eksperiman di lingkungan server, sehingga bisa terintegrasi juga dengan smartphone.

Menyiapkan Dukungan System

Sebelum menjalankan Immich, saya perlu menyiapkan lingkungan sistem dimana aplikasi ini berjalan. Saya sampai tiga kali install operating system untuk server untuk ujicoba mana yang paling optimal. Server yang saya gunakan adalah komputer tua berumur 10 tahun an dengan casing dari komputer yang memiliki usia 10 tahun lebih lama lagi. Instalasi pertama saya menggunakan antiX, sebuah distro linux berbasis debian. Awalnya saya pakai yang versi arsitektur 32-bit karena saya pakai pc tua dengan os bawaan windows 7 32-bit. Setelah saya install ternyata bermasalah dengan Docker yang tidak lagi mendukung os 32-bit.

Instalasi kedua saya menggunakan AntiX-core yang 64-bit. Distro linux ini sangat ringan sesuai dengan yang diiklankan. Tetapi kompensasinya docker daemon tidak otomatis jalan. Untuk bisa menjalankan docker, ada beberapa step yang harus dilakukan terlebih dahulu secara manual. Sehingga ketika komputer restart, docker tidak langsung berjalan. Otomasi sudah coba saya lakukan dan ternyata belum berhasil. Immich sempat berhasil berjalan, tetapi masih ada kekurangan sana-sini.

Yang terakhir, saya buat agak lebih mapan dan lebih teratur. Saya tambahkan HDD satu lagi yang saya khususkan hanya untuk menyimpan foto dan metadatanya. Sedangkan HDD yang satunya saya isi dengan sistem operasi. Pemisahan ini saya lakukan untuk membuat sistem ini lebih modular dan lebih mudah dalam perawatan. Selain itu, dari sisi software, saya mencoba menggunakan ubuntu server yang harapannya lebih stabil dan lebih mudah untuk menjalankan docker dan daemon-nya.

Perubahan menjadi dua HDD ini agak memakan waktu karena perlu melakukan beberapa hal di haardware dan juga software. Di hardware saya perlu memindah jeroan CPU dari casing awal yang hanya punya satu slot HDD ke casing CPU lain, sebuah casing lama saya yang kebetulan lama nganggur, yang punya slot HDD hingga 4 atau 5 slot. Sedangkan sisi software, saya perlu ekspansi partisi HDD yang tadinya saya pakai buat ujicoba sebelumnya dengan foto yang sudah terupload hingga 200 GB. Ekspansi partisi ini saya lakukan karena partisi OS sudah tidak diperlukan di HDD kedua. Masalahnya partisi OS ada di sebelah kiri, dan saya belum menemukan cara atau tool untuk expansi partisi HDD ke sebelah kiri. Akhirnya, HDD kedua ini saya hapus total partisinya dan memulai dari awal lagi.

Bersambung… (cerita migrasi foto)

Menulis Blog dengan Bantuan AI

Beberapa tulisan blog saya terakhir ini dibantu oleh AI, terutama yang berkaitan dengan proses saya experiment dengan mikrokontroller seperti ESP dan Arduino. Tulisan yang bersifat step by step atau tutorial sangat terbantu dengan bantuan AI ini.

Mungkin jadi kurang original tetapi masih terbaca natural. Tentu saja tidak copy paste secara keseluruhan. Pasti ada bagian-bagian yang perlu diparafrase ulang.

Dalam kasus saya experiment dengan mikrokontroller, biasanya saya mengerjakan dulu experiment nya, kemudian saya tulis blog nya sebegai dokumentasi.

Saya tinggal tuliskan beberapa poin yang saya kerjakan dan minta AI untuk menuliskan dalam bentu blog. Walaupun hanya poin, ternyata AI bisa menceritakan lebih detail dan memang sesuai dengan apa yang saya kerjakan.

Bisa jadi AI juga mempelajari dari prompt yang saya tulis sebelumnya, sehingga dia juga memahami apa saja yang saya kerjakan. Sehinga ketika diminta menceritakan lagi experimen yang saya kerjakan, dia bener-bener bisa menceritakan dengan gamblang.

Luar biasa perkembangan AI. Entah seperti apa perkembangan beberapa tahun kedepan. Manusia perlu beradaptasi dengan semua teknologi ini.

Membuat HMVC di CodeIgniter 4

CodeIgniter 4 hadir dengan struktur yang lebih modern dan fleksibel dibanding versi sebelumnya. Salah satu pendekatan arsitektur yang sering digunakan untuk membangun aplikasi besar dengan pemisahan modul yang baik adalah HMVC (Hierarchical Model-View-Controller).

HMVC memungkinkan pengembang membagi aplikasi menjadi modul independen, sehingga setiap bagian memiliki Controller, Model, dan View sendiri. Dengan pendekatan ini, kode menjadi lebih modular, reusable, dan scalable.

Pada artikel ini, kita akan membahas cara mengimplementasikan HMVC di CodeIgniter 4, mulai dari struktur folder, konfigurasi autoloading PSR-4, hingga contoh penggunaan.

Pengertian HMVC

HMVC adalah arsitektur berbasis MVC, tetapi setiap bagian proyek terbagi ke dalam modul independen. Ini membantu dalam pemisahan fitur, sehingga pengembangan menjadi lebih mudah dan terorganisir.

Keuntungan Menggunakan HMVC

Modularitas – Setiap fitur aplikasi bisa dikelola secara terpisah dalam modul.
Reusability – Modul dapat digunakan kembali tanpa harus menulis ulang kode.
Kemudahan Pengelolaan – Mempermudah pengembangan proyek besar dengan tim.
Scalability – Memungkinkan ekspansi sistem tanpa harus merombak seluruh arsitektur.

Struktur Folder HMVC

Di CodeIgniter 4, kita dapat membuat struktur modul HMVC dalam folder app/Modules/. Berikut contoh struktur proyek dengan HMVC:

app/
├── Modules/
│   ├── Admin/
│   │   ├── Config/
│   │   │   ├── Routes.php
│   │   ├── Controllers/
│   │   │   ├── AdminController.php
│   │   ├── Models/
│   │   │   ├── AdminModel.php
│   │   ├── Views/
│   │   │   ├── admin.php
│   ├── Blog/
│   │   ├── Config/
│   │   │   ├── Routes.php
│   │   ├── Controllers/
│   │   │   ├── PostController.php
│   │   ├── Models/
│   │   │   ├── PostModel.php
│   │   ├── Views/
│   │   │   ├── post_list.php

Setiap modul memiliki Controller, Model, dan View sendiri, sehingga kode lebih terstruktur dan mudah dikelola.

Konfigurasi PSR-4 untuk Modul HMVC

Agar CodeIgniter mengenali modul tanpa perlu menuliskan path lengkap, kita harus mengatur PSR-4 autoloading.

Buka file app/Config/Autoload.php dan tambahkan modul ke dalam $psr4 :

public $psr4 = [
    'App'  => APPPATH,
    'Modules' => APPPATH . 'Modules'
];

Membuat Routes

Buat file Routes.php di dalam app/Modules/Blog/Config/Routes.php :

<?php 

namespace Modules\Blog\Config;

use CodeIgniter\Router\RouteCollection;

class Routes {
    public static function defineRoutes(RouteCollection $routes) {
        $routes->group('/blog', ['namespace' => 'Modules\Blog\Controllers'], function($routes) {
            $routes->get('/', 'PostController::index');
        });
    }
}

Mengatur Routes

Buka Routes pada app/Config/Routes.php dan tambahkan dua baris paling bawah sehingga isi routes menjadi seperti berikut:

<?php

use CodeIgniter\Router\RouteCollection;

/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');
$routes->get('user', 'Home::index');


use Modules\Blog\Config\Routes as CarRoutes;
CarRoutes::defineRoutes($routes);

Membuat Controller

Sekarang kita buat Controller di app/Modules/Blog/Controllers/PostController.php

namespace Modules\Blog\Controllers;

use CodeIgniter\Controller;
use Modules\Blog\Models\PostModel;

class PostController extends Controller
{
    public function index()
    {
        $model = new PostModel();
        $data['posts'] = $model->getPosts();

        return view('Modules\Blog\Views\post_list', $data);
    }
}

Model dan Views

Membuat model dan view sama seperti dalam MVC biasa, tinggal disesuaikan namespace dan panggil nya.

Menata Ulang Jalur Panel MCB

Dengan bertambahnya kapasitas Inverter untuk suplay tenaga listrik di rumah, maka jalur yang dibackup sama inverter yang dulunya hanya lampu saja, perlu ditambah opsi atau pilihan agar jalur lain bisa menggunakan juga. Kemampuan untuk memilih jalur ini bisa diwujudkan di panel MCB yang sudah ada.

Saya sudah menyiapkan empat jalur untuk membagi beban berdasarkan kegunaan, seperti lampu, AC, stop kontak, dan keperluan berkaitan dengan air. Untuk keperluan listrik yang berhubungan dengan air saya tambahkan ELCB 10 ma, tingkat sensitifitas lebih tinggi dari ELCB umumnya yang 30 ma.

Pemilihan jarus sumber ini saya buat di panel MCB dengan menggunakan COS atau change over switch. COS saya pasang per jalur beban, sehinga kita bisa aktifkan per jalur. Dengan konfigurasi ini kita bisa memilih untuk mengaktifkan PLTS untuk Lampu saja atau kombinasi dengan yang lain.

Membuat Docker Compose untuk CodeIgniter 4 dengan Apache, PostgreSQL, dan pgAdmin

Docker telah menjadi solusi populer dalam pengembangan aplikasi karena kemampuannya dalam mengelola lingkungan secara konsisten. Dalam artikel ini, kita akan membahas cara membuat Docker Compose untuk menjalankan CodeIgniter 4 dengan Apache, PostgreSQL, dan pgAdmin. Konfigurasi ini juga akan mengaktifkan ekstensi PHP intl, pgsql, dan mod_rewrite menggunakan Dockerfile untuk pengaturan yang lebih fleksibel

Struktur Folder

pastikan struktur proye seperti berikut

/project-root
├── docker-compose.yml
├── Dockerfile

Setiap layanan memiliki folder dan Dockerfile sendiri agar dapat dikustomisasi secara modular.

Konfigurasi Dockerfile untuk Codeigniter 4

Buat file app/Dockerfile untuk PHP dengan Apache, mengaktifkan ekstensi yang dibutuhkan seperti pgsql, intl, dan mengaktifkan mod_rewrite:

# Menggunakan image dasar PHP dengan Apache
FROM php:8.2-apache

# Perbarui package manager dan install ekstensi yang diperlukan
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    unzip

# Aktifkan ekstensi PHP Intl dan PostgreSQL
RUN docker-php-ext-install intl pgsql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

EXPOSE 80
CMD ["apache2-foreground"]

Konfigurasi Docker Compose

Buat file docker-compose.yml untuk menghubungkan semua layanan:

version: '3.8'

services:
  app:
    build: .
    container_name: codeigniter4_app
    restart: always
    volumes:
      - ./html:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - db
    environment:
      - CI_ENV=development
    networks:
      - ci_network

  db:
    image: postgres:15
    container_name: ci4_postgres
    restart: always
    environment:
      POSTGRES_USER: ci4_user
      POSTGRES_PASSWORD: ci4_password
      POSTGRES_DB: ci4_database
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - ci_network

  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin_ci4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: adminpassword
    ports:
      - "5050:80"
    depends_on:
      - db
    networks:
      - ci_network

networks:
  ci_network:
    driver: bridge

Menjalankan Docker Compose

Setelah semua konfigurasi selesai, jalankan perintah berikut untuk membangun semua layanan:

docker-compose up --build -d