Melanggar Aturan: Menggunakan SQLite Untuk Demo Aplikasi Web

Diterbitkan: 2022-03-10
Ringkasan cepat Jadi, Anda telah membuat aplikasi web pembunuh berikutnya, tetapi sekarang Anda dihadapkan pada pertanyaan yang harus dipertimbangkan oleh setiap produk baru, "Bagaimana cara menunjukkan kepada semua orang betapa hebatnya aplikasi saya?"

Sebagian besar calon pengguna ingin mencoba perangkat lunak atau layanan sebelum memberikan waktu dan uang. Beberapa produk berfungsi dengan baik hanya dengan memberikan uji coba gratis kepada pengguna, sementara aplikasi lain paling berpengalaman dengan data sampel yang sudah ada. Seringkali di sinilah akun demo kuno berperan.

Namun, siapa pun yang pernah menerapkan akun demo dapat membuktikan masalah yang terkait. Anda tahu bagaimana segala sesuatunya berjalan di Internet: Siapa pun dapat memasukkan data (apakah masuk akal atau tidak ke produk) dan ada kemungkinan besar bahwa konten yang ditambahkan oleh pengguna anonim atau bot dapat menyinggung orang lain. Tentu, Anda selalu dapat mengatur ulang basis data, tetapi seberapa sering dan kapan? Dan pada akhirnya, apakah itu benar-benar menyelesaikan masalah? Solusi saya menggunakan SQLite .

Mengapa Tidak Menggunakan SQLite Untuk Versi Produksi?

Sudah umum diketahui bahwa SQLite tidak menangani banyak utas karena seluruh database dikunci selama perintah tulis, yang merupakan salah satu alasan mengapa Anda tidak boleh menggunakannya di lingkungan produksi normal. Namun, dalam solusi saya, file SQLite terpisah digunakan untuk setiap pengguna mendemonstrasikan perangkat lunak. Ini berarti bahwa batasan penulisan hanya terbatas pada satu pengguna tersebut, tetapi beberapa pengguna secara bersamaan (masing-masing dengan file database mereka sendiri) tidak akan mengalami batasan ini. Ini memungkinkan pengalaman yang terkontrol untuk pengujian pengguna yang mengemudikan perangkat lunak dan memungkinkan mereka untuk melihat dengan tepat apa yang Anda ingin mereka lihat.

Lebih banyak setelah melompat! Lanjutkan membaca di bawah ini

Tutorial ini didasarkan pada solusi dunia nyata yang telah berhasil saya jalankan untuk aplikasi web demo SaaS sejak 2015. Tutorial ini ditulis untuk Ruby on Rails (kerangka pilihan saya) versi 3 dan lebih tinggi, tetapi konsep dasarnya harus dapat disesuaikan dengan bahasa atau kerangka kerja lain. Faktanya, karena Ruby on Rails mengikuti paradigma perangkat lunak "konvensi atas konfigurasi" bahkan mungkin lebih mudah untuk diimplementasikan dalam kerangka kerja lain, terutama bahasa telanjang (seperti PHP langsung) atau kerangka kerja yang tidak banyak membantu dalam hal mengelola koneksi basis data. .

Meskipun demikian, teknik ini sangat cocok untuk Ruby on Rails. Mengapa? Karena, sebagian besar, ini adalah "database agnostic." Artinya Anda harus dapat menulis kode Ruby dan beralih antar database tanpa masalah.

Contoh versi selesai dari proses ini dapat diunduh dari GitHub.

Langkah Pertama: Lingkungan Penerapan

Kami akan menerapkannya nanti, tetapi Ruby on Rails secara default dibagi menjadi lingkungan pengembangan, pengujian, dan produksi. Kami akan menambahkan ke daftar ini lingkungan demo baru untuk aplikasi kami yang akan hampir identik dengan lingkungan produksi tetapi akan memungkinkan kami untuk menggunakan pengaturan basis data yang berbeda.

Di Rails, buat lingkungan baru dengan menduplikasi file config/environments/production.rb dan beri nama demo.rb . Karena lingkungan demo akan digunakan dalam pengaturan seperti produksi, Anda mungkin tidak perlu mengubah banyak opsi konfigurasi untuk lingkungan baru ini, meskipun saya menyarankan untuk mengubah config.assets.compile dari false menjadi true yang akan mempermudah pengujian secara lokal tanpa harus melakukan prakompilasi.

Jika Anda menjalankan Rails 4 atau lebih tinggi, Anda juga perlu memperbarui config/secrets.yml untuk menambahkan secret_key_base untuk lingkungan demo. Pastikan untuk membuat kunci rahasia ini berbeda dari produksi untuk memastikan sesi unik di antara setiap lingkungan, lebih lanjut mengamankan aplikasi Anda.

Selanjutnya Anda perlu menentukan konfigurasi database di config/database.yml . Sementara lingkungan demo terutama akan menggunakan database duplikat yang akan kita bahas di bagian berikutnya, kita harus menentukan file database default dan pengaturan yang akan digunakan untuk demo kita. Tambahkan yang berikut ini ke config/database.yml :

 demo: adapter: sqlite3 pool: 5 timeout: 5000 database: db/demo.sqlite3

Di Rails, Anda mungkin juga ingin memeriksa Gemfile Anda untuk memastikan bahwa SQLite3 tersedia di lingkungan demo baru. Anda dapat mengatur ini dengan berbagai cara, tetapi mungkin terlihat seperti ini:

 group :development, :test, :demo do gem 'sqlite3' end

Setelah database dikonfigurasi, Anda perlu rake db:migrate RAILS_ENV=demo dan kemudian memasukkan data ke dalam database sesuka Anda (apakah itu dari file seed, memasukkan data baru secara manual atau bahkan menggandakan file development.sqlite3 ). Pada titik ini, Anda harus memeriksa untuk memastikan semuanya berfungsi dengan menjalankan rails server -e demo dari baris perintah. Saat Anda menjalankan server di lingkungan demo baru, Anda dapat memastikan data pengujian sesuai keinginan Anda, tetapi Anda selalu dapat kembali dan mengedit konten itu nanti. Saat menambahkan konten Anda ke database demo, saya akan merekomendasikan membuat kumpulan data yang bersih sehingga file sekecil mungkin. Namun, jika Anda perlu memigrasikan data dari database lain, saya sarankan YamlDb, yang membuat format database-independen untuk membuang dan memulihkan data.

Jika aplikasi Rails Anda berjalan seperti yang diharapkan, Anda dapat melanjutkan ke langkah berikutnya.

Langkah Kedua: Menggunakan Basis Data Demo

Bagian penting dari tutorial ini adalah memungkinkan setiap sesi untuk menggunakan file database SQLite yang berbeda. Biasanya aplikasi Anda akan terhubung ke database yang sama untuk setiap pengguna sehingga kode tambahan akan diperlukan untuk tugas ini.

Untuk memulai dengan mengizinkan Ruby on Rails untuk beralih database, pertama-tama kita perlu menambahkan empat metode pribadi berikut ke application_controller.rb . Anda juga perlu menentukan filter sebelumnya untuk metode set_demo_database sehingga referensi logika database demo yang benar dipanggil pada setiap pemuatan halaman.

 # app/controllers/application_controller.rb # use `before_filter` for Rails 3 before_action :set_demo_database, if: -> { Rails.env == 'demo' } private # sets the database for the demo environment def set_demo_database if session[:demo_db] # Use database set by demos_controller db_name = session[:demo_db] else # Use default 'demo' database db_name = default_demo_database end ActiveRecord::Base.establish_connection(demo_connection(db_name)) end # Returns the current database configuration hash def default_connection_config @default_config ||= ActiveRecord::Base.connection.instance_variable_get("@config").dup end # Returns the connection hash but with database name changed # The argument should be a path def demo_connection(db_path) default_connection_config.dup.update(database: db_path) end # Returns the default demo database path defined in config/database.yml def default_demo_database return YAML.load_file("#{Rails.root.to_s}/config/database.yml")['demo']['database'] end

Karena setiap sesi server akan memiliki database yang berbeda, Anda akan menyimpan nama file database dalam variabel sesi. Seperti yang Anda lihat, kami menggunakan session[:demo_db] untuk melacak database spesifik untuk pengguna. Metode set_demo_database mengontrol basis data mana yang akan digunakan dengan membuat koneksi ke set basis data dalam variabel sesi. Metode default_demo_database hanya memuat jalur database seperti yang didefinisikan dalam file konfigurasi database.yml .

Jika Anda menggunakan bahasa telanjang, pada titik ini Anda mungkin dapat memperbarui skrip koneksi database Anda untuk menunjuk ke database baru dan kemudian melanjutkan ke bagian berikutnya. Di Rails, banyak hal memerlukan beberapa langkah lagi karena mengikuti paradigma perangkat lunak "konvensi atas konfigurasi".

Langkah Ketiga: Menduplikasi File SQLite

Sekarang setelah aplikasi diatur untuk menggunakan database baru, kita memerlukan pemicu untuk sesi demo baru. Demi kesederhanaan, mulailah dengan hanya menggunakan tombol dasar "Mulai Demo". Anda juga bisa membuatnya menjadi formulir di mana Anda mengumpulkan nama dan alamat email (untuk tindak lanjut dari tim penjualan, dll.) atau beberapa hal lainnya.

Tetap berpegang pada konvensi Rails, buat pengontrol 'Demo' baru:

 rails generate controller demos new

