You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -56,21 +58,75 @@ IQPS was originally created by [Shubham Mishra](https://github.com/grapheo12) in
56
58
> Currently in active development. Get involved at our [Slack](https://slack.metakgp.org/).
57
59
58
60
## Development
61
+
59
62
1. Clone this repository.
60
63
2. For starting the backend:
61
-
- Change directory to backend `cd backend`
62
-
- Make the env file by copying the template: `cp .env.template .env`
63
-
- Fill the env variable and set `DB_HOST=localhost` for running locally for development
64
-
- Start the DB by running `docker compose -f docker-compose.dev.yaml up -d`
65
-
- Start the Rust backend by running `cargo run .`
64
+
- Change directory to backend `cd backend`
65
+
- Make the env file by copying the template: `cp .env.template .env`
66
+
- Fill the env variables and set `DB_HOST=localhost` for running locally for development (see [Environment Variables](#environment-variables)). Make sure to create corresponding folders for `STATIC_FILE_STORAGE_LOCATION`, `UPLOADED_QPS_PATH`, and `LIBRARY_QPS_PATH`.
67
+
- Set up the database (see [Database](#database))
68
+
- Start the Rust backend by running `cargo run .`
66
69
3. Set up the frontend by running `pnpm install` and then `pnpm start` in the `frontend/` directory.
67
70
4. Profit.
68
71
72
+
### Database
73
+
74
+
To initialise the database for the first time:
75
+
76
+
1. Set environment variables for Postgres in the `.env` file.
77
+
2. Start the database by running `docker compose -f docker-compose.dev.yaml up -d`.
78
+
3. Initialise the database:
79
+
- Open a shell in the docker container by running `docker compose -f docker-compose.dev.yaml exec database-dev bash`.
80
+
- Connect to the database by running `psql -U $POSTGRES_USER -d $POSTGRES_DB`.
81
+
- Run the queries in `INIT_DB` in [`backend/src/db/queries.rs`](./backend/src/db/queries.rs) to initialise the database.
82
+
83
+
To run the pre-initialised database:
84
+
85
+
1. Start the database by running `docker compose -f docker-compose.dev.yaml up -d`.
86
+
87
+
For Production:
88
+
89
+
1. Set environment variables for Postgres in the `.env` file.
90
+
2. Start the database by running `docker compose -f docker-compose.yaml up -d`.
91
+
3. Initialise the database:
92
+
- Open a shell in the docker container by running `docker compose -f docker-compose.yaml exec iqps-backend bash`.
93
+
- Connect to the database by running `psql -U $POSTGRES_USER -d $POSTGRES_DB`.
94
+
- Run the queries in `INIT_DB` in [`backend/src/db/queries.rs`](./backend/src/db/queries.rs) to initialise the database.
95
+
96
+
### Authentication
97
+
98
+
IQPS uses GitHub OAuth for authentication to the `/admin` page. To set up authentication:
99
+
100
+
1. Create a new OAuth app on GitHub.
101
+
- Go to https://github.com/settings/developers and create a new OAuth app.
102
+
- Set the Homepage URL to `http://localhost:5173` and Authorization callback URL to `http://localhost:5173/oauth`.
103
+
- Once created, generate a client secret. Copy the client ID and secret into the `.env` file.
104
+
2. Set the Authentication environment variables in the `.env` file.
105
+
106
+
For Production:
107
+
108
+
1. Create a new OAuth app on GitHub. (Should be from the same GitHub account as the organization)
109
+
- Go to https://github.com/settings/developers and create a new OAuth app.
110
+
- Set the Homepage URL to `<prod-url>` and Authorization callback URL to `<prod-url>/oauth`.
111
+
- Once created, generate a client secret. Add the client ID and secret to environment variables.
On visiting `/admin`, if the user is not logged in, they get redirected to the GitHub OAuth page. After the user logs in, GitHub redirects them back to our `/oauth` endpoint with a code. The backend then uses this code to fetch an access token and username. The username is then checked against the allowed admins. If so, a JWT token is generated with the user's username and sent back to the frontend. The frontend then stores this token in local storage and sends it with every request to the backend. The backend verifies this token and allows access to admin functions.
119
+
120
+
A user is considered as an admin if they are a part of the team `GH_ORG_TEAM_SLUG` in `GH_ORG_NAME`, or if their username is in the `GH_ADMIN_USERNAMES` list.
121
+
69
122
### Crawler
123
+
70
124
[WIP: Steps to locally set up crawler]
71
125
72
126
## Deployment
127
+
73
128
### Backend
129
+
74
130
0. Set up [MetaPloy](https://github.com/metakgp/metaploy)**for production**.
75
131
1. Clone this repository at a convenient location such as `/deployments`.
76
132
2.`cd backend/`
@@ -79,24 +135,31 @@ IQPS was originally created by [Shubham Mishra](https://github.com/grapheo12) in
79
135
5. Optionally set up a Systemd service to start the wiki on startup or use this [deployment github workflow](./.github/workflows/deploy.yaml).
80
136
81
137
### Environment Variables
138
+
82
139
Environment variables can be set using a `.env` file. Use the `.env.template` files for reference. See `backend/src/env.rs` for more documentation and types.
83
140
84
141
#### Backend
142
+
85
143
##### Database (Postgres)
144
+
86
145
-`DB_NAME`: Database name
87
146
-`DB_HOST`: Database hostname (eg: `localhost`)
88
147
-`DB_PORT`: Database port
89
148
-`DB_USER`: Database username
90
149
-`DB_PASSWORD`: Database password
91
150
92
151
##### Authentication
152
+
93
153
-`GH_CLIENT_ID`: Client ID of the Github OAuth app.
94
154
-`GH_CLIENT_SECRET`: Client secret of the Github OAuth app.
95
155
-`GH_ORG_NAME`: The name of the Github organization of the admins.
96
156
-`GH_ORG_TEAM_SLUG`: The URL slug of the Github org team of the admins.
157
+
-`GH_ORG_ADMIN_TOKEN`: Github token of organization admin (with `read:org` scope).
158
+
-`GH_ADMIN_USERNAMES`: Comma separated list of Github usernames of the admins. (other than the org team members)
97
159
-`JWT_SECRET`: A secret key/password for JWT signing. It should be a long, random, unguessable string.
98
160
99
161
##### Configuration
162
+
100
163
-`MAX_UPLOAD_LIMIT`: Maximum number of files that can be uploaded at once.
101
164
-`LOG_LOCATION`: The path to a local logfile.
102
165
-`STATIC_FILES_URL`: The URL of the static files server. (eg: `https://static.metakgp.org`)
@@ -107,11 +170,11 @@ Environment variables can be set using a `.env` file. Use the `.env.template` fi
107
170
-`CORS_ALLOWED_ORIGINS`: A comma (,) separated list of origins to be allowed in CORS.
108
171
109
172
#### Frontend
173
+
110
174
-`VITE_BACKEND_URL`: The IQPS backend URL. Use `http://localhost:8080` in development.
111
175
-`VITE_MAX_UPLOAD_LIMIT` The maximum number of files that can be uploaded at once. (Note: This is only a client-side limit)
112
176
-`VITE_GH_OAUTH_CLIENT_ID` The Client ID of the Github OAuth app.
0 commit comments