2012-10-10 19 views
8

मैं Sqlite3 का उपयोग करके कार्यों को शेड्यूल करने के लिए delayed_job का उपयोग करने का प्रयास कर रहा हूं, और ऐसा लगता है कि अपाचे मेरी production.sqlite3 फ़ाइल को पढ़ने में सक्षम नहीं है।रेल: SQLite3 :: CantOpenException: डेटाबेस फ़ाइल को खोलने में असमर्थ

यहाँ मेरी database.yml:

ActiveRecord::StatementInvalid (SQLite3::CantOpenException: unable to open database file:) 

मैं RAILS_ENV=production rake db:create और RAILS_ENV=production rake db:migrate चलाने:

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

यहाँ त्रुटि मैं (लॉग/production.log में) हो रही है है। db/production.sqlite3 फ़ाइल मौजूद है, और डीबी निर्देशिका और उसके सभी सबफ़ोल्डर का स्वामित्व apache:apache है, जो अपाचे के रूप में चलता है। मैं अमेज़ॅन ईसी 2 पर फ़्यूज़न पैसेंजर का उपयोग कर रहा हूं।

+0

मैंने पोस्टग्रेएसक्यूएल का उपयोग करने के लिए स्विच किया और यह ठीक चल रहा है। मुझे अभी भी पता नहीं क्यों SQLite 3 काम नहीं किया। – rdasxy

+0

कभी पता क्यों? – digitalWestie

+0

नहीं। मैंने पोस्टग्रेएसक्यूएल को छोड़ दिया और स्विच किया। – rdasxy

उत्तर

8

SQLLite रेल प्रक्रिया निर्देशिका पेड़ के भीतर एक सिस्टम फ़ाइल को लिखने के द्वारा काम करता है। रेल प्रक्रिया का स्वामित्व अपाचे है, जो डिफ़ॉल्ट रूप से उपयोगकर्ता "अपाचे" और समूह "अपाचे" सेट करता है। इसे काम करने के लिए आपको /db निर्देशिका पर अपाचे उपयोगकर्ता या समूह को लिखने की अनुमति देना होगा।

या

कॉन्फ़िगर अपाचे एक समूह पहले से ही निर्देशिका में write अनुमतियाँ होने के साथ चलाने के लिए। एक अच्छी रणनीति विभिन्न प्रक्रियाओं के समूह को बनाने के लिए है जो विभिन्न स्थानों तक पहुंच की आवश्यकता हो सकती है - उदाहरण के लिए मेरे पास एक "नियोक्ता" समूह है जो उपयोगकर्ता रिलीज कर रहा है, अपाचे उदाहरण के साथ-साथ। मैं आम तौर पर है कि एक समूह है कि विभिन्न प्रक्रिया और प्रवेश उन का हिस्सा हैं होने (सर्वर लॉग को देख के लिए उदाहरण के लिए) जीवन को आसान बनाता मिल जाए, अपलोड या संचित फ़ाइलें, आदि

और/या

उपयोग एक लेखन वास्तविक डेटाबेस सर्वर जैसे PostgreSQL या MySQL - वे काम करते हैं क्योंकि वे अपनी स्वयं की प्रक्रियाएं हैं जो अपनी फाइलें प्रबंधित करते हैं। रेल प्रक्रिया (अपाचे, आपके मामले में) यूनिक्स पोर्ट पर डेटाबेस सर्वर प्रक्रिया से जुड़ती है। प्रत्येक सर्वर प्रक्रिया सुरक्षित रूप से केवल उन फ़ाइलों को प्रबंधित करती है जो इसके बारे में जानते हैं।

SQLLite शुरू करने के लिए ठीक है - सुपर आसान और कम ओवरहेड, लेकिन बहुत जल्द आपको उत्पादन पर एक नियमित डेटाबेस सर्वर चलाने की आवश्यकता होगी। और फिर आपको जल्द ही पता चलेगा कि SQLLite और अन्य के बीच चीजें बिल्कुल समान नहीं हैं, इस बिंदु पर आपको बस अपनी dev मशीन पर एक ही डेटाबेस सर्वर स्थापित करना चाहिए।

+0

