2012-10-10 16 views
8

Sto provando a utilizzare delayed_job per pianificare le attività utilizzando Sqlite3 e sembra che Apache non sia in grado di leggere il mio file production.sqlite3.Rails: SQLite3 :: CantOpenException: impossibile aprire il file di database

Ecco la mia database.yml:

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

Ecco l'errore che sto ottenendo (in log/production.log):

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

Ho eseguito RAILS_ENV=production rake db:create e RAILS_ENV=production rake db:migrate. Il file db/production.sqlite3 esiste e la directory db e tutte le sue sottocartelle sono di proprietà di apache:apache, che è l'apache che viene eseguito come. Sto usando Phusion Passenger su Amazon EC2.

+0

Sono passato a utilizzare PostgreSQL e sembra funzionare bene. Ancora non so perché SQLite 3 non ha funzionato. – rdasxy

+0

Scopri mai perché? – digitalWestie

+0

No. Mi sono arreso e sono passato a PostgreSQL. – rdasxy

risposta

8

SQLLite funziona facendo in modo che il processo Rails scriva su un file di sistema all'interno della struttura di directory di Rails. Il processo Rails è di proprietà di Apache, che imposta un utente "apache" e un gruppo "apache" per impostazione predefinita. Per farlo funzionare, è necessario fornire autorizzazioni di scrittura all'utente o al gruppo Apache nella directory /db.

O

configurare Apache per l'esecuzione con un gruppo già avendo write autorizzazioni alla directory. Una buona strategia è quella di creare un gruppo di vari processi che possono aver bisogno di accedere a varie posizioni - ad esempio, ho un gruppo "deployer" a cui l'utente che fa le release farebbe parte, insieme all'istanza di apache. Io di solito trovo che avere un gruppo che i vari utenti di processo e di accesso sono parte della semplifica la vita (ad esempio, per guardare i log del server), la scrittura arrivi o file memorizzati nella cache, ecc

E/O

Utilizzare un server di database reali come PostgreSQL o MySQL - funzionano perché sono i propri processi che gestiscono i propri file. Il processo Rails (apache, nel tuo caso) si connette al processo del server database su una porta Unix. Ogni processo del server gestisce in modo sicuro solo i file di cui è a conoscenza.

SQLLite va bene per iniziare: un overhead molto facile e basso, ma molto presto sarà necessario eseguire un normale server di database in produzione. E poi scoprirai presto che le cose non sono esattamente le stesse tra SQLLite e gli altri, a quel punto dovresti semplicemente installare lo stesso server di database sulla tua macchina di sviluppo.

+0

Sono andato a fare questo (su un'app fittizia nella cartella 'test' di una gemma) e ho scoperto che' db/'mancava del tutto. 'mkdir db' l'ha risolto per me. – PJSCopeland

3

È perché nginx creare utente www-data, e questo utente non hanno un previlegues leggere il file sqlite3 e la vostra applicazione ...

È necessario eseguire comandi:

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

2. sudo chmod -R 777 rails_project/

e verificare che a calci la tua app in modalità di produzione.

+0

Si tratta di un errore di sicurezza completo, per favore ** MAI ** 'chmod 777' i tuoi file in un server di produzione. Leggi la risposta @ Tom Harrison Jr. – jperelli

+0

@jperelli 644? – bmalets

-1

Ranellato in questo problema in un'app in cui tutto è di proprietà di root.

Ecco come ho risolto.

[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 

Linea di fondo è: si tratta di problema premssions e sarà necessario fare in modo che chi possiede l'applicazione wether che si tratti di root o non root, sarà sufficiente per dare quell'utente lettura e scrittura sul database utilizzato chmod -R 0777 db/. Modificalo per adattarlo al tuo livello di sicurezza.

+0

Si tratta di un errore di sicurezza completo, per favore ** MAI ** 'chmod 777' i tuoi file in un server di produzione. Leggi la risposta @ Tom Harrison Jr. – jperelli

+0

@jperelli ringrazia per il feedback - Il punto qui è che abbiamo solo bisogno di modificare i permessi sulla cartella "db" e non sull'intera cartella app "Progetto Rails". Alla fine della risposta, ho detto "Tweak this to fit your own security level" che implica ciò che hai detto. – zee

+0

Ok, per favore ponete l'accento sulla sicurezza prima nella vostra risposta, così le persone sono consapevoli di essere cauti nell'applicare la vostra soluzione. – jperelli

Problemi correlati