Selanjutnya, Anda harus memperbarui rute untuk menunjuk ke tindakan pengontrol baru Anda, membungkusnya dalam kondisi untuk mencegahnya dipanggil di lingkungan produksi. Anda dapat memberi nama rute sesuka Anda atau menamainya menggunakan konvensi Rails standar:

 if Rails.env == 'demo' get 'demos/new', as: 'new_demo' post 'demos' => 'demos#create', as: 'demos' end

Selanjutnya, mari tambahkan formulir yang sangat dasar ke views/demos/new.html.erb . Anda mungkin ingin menambahkan bidang formulir tambahan untuk diambil:

 <h1>Start a Demo</h1> <%= form_tag demos_path, method: :post do %> <%= submit_tag 'Start Demo' %> <% end %>

Keajaiban terjadi dalam aksi create . Ketika pengguna mengirimkan ke rute ini, tindakan akan menyalin file demo.sqlite3 dengan nama file baru yang unik, mengatur variabel sesi, login pengguna (jika berlaku), dan kemudian mengarahkan pengguna ke halaman yang sesuai (kami akan menyebutnya sebagai 'dasbor').

 class DemosController < ApplicationController def new # Optional: setting session[:demo_db] to nil will reset the demo session[:demo_db] = nil end def create # make db/demos dir if doesn't exist unless File.directory?('db/demos/') FileUtils.mkdir('db/demos/') end # copy master 'demo' database master_db = default_demo_database demo_db = "db/demos/demo-#{Time.now.to_i}.sqlite3" FileUtils::cp master_db, demo_db # set session for new db session[:demo_db] = demo_db # Optional: login code (if applicable) # add your own login code or method here login(User.first) # Redirect to wherever you want to send the user next redirect_to dashboard_path end end

Sekarang Anda seharusnya dapat mencoba kode demo secara lokal dengan sekali lagi meluncurkan server menggunakan running rails server -e demo .

Jika Anda memiliki server yang sudah berjalan, Anda harus memulai ulang untuk setiap perubahan yang Anda buat karena itu dikonfigurasi untuk menyimpan kode seperti server produksi.

Setelah semua kode berfungsi seperti yang diharapkan, komit perubahan Anda ke kontrol versi Anda dan pastikan Anda mengkomit file demo.sqlite3 , tetapi bukan file di direktori db/demos . Jika Anda menggunakan git, Anda cukup menambahkan yang berikut ini ke file .gitignore Anda:

