Το αρχείο .env αποθηκεύει μεταβλητές περιβάλλοντος σε απλή μορφή κλειδιού-τιμής και διαχωρίζει τη διαμόρφωση από τον πηγαίο κώδικα της εφαρμογής. Σύμφωνα με το The Twelve-Factor App (2011), η διαμόρφωση πρέπει να διαχωρίζεται αυστηρά από τον κώδικα και τα αρχεία .env έγιναν το πρότυπο αυτής της προσέγγισης. .env File επιτρέπει την αντικατάσταση διαφορετικών τιμών κλειδιών API, URL διακομιστή και σημαιών μεταγλώττισης χωρίς επαναμεταγλώττιση του έργου.
Κύρια σημεία
.env File είναι ένα αρχείο διαμόρφωσης στο οποίο αποθηκεύονται μεταβλητές περιβάλλοντος σε απλή μορφή κειμένου KEY=VALUE. Κάθε γραμμή περιέχει μία μεταβλητή: το όνομα του κλειδιού και την τιμή του διαχωρισμένα με το σύμβολο της ισότητας.
Τα αρχεία .env λύνουν ένα θεμελιώδες πρόβλημα της σύγχρονης ανάπτυξης: διαφορετικά περιβάλλοντα (τοπικό, δοκιμών, παραγωγής) απαιτούν εντελώς διαφορετικές ρυθμίσεις. Το URL του διακομιστή API στο τοπικό μηχάνημα είναι http://localhost:8080, στον διακομιστή παραγωγής — https://api.production.com. Εάν αυτές οι τιμές είναι ενσωματωμένες απευθείας στον κώδικα της εφαρμογής, κάθε μεταγλώττιση για διαφορετικό περιβάλλον απαιτεί τροποποίηση του πηγαίου κώδικα.
Η πρακτική αποθήκευσης της διαμόρφωσης εκτός του κύριου κώδικα της εφαρμογής τυποποιήθηκε στο μανιφέστο The Twelve-Factor App (2011), το οποίο ανέδειξε τις μεταβλητές περιβάλλοντος ως τον μοναδικό σωστό τρόπο διαμόρφωσης της εφαρμογής. Σύμφωνα με την έρευνα JetBrains Developer Ecosystem (2024), πάνω από 67% των προγραμματιστών κινητών χρησιμοποιούν αρχεία .env στα έργα τους.
Για την κινητή ανάπτυξη, το .env δίνει ένα πρόσθετο πλεονέκτημα: οι τιμές αντικαθίστανται στο στάδιο μεταγλώττισης μέσω Gradle (Android) ή xcconfig (iOS), επιτρέποντας τη δημιουργία ξεχωριστών builds για ανάπτυξη, σταδιοποίηση και παραγωγή χωρίς αλλαγή του πηγαίου κώδικα.
Το .env είναι ιδιαίτερα χρήσιμο στην ομαδική εργασία: κάθε προγραμματιστής δημιουργεί το δικό του τοπικό .env με ρυθμίσεις για το περιβάλλον του (διαδρομή προς τοπική βάση δεδομένων, debug κλειδιά API), και οι κοινές ρυθμίσεις καταγράφονται στο .env.example στο αποθετήριο. Αυτό εξαλείφει την κατάσταση όπου μετά από git pull η μεταγλώττιση του προγραμματιστή σπάει λόγω έλλειψης μιας μεταβλητής περιβάλλοντος που δεν γνώριζε. Το νέο μέλος της ομάδας απλώς αντιγράφει το .env.example σε .env και συμπληρώνει τις τοπικές του τιμές.
Η μορφή του .env είναι εξαιρετικά απλή: κάθε γραμμή είναι μία μεταβλητή της μορφής KEY=VALUE. Τα κενά γύρω από το σύμβολο ισότητας συνήθως αγνοούνται, αλλά στις περισσότερες βιβλιοθήκες θεωρούνται μέρος της τιμής, επομένως είναι καλύτερο να αποφεύγονται.
Τα σχόλια ξεκινούν με το σύμβολο # — ολόκληρη η γραμμή μετά από αυτό αγνοείται. Οι κενές γραμμές επίσης παραλείπονται. Εάν η τιμή περιέχει κενά, τοποθετείται σε διπλά ή μονά εισαγωγικά.
# Κύριες ρυθμίσεις περιβάλλοντος
APP_NAME=MyMobileApp
APP_ENV=development
# Διαμόρφωση API
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# Ευαίσθητα δεδομένα
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
Όλες οι μεταβλητές στο .env είναι συμβολοσειρές, αλλά οι βιβλιοθήκες φόρτωσης μπορούν να τις μετατρέψουν στον απαιτούμενο τύπο. Για τη διαφυγή ειδικών χαρακτήρων χρησιμοποιούνται backslash και εισαγωγικά. Εάν η τιμή περιέχει το σύμβολο # ως μέρος του κειμένου, πρέπει να γίνει διαφυγή ως \#.
KEY=value ή KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}Κατά τη φόρτωση του .env, οι βιβλιοθήκες μπορούν να εκτελούν παρεμβολή μεταβλητών — να αντικαθιστούν τιμές ορισμένων κλειδιών μέσα σε άλλα. Για παράδειγμα, η μεταβλητή DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db θα αναπτύξει τα DB_USER και DB_PASS από το ίδιο αρχείο.
Ο τρόπος σύνδεσης του .env εξαρτάται από την πλατφόρμα. Το Android χρησιμοποιεί πρόσθετα Gradle, το iOS — αρχεία διαμόρφωσης xcconfig, και οι λύσεις cross-platform όπως το Flutter — εξειδικευμένες βιβλιοθήκες.
Στο Android, το .env φορτώνεται μέσω του πρόσθετου gradle-dotenv. Το πρόσθετο διαβάζει το .env από τη ρίζα του έργου και προσθέτει τιμές στο BuildConfig, μετά από το οποίο είναι διαθέσιμες στον κώδικα Kotlin ή Java μέσω παραγόμενων πεδίων.
// build.gradle.kts (app level)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// Πρόσβαση στον κώδικα: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
Στο iOS, οι μεταβλητές περιβάλλοντος συνήθως ρυθμίζονται μέσω αρχείων xcconfig. Για τη φόρτωση του .env στο Swift χρησιμοποιείται η βιβλιοθήκη DotEnv ή ο ενσωματωμένος μηχανισμός Info.plist με προσαρμοσμένα κλειδιά.
// Φόρτωση .env σε έργο Swift
import DotEnv
struct AppConfig {
static func load() {
let env = DotEnv(Bundle.main)
env.load()
let apiURL = ProcessInfo.processInfo
.environment["API_BASE_URL"] ??
"https://default.api.com"
}
}
Για το Flutter υπάρχει το πακέτο flutter_dotenv που φορτώνει μεταβλητές από το .env κατά την αρχικοποίηση της εφαρμογής. Το αρχείο .env τοποθετείται στη ρίζα του έργου και οι μεταβλητές γίνονται διαθέσιμες μέσω της κλάσης dotenv.
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — φόρτωση κατά την εκκίνηση
import 'package:flutter_dotenv/flutter_dotenv.dart';
void main() async {
await dotenv.load(fileName: '.env');
var apiUrl = dotenv.get('API_BASE_URL');
runApp(MyApp(baseUrl: apiUrl));
}
Και οι τρεις προσεγγίσεις μοιράζονται μια κοινή αρχή: το .env φορτώνεται στο στάδιο μεταγλώττισης ή κατά την εκκίνηση της εφαρμογής, οι τιμές αποθηκεύονται προσωρινά και χρησιμοποιούνται στον κώδικα μέσω παραγόμενων σταθερών. Αυτό αποκλείει την είσοδο ευαίσθητων δεδομένων στο αποθετήριο.
Για το React Native χρησιμοποιείται το πακέτο react-native-config, το οποίο στο στάδιο μεταγλώττισης δημιουργεί αυτόματα την κλάση BuildConfig για Android και σταθερές στο Info.plist για iOS από ένα αρχείο .env στη ρίζα του έργου. Αυτό είναι ιδιαίτερα βολικό για startups που χρησιμοποιούν Expo ή bare workflow: ένα .env στο επίπεδο ρίζας είναι αρκετό και όλες οι πλατφόρμες λαμβάνουν τις ίδιες μεταβλητές περιβάλλοντος χωρίς διπλασιασμό διαμορφώσεων.
Παρά όλα τα πλεονεκτήματα, το .env δεν είναι μια ολοκληρωμένη λύση για την αποθήκευση μυστικών σε περιβάλλον παραγωγής. Παρέχει βασικό επίπεδο προστασίας, αλλά σε λανθασμένη χρήση μπορεί να οδηγήσει σε διαρροή εμπιστευτικών δεδομένων.
Ο πιο σημαντικός κανόνας — το .env δεν πρέπει ποτέ να καταλήξει στο σύστημα ελέγχου εκδόσεων. Το αρχείο προστίθεται στο .gitignore αμέσως μετά τη δημιουργία και μόνο το αρχείο-δείγμα .env.example με κενές ή πλασματικές τιμές γίνεται commit στο αποθετήριο.
# .env.example — commit στο αποθετήριο
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — μην αναφέρετε ούτε στο παράδειγμα!
# JWT_SECRET — μην αναφέρετε ούτε στο παράδειγμα!
# .gitignore
# Αρχεία Dotenv
.env
.env*.local
Για έργα παραγωγής συνιστάται η χρήση επαγγελματικών λύσεων διαχείρισης μυστικών. .env σε παραγωγή επιτρέπεται μόνο εάν το αρχείο βρίσκεται εκτός του document-root του διακομιστή και έχει αυστηρά δικαιώματα πρόσβασης.
Σύμφωνα με το Snyk State of Open Source Security (2024), η διαρροή αρχείων .env μέσω αποθετηρίων ήταν η αιτία πάνω από 12% όλων των περιστατικών αποκάλυψης κλειδιών API μεταξύ των ερωτηθέντων εταιρειών. Η χρήση ξεχωριστού διαχειριστή μυστικών μειώνει αυτόν τον κίνδυνο στο μηδέν.
Πρόσθετη προστασία επιτυγχάνεται με την εφαρμογή pre-commit hooks χρησιμοποιώντας εργαλεία όπως husky και lint-staged, τα οποία ελέγχουν αν ο προγραμματιστής πρόσθεσε κατά λάθος το .env στο commit. Εργαλεία όπως git-secrets (AWS) και talisman σαρώνουν κάθε commit για μοτίβα κλειδιών API, token και κωδικών πρόσβασης, μπλοκάροντας το commit σε περίπτωση ανίχνευσης. Για αγωγούς CI συνιστάται η προσθήκη ελέγχου detect-secrets — ενός αυτόματου σαρωτή που δεν θα αφήσει το αρχείο .env να εισέλθει στο αποθετήριο ακόμη και σε περίπτωση σφάλματος του προγραμματιστή.
Συχνές Ερωτήσεις
Όχι, το .env δεν πρέπει να γίνεται commit στο Git. Το αρχείο περιέχει ευαίσθητα δεδομένα και πρέπει να προστεθεί στο .gitignore. Αντί αυτού, το .env.example με το πρότυπο όλων των απαραίτητων μεταβλητών τοποθετείται στο αποθετήριο.
.env — το πραγματικό αρχείο με τιμές παραγωγής που δεν γίνεται ποτέ commit. Το αρχείο .env.example περιέχει τα ίδια κλειδιά αλλά με κενές ή πλασματικές τιμές — γίνεται commit στο αποθετήριο ως δείγμα για νέους προγραμματιστές.
Ναι, αλλά δεν συνιστάται χωρίς πρόσθετη προστασία. Εάν το .env χρησιμοποιείται σε διακομιστή παραγωγής, το αρχείο πρέπει να βρίσκεται εκτός του document-root του διακομιστή ιστού με δικαιώματα πρόσβασης 600 (μόνο ιδιοκτήτης). Για κρίσιμα έργα προτιμώνται οι διαχειριστές μυστικών.
Μέσω του πρόσθετου gradle-dotenv (co.uzzu.dotenv). Το πρόσθετο διαβάζει το .env από τη ρίζα του έργου και εξάγει τιμές στο BuildConfig. Οι μεταβλητές γίνονται διαθέσιμες στον κώδικα ως BuildConfig.VARIABLE_NAME στο στάδιο μεταγλώττισης.
Ναι, πολλοί αναλυτές υποστηρίζουν παρεμβολή σε μορφή ${VAR_NAME}. Για παράδειγμα, το URL=${HOST}:${PORT} θα αντικαταστήσει τις τιμές HOST και PORT από το ίδιο αρχείο. Ωστόσο, αυτή η λειτουργία εξαρτάται από τη συγκεκριμένη βιβλιοθήκη φόρτωσης.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης