Κατηγορίες
tech

Κοινές ρυθμίσεις Βάσης Δεδομένων για localhost, heroku, flyio κ.α.

Ο τρόπος που μπορούμε να ρυθμίσουμε την web εφαρμογή μας να χρησιμοποιεί την βάση δεδομένων, έτσι ώστε να μην χρειαστούν αλλαγές μετά την ολοκλήρωσή της.

Δραστηριότητες ανάπτυξης κώδικα. Εικόνα: Wikipedia CC BY-SA

Κατά την ανάπτυξη μιας διαδικτυακής εφαρμογής, είναι συνηθισμένο να εργαζόμαστε στον τοπικό μας υπολογιστή με την τοπική μας βάση δεδομένων. Όταν η εφαρμογή ολοκληρωθεί την βάζουμε σε έναν διαδικτυακό εξυπηρετητή, κάνοντας την διαθέσιμη στους τελικούς χρήστες της εφαρμογής, διαδικασία που είναι γνωστή ως deployment.

Υπάρχουν πολλές διαφορετικές προσεγγίσεις σχετικά με το είδος deployment που θα επιλέξουμε, όπως ένας ιδιόκτητος εξυπηρετητής σε δικές μας εγκαταστάσεις, ένας νοικιασμένος εξυπηρετητής για αποκλειστική δική μας χρήση, ένας ιδεατός νοικιασμένος εξυπηρετητής (VPS), ή μία εξειδικευμένη υπηρεσία με εξυπηρετητή εφαρμογών, όπως είναι το heroku.com και το fly.io.

Είναι λοιπόν λογικό να θέλουμε να δημιουργήσουμε την εφαρμογή μας με τέτοιο τρόπο, ώστε όταν ολοκληρωθεί να μην χρειαστεί να κάνουμε αλλαγές ανάλογα με το που θα γίνει το deployment. Αυτές οι αλλαγές συνήθως περιλαμβάνουν ρυθμίσεις σχετικές με την ασφάλεια και την βάση δεδομένων που χρησιμοποιούμε.

Κοινές ρυθμίσεις

Ας υποθέσουμε ότι σε ένα εγχείρημα δημιουργίας μιας web εφαρμογής, χρησιμοποιούμε την Nodejs ως περιβάλλον για να κατασκευάσουμε την εφαρμογή μας, την PostgreSQL ως βάση δεδομένων και την Sequelize ως ORM.

Για να είναι όσο το δυνατόν κοινός ο τρόπος που ορίζουμε τις παραμέτρους σύνδεσης με την βάση δεδομένων, είτε στον τοπικό μας υπολογιστή είτε σε απομακρυσμένους εξυπηρετητές όπως αναφέρθηκε παραπάνω, είναι βολικό να χρησιμοποιήσουμε τα παρακάτω:

  • Δημιουργία αρχείου .env που περιέχει τον ορισμό δύο μεταβλητών περιβάλλοντος. Αυτό το αρχείο δεν πρέπει ποτέ να το διαθέτουμε σε τρίτους γιατί περιέχει ευαίσθητα δεδομένα. Οπότε, για παράδειγμα αν το όνομα της βάσης δεδομένων είναι ourBooks έχουμε:
    • SESSION_SECRET = 'thisisarandomstring!%$#56782'
    • DATABASE_URL = "postgres://username:password@localhost:5432/ourBooks"
  • Στο αρχείο .gitignore, εκτός από τον φάκελο node_modules/, ορίζουμε επίσης το αρχείο .env να μην προστεθεί στο αποθετήριο και άρα να μην προωθείται σε απομακρυσμένα αποθετήρια.
    • node_modules/
    • .env
  • Στο αρχείο app.mjs κάνουμε εισαγωγή του πακέτου που χρησιμοποιεί το αρχείο .env και χρησιμοποιούμε την μεταβλητή περιβάλλοντος SESSION_SECRET γράφοντας process.env.SESSION_SECRET όπου χρειάζεται π.χ.
    • import 'dotenv/config'
    • const myBooksSession = session({
    •      secret: process.env.SESSION_SECRET, … κλπ
  • Στο αρχείο config.mjs χρησιμοποιούμε την process.env.DATABASE_URL ώστε να ληφθεί η τιμή από το αρχείο env και να εισαχθεί στο τρέχον σημείο π.χ.
    • const sequelize = new Sequelize(process.env.DATABASE_URL,
    •      { dialect: 'postgres',
    •          logging: false,
    •          define: { timestamps: false, freezeTableName: true } );

Με τις παραπάνω ρυθμίσεις δεν χρειάζεται να κάνουμε καθόλου αλλαγές στον κώδικά μας, ανεξάρτητα με το αν θα τον χρησιμοποιήσουμε τοπικά, στο heroku ή στο flyio.

Επιπλέον

Στον εξυπηρετητή της υπηρεσίας φιλοξενίας, χρειάζεται να κάνουμε κάποια επιπλέον βήματα, τα οποία υλοποιούνται διαφορετικά σε κάθε εξυπηρετητή, ώστε:

  • α. να επιβεβαιώσουμε ότι δημιουργήθηκε αυτόματα η μεταβλητή DATABASE_URL
  • β. να δημιουργήσουμε την μεταβλητή SESSION_SECRET

Σημειώσεις

  • Για το heroku χρειάζεται να έχουμε στο τοπικό μας αποθετήριο το αρχείο Procfile με περιεχόμενο web: node app.mjs και το deployment γίνεται με git push.
  • Για το flyio πρέπει να έχουμε εγκατεστημένο το εργαλείο flyctl, με το οποίο γίνεται τόσο η δημιουργία κατάλληλου πακέτου και όσο και το deployment.

Αν αυτό το άρθρο σας φάνηκε ενδιαφέρον, ίσως θα θέλατε να δείτε περισσότερα άρθρα τεχνολογίας.