Jika Anda ingin mengumpulkan informasi tambahan dari pengguna demo (seperti nama dan/atau email), Anda mungkin ingin mengirimkan informasi tersebut melalui API ke aplikasi utama Anda atau jalur penjualan lainnya karena basis data demo Anda tidak akan dapat diandalkan (direset setiap kali Anda memindahkan).

 !/db/demo.sqlite3 db/demos/*

Langkah Terakhir: Menyebarkan Server Demo Anda

Sekarang setelah Anda memiliki pengaturan demo yang berfungsi secara lokal, Anda jelas ingin menerapkannya sehingga semua orang dapat menggunakannya. Meskipun setiap aplikasi berbeda, saya akan merekomendasikan bahwa aplikasi demo hidup di server yang terpisah dan oleh karena itu domain sebagai aplikasi produksi Anda (seperti demo.myapp.com). Ini akan memastikan bahwa Anda menjaga dua lingkungan terisolasi. Selain itu, karena file SQLite disimpan di server, layanan seperti Heroku tidak akan berfungsi karena tidak menyediakan akses ke sistem file. Namun, Anda masih dapat menggunakan hampir semua penyedia VPS (seperti AWS EC2, Microsoft Azure, dll). Jika Anda menyukai kenyamanan otomatis, ada opsi Platform sebagai Layanan lain yang memungkinkan Anda bekerja dengan VPS.

Terlepas dari proses penerapan Anda, Anda mungkin juga perlu memeriksa apakah aplikasi memiliki izin baca/tulis yang sesuai untuk direktori tempat Anda menyimpan file demo SQLite. Ini dapat ditangani secara manual atau dengan kait penyebaran.

SQLite Tidak Akan Bekerja Untuk Saya. Bagaimana Dengan Sistem Basis Data Lainnya?

Tidak ada dua aplikasi yang dibuat sama dan begitu pula persyaratan basis datanya. Dengan menggunakan SQLite, Anda memiliki keuntungan karena dapat dengan cepat menduplikasi database, serta dapat menyimpan file dalam kontrol versi. Sementara saya percaya bahwa SQLite akan bekerja untuk sebagian besar situasi (terutama dengan Rails), ada situasi di mana SQLite mungkin tidak cocok untuk kebutuhan aplikasi Anda. Untungnya, masih dimungkinkan untuk menggunakan konsep yang sama di atas dengan sistem database lainnya. Proses menduplikasi database akan sedikit berbeda untuk setiap sistem, tetapi saya akan menguraikan solusi untuk MySQL dan proses serupa ada dengan PostgreSQL dan lainnya.

Sebagian besar metode yang tercakup di atas berfungsi tanpa modifikasi tambahan. Namun, alih-alih menyimpan file SQLite di kontrol versi Anda, Anda harus menggunakan mysqldump (atau pg_dump untuk PostgreSQL) untuk mengekspor file SQL dari database mana pun yang memiliki konten yang ingin Anda gunakan untuk pengalaman demo Anda. File ini juga harus disimpan di kontrol versi Anda.

Satu-satunya perubahan pada kode sebelumnya akan ditemukan dalam aksi demos#create . Alih-alih menyalin file SQLite3, tindakan pengontrol akan membuat database baru, memuat file sql ke dalam database itu dan memberikan izin untuk pengguna database jika perlu. Langkah ketiga dalam memberikan akses hanya diperlukan jika pengguna admin database Anda berbeda dengan pengguna yang digunakan aplikasi untuk terhubung. Kode berikut menggunakan perintah MySQL standar untuk menangani langkah-langkah ini:

 def create # database names template_demo_db = default_demo_database new_demo_db = "demo_database_#{Time.now.to_i}" # Create database using admin credentials # In this example the database is on the same server so passing a host argument is not require `mysqladmin -u#{ ENV['DB_ADMIN'] } -p#{ ENV['DB_ADMIN_PASSWORD'] } create #{new_demo_db}` # Load template sql into new database # Update the path if it differs from where you saved the demo_template.sql file `mysql -u#{ ENV['DB_ADMIN'] } -p#{ ENV['DB_ADMIN_PASSWORD'] } #{new_demo_db} < db/demo_template.sql` # Grant access to App user (if applicable) `mysql -u#{ ENV['DB_ADMIN'] } -p#{ ENV['DB_ADMIN_PASSWORD'] } -e "GRANT ALL on #{new_demo_db}.* TO '#{ ENV['DB_USERNAME'] }'@'%';"` # set session for new db session[:demo_db] = new_demo_db # Optional: login code (if applicable) # add your own login code or method here login(User.first) redirect_to dashboard_path end

Ruby, seperti banyak bahasa lain termasuk PHP, memungkinkan Anda menggunakan backticks untuk menjalankan perintah shell (yaitu, `ls -a` ) dari dalam kode Anda. Namun, Anda harus menggunakan ini dengan hati-hati dan memastikan tidak ada parameter atau variabel yang menghadap pengguna yang dapat dimasukkan ke dalam perintah untuk melindungi server Anda dari kode yang disuntikkan secara berbahaya. Dalam contoh ini, kita secara eksplisit berinteraksi dengan alat baris perintah MySQL, yang merupakan satu-satunya cara untuk membuat database baru. Ini adalah cara yang sama kerangka kerja Ruby on Rails membuat database baru. Pastikan untuk mengganti ENV['DB_ADMIN'] dan ENV['DB_ADMIN_PASSWORD'] dengan variabel lingkungan Anda sendiri atau cara lain untuk menyetel nama pengguna basis data. Anda perlu melakukan hal yang sama untuk ENV['DB_USERNAME'] jika pengguna admin Anda berbeda dengan pengguna untuk aplikasi Anda.

Hanya itu yang diperlukan untuk beralih ke MySQL! Keuntungan yang paling jelas dari solusi ini adalah Anda tidak perlu khawatir tentang potensi masalah yang mungkin muncul dari sintaks yang berbeda antara sistem database.

Akhirnya, keputusan akhir dibuat berdasarkan kualitas dan layanan yang diharapkan, bukan kenyamanan dan kecepatan, dan tidak selalu dipengaruhi oleh titik harga saja.

Pikiran Akhir

Ini hanyalah titik awal untuk apa yang dapat Anda lakukan dengan server demo baru Anda. Misalnya, situs web pemasaran Anda dapat memiliki tautan ke "Cobalah fitur XYZ". Jika Anda tidak memerlukan nama atau email, Anda dapat menautkan metode demos#create dengan tautan seperti /demos/?feature=xyz dan tindakan hanya akan mengarahkan ulang ke fitur dan/atau halaman yang diinginkan, bukan dasbor di contoh di atas.

Juga, jika Anda menggunakan SQLite untuk lingkungan pengembangan dan demo, selalu memiliki database sampel ini dalam kontrol versi akan memberi semua pengembang Anda akses ke database bersih untuk digunakan dalam pengembangan lokal, lingkungan pengujian, atau pengujian jaminan kualitas. Kemungkinannya tidak terbatas.

Anda dapat mengunduh demo yang sudah selesai dari GitHub.