2012-10-10 27 views
8

Próbuję użyć delayed_job do planowania zadań przy użyciu Sqlite3, i wygląda na to, że apache nie jest w stanie odczytać mojego pliku production.sqlite3.Szyny: SQLite3 :: CantOpenException: nie można otworzyć pliku bazy danych

Oto mój database.yml:

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

Oto Ja dostaję błąd (w log/production.log):

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

Mam biegać RAILS_ENV=production rake db:create i RAILS_ENV=production rake db:migrate. Plik db/production.sqlite3 istnieje, a katalog db i wszystkie jego podfoldery są własnością użytkownika apache:apache, czyli tego, który apache działa jako. Używam Phusion Passenger na Amazon EC2.

+0

Przełączyłem się na używanie PostgreSQL i wygląda na to, że działa dobrze. Wciąż nie wiem, dlaczego SQLite 3 nie działa. – rdasxy

+0

Czy kiedykolwiek dowiedziałeś się, dlaczego? – digitalWestie

+0

Nie. Poddałem się i przełączyłem na PostgreSQL. – rdasxy

Odpowiedz

8

SQLLite działa poprzez zapisanie procesu Rails do pliku systemowego w drzewie katalogów Rails. Proces Railsów jest własnością Apache, który domyślnie ustawia użytkownika "apache" i grupę "apache". Aby to działało, musisz podać uprawnienia do zapisu dla użytkownika lub grupy apache w katalogu /db.

LUB

skonfigurować Apache do pracy z grupą już konieczności write uprawnienia do katalogu. Dobrą strategią jest utworzenie grupy różnych procesów, które mogą wymagać dostępu do różnych lokalizacji - na przykład mam grupę "wdrażających", w której użytkownik wykonałby wydania, wraz z instancją apache. I zwykle okaże się, że mający grupę, która różni użytkownicy procesowe i logowania są częścią ułatwia życie (np patrząc na logi serwera), na piśmie lub przesłane pliki pamięci podręcznej, itp

I/LUB

Użyj prawdziwy serwer baz danych, taki jak PostgreSQL lub MySQL - działają, ponieważ są to własne procesy, które zarządzają własnymi plikami. Proces Railsowy (apache, w twoim przypadku) łączy się z procesem serwera bazy danych na porcie Unix. Każdy proces serwera bezpiecznie zarządza tylko plikami, o których wie.

SQLLite jest w porządku, aby zacząć - bardzo proste i niskie obciążenie, ale wkrótce będziesz musiał uruchomić regularny serwer bazy danych podczas produkcji. A wkrótce przekonasz się, że rzeczy nie są dokładnie takie same między SQLLite i innymi, w którym to momencie powinieneś po prostu zainstalować ten sam serwer bazy danych na swoim komputerze.

+0

Poszedłem to zrobić (w fikcyjnej aplikacji w folderze 'test') i okazało się, że' db/'całkowicie nie istniało. 'mkdir db' naprawił to dla mnie. – PJSCopeland

3

To dlatego nginx utworzyć użytkownika www-data, a użytkownik nie mają previlegues czytać sqlite3 plików i aplikacji ...

Musisz uruchomić komendy:

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

2. sudo chmod -R 777 rails_project/

Sprawdź, czy uruchamiasz swoją aplikację w trybie produkcyjnym.

+0

To jest kompletny błąd bezpieczeństwa, proszę ** NIGDY ** 'chmod 777' swoje pliki na serwerze produkcyjnym. Przeczytaj odpowiedź @Tom Harrison Jr. – jperelli

+0

@jperelli 644? – bmalets

-1

Zrobiłem to w aplikacji, w której wszystko jest własnością root.

Oto jak zostałem rozwiązany.

[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 

Konkluzja brzmi: jest to premssions problem i trzeba się upewnić, że ten, kto jest właścicielem aplikacja pogoda to być korzeń lub non-korzeń, po prostu trzeba dać, że użytkownik odczytu i zapisu na używana baza danych: chmod -R 0777 db/. Popraw to, aby dopasować się do własnego poziomu bezpieczeństwa.

+0

To jest kompletny błąd bezpieczeństwa, proszę ** NIGDY ** 'chmod 777' swoje pliki na serwerze produkcyjnym. Przeczytaj odpowiedź @Tom Harrison Jr. – jperelli

+0

@jperelli dzięki za informację zwrotną - Chodzi o to, że musimy zmienić uprawnienia tylko do folderu "db", a nie do całego folderu aplikacji "Projekt Rails". Pod koniec odpowiedzi wspomniałem: "Dostosuj to do własnego poziomu bezpieczeństwa", co oznacza, co powiedziałeś. – zee

+0

Ok, proszę, połóż nacisk na bezpieczeństwo w twojej odpowiedzi, aby ludzie byli ostrożni przy stosowaniu twojego rozwiązania. – jperelli

Powiązane problemy