A website and user system starter based on the fabulous Aqua.
The code has been modified to persist data to an SQL datasource via Sequelize
All feedback is welcome.
Finally a huge thank you to Reza Akhavan for Aqua.
url | username | password |
---|---|---|
https://getaqua.herokuapp.com/ | root | root |
Server side, Aqua is built with the hapi framework. We're using Postgres as a data store.
The front-end is built with React. We use Redux as our state container. Client side routing is done with React Router. We're using Gulp for the build system.
We use bcrypt
for hashing
secrets. If you have issues during installation related to bcrypt
then refer
to this wiki
page.
If you don't use React and/or would rather bring your own front-end, checkout Frame. It's just the HTTP API parts of Aqua.
url | username | password |
---|---|---|
https://aqua-sql.herokuapp.com/ | root | root |
You need Node.js installed and you'll need Postgres installed and running.
We use bcrypt
for hashing
secrets. If you have issues during installation related to bcrypt
then refer
to this wiki
page.
$ git clone git@github.com:jimlowrey/aqua-sql.git
$ cd aqua-sql
$ npm install
Paste the following into PSQL console. The passwords will both be test.
CREATE ROLE aqua LOGIN
ENCRYPTED PASSWORD 'md5febfd8a9585cddd9e4577010f18a0a5c'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION CONNECTION LIMIT 100;
CREATE DATABASE aqua
WITH OWNER = aqua
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'C'
LC_CTYPE = 'C'
CONNECTION LIMIT = -1;
CREATE ROLE aqua_test LOGIN
ENCRYPTED PASSWORD 'md512d23bb09f295a82e5a316755dfdc0ca'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION CONNECTION LIMIT 100;
CREATE DATABASE aqua_test
WITH OWNER = aqua_test
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'C'
LC_CTYPE = 'C'
CONNECTION LIMIT = -1;
Simply edit config.js
. The configuration uses
confidence
which makes it easy to
manage configuration settings across environments. Don't store secrets in
this file or commit them to your repository.
Instead, access secrets via environment variables. We use
dotenv
to help make setting local
environment variables easy (not to be used in production).
Simply copy .env-sample
to .env
and edit as needed. Don't commit .env
to your repository.
WARNING: This will clear all data in the following SQL Tables if
they exist: accounts
, admin_groups
, admins
, auth_attempts
, sessions
,
statuses
, and users
.
$ npm run first-time-setup
# > aqua@0.0.0 first-time-setup /home/jedireza/projects/aqua
# > node first-time-setup.js
# Root user email: jedireza@gmail.com
# Root user password:
# ...
# Setup complete.
$ npm start
# > aqua@0.0.0 start /Users/jedireza/projects/aqua
# > gulp react && gulp
# [23:41:44] Using gulpfile ~/projects/aqua/gulpfile.js
# ...
Now you should be able to point your browser to http://127.0.0.1:8000/ and see the welcome page.
nodemon
watches for changes in server code
and restarts the app automatically. gulp
and
webpack
watch the front-end files and
re-build those automatically too.
We also pass the --inspect
flag to Node so you have a debugger available.
Watch the output of $ npm start
and look for the debugging URL and open it in
Chrome. It looks something like this:
chrome-devtools://devtools/remote/serve_file/@62cd277117e6f8ec53e31b1be58290a6f7ab42ef/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node
$ node server.js
Unlike $ npm start
this doesn't watch for file changes. Also be sure to set
these environment variables in your production environment:
NODE_ENV=production
- This is important for many different optimizations,
both server-side and with the front-end build files.NPM_CONFIG_PRODUCTION=false
- This tells $ npm install
to not skip
installing devDependencies
, which we need to build the front-end files.Any issues or questions (no matter how basic), open an issue. Please take the initiative to read relevant documentation and be proactive with debugging.
Contributions are welcome. If you're changing something non-trivial, you may want to submit an issue before creating a large pull request.
Lab is part of the hapi ecosystem and what we use to write all of our tests.
Tests have been adapted from the original tests to suit Sequelize and Hapi-Sequelize. Some of the originals no longer apply. Some more need to be added.
$ npm test
# > aqua@0.0.0 test /Users/jedireza/projects/aqua
# > lab -t 100 -S -T ./test/lab/transform -L --lint-options '{"extensions":[".js",".jsx"]}' ./test/lab/client-before.js ./test/client/ ./test/lab/client-after.js ./test/server/ ./test/lab/server-after.js ./test/misc/
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ..................................................
# ...............
# 865 tests complete
# Test duration: 6382 ms
# No global variable leaks detected
# Coverage: 96.47%
# Linting results: No issues
If you'd like to run a specific test or subset of tests you can use the
test-client
and test-server
scripts included in the package.json
file.
You specificy the path(s) via the TEST_TARGET
environment variable like:
$ TEST_TARGET=test/server/web/main.js npm run test-server
# or
$ TEST_TARGET=test/client/actions/api.js npm run test-client
MIT
What you build with Aqua is more important than Aqua.