मैं ऐसा करने के लिए गया (एक मणि के 'परीक्षण' फ़ोल्डर में एक डमी ऐप पर) और पाया कि 'db /' पूरी तरह से गायब था। 'mkdir डीबी' यह मेरे लिए तय किया। – PJSCopeland

3

यह क्योंकि nginx www-डेटा उपयोगकर्ता बनाने के लिए, और इस उपयोगकर्ता एक previlegues sqlite3 फ़ाइल और अपने अनुप्रयोग को पढ़ने के लिए नहीं है है ...

आप आदेशों को चलाने की जरूरत है:

1. sudo chown -R www-data:www-data rails_project/

2. sudo chmod -R 777 rails_project/

और जांचें कि आप अपने ऐप को उत्पादन मोड में लात मारते हैं।

+0

यह एक पूर्ण सुरक्षा विफल है, कृपया ** उत्पादन सर्वर में अपनी फ़ाइलों को कभी भी 'chmod 777' न करें। @ टोम हैरिसन जूनियर उत्तर पढ़ें। – jperelli

+0

@jperelli 644? – bmalets

-1

इस समस्या में एक ऐप में भाग लें जहां सब कुछ रूट के स्वामित्व में है।

यहां बताया गया है कि मैं कैसे हल हो गया।

[email protected]:/var/www/auth_whateveryousay# chmod -R 0777 db/ 


[email protected]:/var/www/auth_whateveryousay# ls -lad * 
drwxr-xr-x 11 root root 4096 Nov 27 17:23 app 
drwxr-xr-x 2 root root 4096 Nov 27 17:23 bin 
drwxr-xr-x 5 root root 4096 Nov 27 17:23 config 
-rw-r--r-- 1 root root 130 Nov 27 17:23 config.ru 
drwxrwxrwx 3 root root 4096 Nov 27 17:33 db 
-rw-r--r-- 1 root root 879 Nov 27 17:23 Gemfile 
-rw-r--r-- 1 root root 6367 Nov 27 17:24 Gemfile.lock 
drwxr-xr-x 4 root root 4096 Nov 27 17:23 lib 
drwxr-xr-x 2 root root 4096 Nov 27 17:25 log 
drwxr-xr-x 2 root root 4096 Nov 27 17:23 public 
-rw-r--r-- 1 root root 227 Nov 27 17:23 Rakefile 
-rw-r--r-- 1 root root 898 Nov 27 17:23 README 
-rw-r--r-- 1 root root 26632 Nov 27 17:23 README.textile 
drwxr-xr-x 6 root root 4096 Nov 27 17:23 spec 
drwxrwxrwx 5 root root 4096 Nov 27 17:25 tmp 
drwxr-xr-x 3 root root 4096 Nov 27 17:23 vendor 

नीचे पंक्ति है: इस premssions मुद्दा है और आप आप सिर्फ इतना है कि उपयोगकर्ता पढ़ सकते हैं और पर लिखने देने के लिए की आवश्यकता होगी, यह सुनिश्चित करें कि जो कोई भी मालिक एप्लिकेशन यह जड़ या गैर जड़ हो मौसम करने की आवश्यकता होगी डेटाबेस का उपयोग chmod -R 0777 db/ किया जा रहा है। अपने स्वयं के सुरक्षा स्तर फिट करने के लिए इसे ट्वीक करें।

+0

यह एक पूर्ण सुरक्षा विफल है, कृपया ** उत्पादन सर्वर में अपनी फ़ाइलों को कभी भी 'chmod 777' न करें। @ टोम हैरिसन जूनियर उत्तर पढ़ें। – jperelli

+0

@jperelli प्रतिक्रिया के लिए धन्यवाद - यहां बिंदु यह है कि हमें केवल प्रभावित फ़ोल्डर "डीबी" पर अनुमतियों को बदलने की आवश्यकता है, न कि संपूर्ण ऐप-फ़ोल्डर "रेल परियोजना"। उत्तर के अंत में, मैंने उल्लेख किया है कि "अपने स्वयं के सुरक्षा स्तर को फिट करने के लिए इसे ट्वीक करें" जिसका अर्थ है कि आपने जो कहा है। – zee

+0

ठीक है, कृपया अपने उत्तर में पहले सुरक्षा पर जोर दें, इसलिए लोगों को आपके समाधान को लागू करते समय सावधान रहना चाहिए। – jperelli