Form groups and submit project proposals for your software engineering group project, all in one platform.
π Students
- π© Create groups
- β Manage group members
- β Apply to join groups
- π Edit & submit project proposals
π Administrators
- β° Set deadlines
- β Import students
- π§ Set group size limits
- π View reports (grouping/proposal status of students and groups)
- π Allocate groups for ungrouped students
- β Approve/Reject proposals
- π¦ Archive the current semester & start a new one
π‘ Everyone
- π¬ Comment on the proposal
- β Add groups to favorite
- π€ Edit bio
- π Change password
π TODO
- πΌ Showcase project results
- πΊ Explore projects of archived semesters
- π Receive & view notifications
-
π At the start of the semester
This is the time for the administrators to set the deadlines and group size limits of the semester in the
Semester Tools
. Students can be imported by clicking theImport Students
button and uploading a file in the same format as the sample student list. The initial passwords of the students can be downloaded by clicking theDownload Student Credentials
button. Students can change their passwords once they've logged in using the initial passwords. -
π’ Before the grouping deadline
This is the time for the students to form groups. A student can either choose to create a group or apply to a group. The grouping status of each student can be viewed by the administrators by downloading the
student report
on theReports
page. -
π Before the proposal deadline (After the grouping deadline)
This is the time for the students to work on and refine their project proposals. Once a group is satisfied with its proposal, the group owner can submit it. Administrators can allocate groups for the ungrouped students. They can also visit different groups and comment on their current proposals.
-
π― After the proposal deadline
This is the time for the administrators to review the submitted proposals. For each submitted proposal, they can either accept it or reject it. If the proposal is rejected, the group will be given the chance to edit and resubmit the proposal without penalties. However, if a group did not submit their proposal, or they made a late submission, their late status will be shown on their group's page and also on the
group report
available to the administrators. -
π After the semester
This is the time for the administrators to archive the semester in the
Semester Tools
and perhaps plan for the new semester.
The project is docker ready, using docker-compose for deployment by default.
Dockerfiles are located at src/docker/
.
The project deployment is tested under Ubuntu 20.04, and the use of a Linux server is recommended.
Install docker on the production server by following the official guide Get Docker.
The project uses GitHub Actions for continuous integration
On the GitHub repository page, navigate to Settings > Secrets
Add the following secrets:
name | content | example |
---|---|---|
ADMIN_USERNAME | admin user name, must be in email format | [email protected] |
ADMIN_PASSWORD | admin initial password | foo |
MYSQL_DATABASE | database name | gms |
MYSQL_USER | mysql username | gms |
MYSQL_PASSWORD | mysql user password | buz |
MYSQL_ROOT_PASSWORD | mysql root password | bar |
JWT_PUBKEY | public key for JWT | -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- |
JWT_KEY | private key for JWT | -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- |
DOMAIN_CERT_FULLCHAIN | TLS certificate for the site | -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- |
DOMAIN_CERT_KEY | TLS key file | -----BEGIN EC PARAMETERS----- ... -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- ... -----END EC PRIVATE KEY----- |
SSH_KEY | private key of the remote host | -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- |
SSH_USER_HOST | username and hostname for ssh connection | [email protected] |
Navigate to Actions > Workflows > CI, click run workflow.
Place the JWT keypair at src/backend/config/jwt/
and overwrite the example file.
The default algorithm for the key is RS256, and can be generated by the following commands:
ssh-keygen -t rsa -b 4096 -m PEM -f jwt.key
# Don't add passphrase
openssl rsa -in jwt.key -pubout -outform PEM -out jwt.key.pub
For security reason, do NOT use the example keypair in the production environment.
Backend configuration file: src/backend/config/app_config.yml
Please refer to the inline comment for explanations
In src/docker/config/docker-compose.yml
:
- Set the value of
MYSQL_ROOT_PASSWORD
MYSQL_USER
MYSQL_PASSWORD
MYSQL_DATABASE
In src/backend/config/app_config.yml
:
- Set the value of
mysql_host
to "mysql", which is the container name set indocker-compose.yml
- Set the value of
mysql_database
,mysql_user
,mysql_password
to the same value as the ones indocker-compose.yml
Place the following files:
- Public cert(NGINX fullchain):
src/docker/config/cert/fullchain.cer
- Private key:
src/docker/config/cert/key.pem
Configuration file: src/docker/config/nginx.conf
Follow the official guide Download node
Follow the official guide Yarn installation
With src/web
as working directory:
yarn install
yarn build
The static web file should be outputted to src/web/dist
Install docker on the local machine by following the official guide Get Docker. Install docker-compose on the local machine by following the official guide Install Compose
docker context create remote ββdocker "host=ssh://production_server"
Confirm settings by using docker ββcontext remote ps
Run in foreground
docker-compose --context remote up
Run with daemon
docker-compose --context remote up -d
To shut down the service
docker-compose --context remote down
Rebuild all image
docker-compose --context remote build
Rebuild image of specific service
docker-compose --context remote build <service>
Rebuild and run
docker-compose --context remote up --force-recreate --build -d
Remove unused images
docker --context remote image prune -a
Use ssh-agent login as a workaround
# In case you get the error 'Could not open a connection to your authentication agent.'
eval "$(ssh-agent)"
ssh-add -k /path/to/server/keyfile
docker context create remote --docker "host=ssh://user@hostname:port"
switch context back and forth:
docker use context remote
docker use context default
In /etc/ssh/sshd_config
of the docker host, set MaxSessions
to 30
In /etc/docker/daemon.json
of the docker host, add "userland-proxy": false
export COMPOSE_PARAMIKO_SSH=1
export COMPOSE_DOCKER_CLI_BUILD=0