2012-10-10 2 views
8

Ich versuche delayed_job zu verwenden, um Aufgaben mit Sqlite3 zu planen, und es sieht so aus, als ob Apache meine production.sqlite3 Datei nicht lesen kann.Rails: SQLite3 :: CantOpenException: Datenbankdatei kann nicht geöffnet werden

Hier ist mein database.yml:

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

Hier ist der Fehler, den ich (in log/production.log) bin immer:

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

Ich habe RAILS_ENV=production rake db:create und RAILS_ENV=production rake db:migrate laufen. Die Datei db/production.sqlite3 existiert, und das Verzeichnis db und alle zugehörigen Unterordner gehören apache:apache, woran apache läuft. Ich benutze Phusion Passenger bei Amazon EC2.

+0

Ich wechselte zu PostgreSQL und es scheint zu laufen gut. Ich weiß immer noch nicht, warum SQLite 3 nicht funktioniert hat. – rdasxy

+0

Haben Sie jemals herausgefunden warum? – digitalWestie

+0

Nein. Ich gab auf und wechselte zu PostgreSQL. – rdasxy

Antwort

8

SQLLite funktioniert, indem der Rails-Prozess in eine Systemdatei innerhalb der Rails-Verzeichnisstruktur schreibt. Der Rails-Prozess gehört Apache, der standardmäßig einen Benutzer "Apache" und eine Gruppe "Apache" setzt. Damit es funktioniert, müssen Sie dem Apache-Benutzer oder der Gruppe im Verzeichnis /db Schreibberechtigungen erteilen.

ODER

Konfigurieren von Apache mit einer Gruppe bereits mit write Berechtigungen für das Verzeichnis auszuführen. Eine gute Strategie besteht darin, eine Gruppe der verschiedenen Prozesse zu erstellen, die möglicherweise Zugriff auf verschiedene Speicherorte benötigen. So habe ich zum Beispiel eine "Deployer" -Gruppe, zu der der Benutzer, der Releases ausführt, sowie die Apache-Instanz gehört. Ich finde die Regel, dass eine Gruppe, die die verschiedenen Verfahren und loggten Benutzer von Teil sind das Leben leichter macht (zB für auf Server-Logs suchen), Uploads oder Cache-Dateien zu schreiben usw.

UND/ODER

Verwenden Sie ein echte Datenbankserver wie PostgreSQL oder MySQL - sie arbeiten, weil sie ihre eigenen Prozesse sind, die ihre eigenen Dateien verwalten. Der Rails-Prozess (in Ihrem Fall Apache) stellt eine Verbindung zum Datenbankserverprozess an einem Unix-Port her. Jeder Serverprozess verwaltet sicher nur die Dateien, die er kennt.

SQLLite ist in Ordnung, um loszulegen - super einfach und wenig Overhead, aber sehr bald müssen Sie einen regulären Datenbankserver auf Produktion laufen lassen. Und dann werden Sie bald feststellen, dass die Dinge zwischen SQLLite und den anderen nicht genau gleich sind. An diesem Punkt sollten Sie einfach denselben Datenbankserver auf Ihrem Dev-Rechner installieren.

+0

Ich ging, um dies zu tun (auf einer Dummy-App in einem Edelstein "Test" -Ordner) und festgestellt, dass 'db /' vollständig fehlt. 'mkdir db' hat es für mich repariert. – PJSCopeland

3

Es ist, weil nginx www-data Benutzer erstellen und diese Benutzer haben keine previlegues sqlite3-Datei und Ihre App zu lesen ...

Sie müssen Befehle ausführen:

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

2. sudo chmod -R 777 rails_project/

Und überprüfen Sie, dass Sie Ihre Anwendung im Produktionsmodus beginnen.

+0

Dies ist ein vollständiger Sicherheitsfehler, bitte ** NEVER ** 'chmod 777' Ihre Dateien auf einem Produktionsserver. Lesen Sie @ Tom Harrison Jr Antwort. – jperelli

+0

@jperelli 644? – bmalets

-1

In diesem Problem in einer App, wo alles von Root gehört.

Hier ist, wie ich gelöst wurde.

[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 

Unterm Strich ist: Das ist premssions Problem und Sie müssen dafür sorgen, dass wer auch immer die App es root oder non-root sein wether besitzt, werden Sie nur, dass Benutzer gelesen und auf den Zugang geben müssen schreiben verwendete Datenbank chmod -R 0777 db/. Passen Sie dies an Ihre eigene Sicherheitsstufe an.

+0

Dies ist ein vollständiger Sicherheitsfehler, bitte ** NEVER ** 'chmod 777' Ihre Dateien auf einem Produktionsserver. Lesen Sie @ Tom Harrison Jr Antwort. – jperelli

+0

@jperelli Danke für das Feedback - Der Punkt hier ist, dass wir nur die Berechtigungen für den betroffenen Ordner "db" ändern müssen und nicht den gesamten App-Ordner "Rails project". Am Ende der Antwort habe ich "Tweak this to your security level" erwähnt, was impliziert, was Sie gesagt haben. – zee

+0

Ok, bitte legen Sie in Ihrer Antwort Wert auf Sicherheit, so dass die Leute sich bewusst sind, dass sie vorsichtig sind, wenn Sie Ihre Lösung anwenden. – jperelli