Safely configuring PostgreSQL connection information
Sonamu uses PostgreSQL as its database. Database connection information is managed through environment variables to separate it from code and enable different DBs per environment.
Since Sonamu v2, PostgreSQL is officially supported, with migration support from MySQL.
# Startdocker-compose up -d# Stopdocker-compose down
.env.staging
Copy
# Remote databaseDB_HOST=staging-db.mycompany.comDB_PORT=5432DB_USER=myproject_stagingDB_PASSWORD=your-staging-password # At least 32 characters strong passwordDATABASE_NAME=myproject_staging
# High-availability databaseDB_HOST=prod-db-primary.mycompany.comDB_PORT=5432DB_USER=myproject_prodDB_PASSWORD=your-production-password # At least 64 characters very strong passwordDATABASE_NAME=myproject_prod
Sonamu automatically recognizes the environments.production_slave configuration and uses it for read-only queries. See Database Configuration for details.
-- Create userCREATE USER myproject_user WITH PASSWORD 'your-secure-password';-- Grant database permissionsGRANT ALL PRIVILEGES ON DATABASE myproject_dev TO myproject_user;-- Grant schema permissions\c myproject_devGRANT ALL PRIVILEGES ON SCHEMA public TO myproject_user;GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myproject_user;GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myproject_user;
-- ✅ Application user (read/write only)CREATE USER app_user WITH PASSWORD 'your-app-password';GRANT CONNECT ON DATABASE myproject TO app_user;GRANT USAGE ON SCHEMA public TO app_user;GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;-- ✅ Read-only user (analytics/reporting)CREATE USER readonly_user WITH PASSWORD 'your-readonly-password';GRANT CONNECT ON DATABASE myproject TO readonly_user;GRANT USAGE ON SCHEMA public TO readonly_user;GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;-- ❌ Never use SUPERUSER permission-- CREATE USER admin WITH SUPERUSER;
Never give SUPERUSER permissions to production applications! This is a major security risk.
# Direct connection test with psqlpsql "postgresql://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DATABASE_NAME"# On successful connection# myproject_dev=>
ALTER USER myproject_user WITH PASSWORD 'your-new-password';
Copy
# 3. Check pg_hba.conf (Linux)sudo cat /etc/postgresql/16/main/pg_hba.conf# Verify local connection allowed# local all all trust# host all all 127.0.0.1/32 md5