Algocode is a DSA practice platform just like Leetcode!
Read the blog Β» 
Algocode Auth Service .  
Code Manager Service .
RCE Engine Service
Algocode is an online data structure and algorithm practice backend built in microservices architecture.
Algocode currently has three services: Algocode Auth Service . Code Manager Service . and RCE Engine Service
 
- 
Algocode Auth Service Auth Service handles user management.
 - 
Code Manager Service Code Manager Service handles
code submission,code exec event creation to Message Queue, andsaving and caching code executing resultto Database. - 
RCE Engine Service RCE Engine Service contains the
C++code execution Judge. The Judge is completely isolated and it is only accessible usingevents.
RCE Engine service forJava JudgeandPython Judgeare under development.
 
The C++ Judge of RCE Engine  can execute C++  codes and run test cases against the code output. It can currently  handle the below events:
a. AC (Accepted) 
b. WA (Wrong Answer)
c. Compilation Error 
d. Time Limit Exceed 
e. Memory Limit Exceed 
f. Segmentation Fault
A. The C++ Judge in RCE Engine  is a pure docker implementation and no other 3rd party API or service has been used.
Please refer to the respective services to learn more about it. You will find rich and detailed documentation in the respective service's github repository, I promise!
B. Rate Limit Alert
The API endpoint to submit solution to the Algocode platfrom (API in Code Manager Service ) is rate limited to
1 request per 20 seconds.POST https://codemanager.algocode.site/api/v1/code/submit/You can learn more on this in the
API Guideline - Code Submission in Algocodesection.
C. Documentation
All the services have dedicated documentation page. Please visit the respective service repository to learn more.
The Algocode platform is comprised of 3 services.
Algocode Auth Service For user management.
Code Manager Service For interacting with client, data processing and event creation for RCE Engine.
RCE Engine Service For executing the code submitted by the user and produce result for Code Manager Service to consume.
The mentioned RCE Engine is responsible to execute
C++code. The RCE Engine forJavaandPythonis under development.
- 
The access to the Algocode begins from the Auth Service.
 - 
Algocode Auth Service is responsible for user management.
 - 
The user creates an account or logs in into the Algocode platform to complete the authentication/authorization process.
 - 
PostgreSQLdatabase is used for user management. The database isself-hostedand capable ofbackupandrestoredata periodically. 
- 
The Code Manager service is the true manager which is responsible to interact with users to submit the code submission request and return them the answer of their solution.
 - 
The user sends a
POSTrequest to the 
    POST https://codemanager.algocode.site/api/v1/code/submit/API to submit their code solution.
- 
Code Manager verifies the
authenticity of the user,processes the submitted data,publishes the data in a RabbbitMQ instanceand thequeueis based on theprogramming languagethe solution is written, and returns asubmission_idto the client. - 
Code Manager also listens to event produced by RCE Engine. The
RCE Engine executes the solution and publishes the result to an unified result queue. - 
Once message is consumed by Code Manager from
result queue, Code Managercaches the result in Redisand stores the result inMongoDB database. - 
The client can send a
GETrequest to theresult check 
    GET  https://codemanager.algocode.site/api/v1/result/check/<submission_id>/API to get the code execution result. The API is a short polling request for 5 seconds.
- 
The
GETrequest checks thecachefirst for the result, thenchecks in databaseand if the result is still not found, then the API process waits for5 secondsfor availability of the data. - 
If the data is available within the
5 secondswait time, it returns the result, otherwise, the below response will be returned. 
Response Key Type Value/Description statusstringpendingdatastringnull
- 
The RCE Engine comprises either
C++ Judge, orJava Judge, orPython Judge. - 
The RCE Engine consumes messages from respective
queue. Each RCE Engine consumesdatabased on theprogramming languagequeue type i.e. RCE Engine forC++ Judgeconsumes data fromC++ queue. - 
The RCE Engine
processes the consumed data,prepares the data for executionand passes the data to theJudge. - 
The
Judgecreates asecureandunprivilegeddocker container to run the user submitted code. - 
The
Judgestores the output of the code in a file after thecode executionis completed. - 
Once the
code executionby theJudgeis completed, the RCE Enginecompares the output with testcases. - 
After the
output comparison with testcases, the RCE Engine formats theresult dataandpublish the result datato an unifiedresult queuein aRabbitMQinstance which is consumed byCode Manager Service. - 
In case, you want to learn more about the
Judge Engine, please check Online Judge - a light-weight solution to test the Judge locally. 
- Watch from 
16:30for code execution begin and18:30for code submission result. 
- Watch from 
09:30for code execution begin and11:30for code submission result. 
Code Manager Service  is deployed on AWS EC2 in Ubuntu 22.04 server.  
Algocode Auth Service  and RCE Engine Service are deployed on Azure VM in Ubuntu 22.04 server.
The DNS for the platform www.algocode.site is hosted on Cloudflare.
1. Proxy and Monitoring:
a. Nginx as webserver.
b. Nginx Proxy Manager to manage Nginx.
c. Portainer to manage and monitor docker container in Auth Service.
2.  Backend and Server:
b. Gunicorn as application server.
e. Celery to process tasks asynchronously.
f. Flower to monitor celery worker.
g. Resend for email service.
h. Django as backend.
i. Django Rest Framework for API.
3. Databases and Cache:
j. PostgreSQL for user management database.
k. MondoDB for code execution result backend.
l. Redis for celery backend and cache.
4. Containerization and Code Execution:
m. Docker for containerization. 
n. Sibling Docker for secure foreign code execution.
o. RabbitMQ for asynchronous processing. 
p. Rate Limit (Token Bucket Algorighm, Django Middleware) for rate limit code submission API.
5. Deployment and Testing:
q. AWS EC2 instance for deployment
r. Cloudflare for DNS hosting. 
s. Postman for API testing.
As of today I have built the backend in microservices, there's no frontend for the project. I am fully focusing on the advanced backend engineering, hence, if you want to contribute or want to build a frontend for the project, please do not hesitate to email me here:
I have prepared a Notion Page for all the problems currently available in the Algocode project. Please visit this link Algocode Problem Lists to get all the available problems. 
 
You will need to visit this page in order to submit your solution. Just read the problem statements, understand the problem, and copy the problem id. That's all you need to submit a solution! 
Please read API Guideline - Registration in Algocode for account details  and
API Guideline - Code Submission in Algocode for detailed guide on how to submit a solution in the Algocode platform.
- 
Although you can fetch all the problems and any specific problems using the below APIs.
 - 
To get all the Problems
 
    GET https://codemanager.algocode.site/api/v1/problem/all/- 
The API responses with
paginated result. - 
To get a single Problem
 
    GET https://codemanager.algocode.site/api/v1/problem/<question_uuid>/To learn more on the Code Manager APIs and documentation, please visit the documentation of Code Manager Service
You will need postman or insomnia to submit a solution to the project. I know you do have postman or insomnia!
Please open postman or insomnia, and continue reading ...
The Algocode Auth Service is handling the user management.
To Know more about the
Algocode Auth Serviceplease visit the repository.
You have two ways to submit a solution to the Algocode platform. You can create your own account, or you can use the already available verified  account.
Please copy the account details and the login endpoint.
  POST https://auth.algocode.site/api/v1/auth/login/| Parameter | Type | Value | 
|---|---|---|
email | 
string | 
[email protected] | 
password | 
string | 
12345678@1 | 
Send a POST request to the endpoint, and you'll receive access token and refresh token.
Copy the access token and head on to the API Guideline - Code Submission in Algocode section below.
If you want to use your own account to submit solutions, please create an account.
Creating account involves two steps:
- 
submit the from
 - 
verify your email address
 
Copy the below submit endpoint along with the JSON data format, and send a POST request.
Please provide your authentic email address as you'll receive
a tokenin your email from the Algocode Auth domainauth.algocode.site.
    POST https://auth.algocode.site/api/v1/auth/registration/| Parameter | Type | Description | 
|---|---|---|
username | 
string | 
Required Your username for the account. | 
email | 
string | 
Required Your valid email address. | 
password1 | 
string | 
Required Your password. | 
password2 | 
string | 
Required Confirm your password. | 
first_name | 
string | 
Required Your first name. | 
last_name | 
string | 
Required Your last name. | 
At this time please check your email, you will have received an email from auth.algocode.site domain.
The email will have an email validation URL to validate your account activation. Do not click the URL
As Algocode does not have any frontend, you need to verify the account manually.
Example Token URL:
To confirm this is correct, go to https://auth.algocode.site/api/v1/auth/registration/account-confirm-email/Mw:1sFEOr:xsqvnifUV5ppDFqbQBrmp2sIXGoRY63BmnFddsYTau4/
Copy everything after the account validation URL endpoint i.e. https://auth.algocode.site/api/v1/auth/registration/account-confirm-email/
For the above example, copy Mw:1sFEOr:xsqvnifUV5ppDFqbQBrmp2sIXGoRY63BmnFddsYTau4.
Send a POST request to the below endpoint to validate your account creation.
    POST  https://auth.algocode.site/api/v1/auth/registration/verify-email/
| Parameter | Type | Value | 
|---|---|---|
key | 
string | 
Required. Your copied token from your email | 
Response
| Response Key | Type | Value | Description | 
|---|---|---|---|
detail | 
string | 
OK | 
Registration is successful! | 
detail | 
string | 
Any value other than OK | 
Registration is unsuccessful. Check the token again. | 
If you have received the response as ok, congratulation on creating your account on Algocode!
You can now login to your account with the login endpoint mentioned above to get access token and
head on to the API Guideline - Code Submission in Algocode section below.
But in case you were not able to create account, please
raise an issueand use theready to use accountinstead.
- I hope you have noted the readily available user account or you have created an account in Algocode.
 If you have not done this, please check
API Guideline - Registration in Algocodesection for guideline.
Get the
acces tokenusing theuser credentialsas perAPI Guideline - Registration in Algocodesection.To submit a solution, you should visit the
notion pageAlgocode Problem Lists for the available problems in the Algocode.Go through the problems, and copy the
problem_idof the problem you want to submit a solution.Why notion? Did you ask?
Please check the
Problem Listssection for information.
The Code Manager Service is handling all the activities mentioned in this section.
To Know more about the
Algocode Code Manager Serviceplease visit the repository.
Please follow the below steps to submit a solution in Algocode.
- The
 /api/v1/code/submit/API endpoint to submit code solutions isRate Limited.The API endpoint is rate limited with
one request per 20 secondsi.e.3 requests per minute.
- Did you ask why?
 Well, I am using the free
AWSandAzureservers with only1GBof RAM! Hence I have no choice but toRate Limitthe API.
I have implemented the
Rate LimitusingToken Bucket Algorithmand I have applied the Rate Limiter class Project Wide for the quoted API usingMiddleware in Django.Click Here to see the implementation of the
Rate Limiter Class.
Write your solution for the problem you have chosen in C++, as currently C++ is supported. Now, you have to convert it into JSON format. As the Algocode does not have client till now, to share data to the backend services, you need to convert it into JSON. Here's how you can convert the code in JSON in python.
import json
code = """
# paste your code here.
"""
code = json.dumps(code)
print(code)
Copy the printed code from terminal and and continue reading to learn about the request body.
As you have copied the access token as per the API Guideline - Registration in Algocode section, please paste the access token in Bearer Token option in Auth section in Postman or Insomnia.
Now, you are ready to submit the solution to the Algocode platform. Please send a POST request to the below API following the API reference.
    POST https://codemanager.algocode.site/api/v1/code/submit/| Parameter | Type | Value/Description | 
|---|---|---|
problem_id | 
string | 
Required. The problem_id of the problem you are submitting the solution. | 
lang | 
string | 
Required. cpp. Currently cpp is supported. java RCE Engine is under development. | 
code | 
string | 
Required. Your solution for the problem in JSON format. | 
Here's an example payload for one of a problem in Algocode Sqrt(X). The problem is same as this Leetcode Problem.
Example Payload
{
    "problem_id": "f17f511a-8c53-41d3-b750-7673d25835af", 
    "lang": "cpp", 
    "code": "#include <iostream>\n\nint mySqrt(int x) {\n    if (x == 0) return 0;\n    int left = 1, right = x, result = 0;\n    while (left <= right) {\n        
     int mid = left + (right - left) / 2;\n        if (mid <= x / mid) {\n            result = mid;\n            left = mid + 1;\n        } else {\n            right = mid - 1;\n        }\n    
    }\n    return result;\n}\n\nint main() {\n    int t;\n    std::cin >> t;\n    while (t--) {\n        int x;\n        std::cin >> x;\n        std::cout << mySqrt(x) << 
    std::endl;\n    }\n    return 0;\n}\n"
}
Once you have submitted your solution to the Algocode Code Manager Service, you will receive a response with a submission_id.
You would be able to see the result of your solution using the submission_id.
| Response Key | Type | Value/Description | 
|---|---|---|
result | 
dict[dict]] | 
A dictionary containing the request's response. | 
detail | 
string | 
Your response has been submitted | 
submission_id | 
string | 
The submission_id for your solution submission. | 
{
    "result": {
        "detail": "Your response has been submitted.",
        "submission_id": "5993d00f-62fa-437c-8724-ee588265175b"
    }
}
Please check the API Guideline - Result Check in Algocode section to learn how to check the code submission result.
Please make a GET request to the below API to get the result of your solution.
    GET  https://codemanager.algocode.site/api/v1/result/check/<submission_id>/| Parameter | Type | Description | 
|---|---|---|
submission_id | 
string | 
Required. The submission_id of your solution as per the API Guideline - Code Submission in Algocode section. | 
You would see the result of your solution.
If you want to contribute or you want to run locally, then you can fork the development branch on each service mentioned in the Algocode Platform.
Please follow the .envs-examples to know the env-variables you would need to run the project locally.
All the services are dockerized project. You just need to cd src, create  virtual environment, activate it, and
run make docker-up and That's it!
This will run the project for you.
Please follow the service that you want to contribute or run locally to get detailed guideline on local development.
The project itself was a challenge for me!
Once one of my mentors told me
Do the hard things while you are learning, so that the implementation becomes easier for you.
I completely agree with this statement. I enjoy dealing with complex stuff, and bugs give me the kick I enjoy!
Well, enough praise of myself.
But I was not lying. When I thought to build the project 2 months ago (it took 1.5 months to wrap up the project, two weeks was idle).
I had  zero knowledge whether I would be able to do it, but I had confidence that somehow I would do it.
My thought process was simple -  "I do  not know exactly how, but I would do it somehow for sure!"
And I am writing this Readme today  that I have completed the project, and somehow I have made it! That's my motivation.
I know something is not simple as it sounds, but I know, somehow I would manage it!
- 
The initial challenge was the design. Designing a complex project like
Online Judgeinmicroservicesto build fromscratchwas not easy as it sounds. - 
The communication between microservices were fun discovery. I was searching for optimal solution and I learnt
RabbitMQfor this cause, and I ended up writing a nice blog onRabbitMQ 101. Read RabbitMQ 101 Here. The Algocode platform is using an RabbitMQ instance from CloudAMQP platform. - 
Building a Online Judge from scratch was the hardest part to accomplish. At times, I though to abandon the idea of building the online Judge from scratch and use 3rd party APIs, but my instinct did not allow it!
 - 
However, after countless hours of debugging and reading internals of
docker networking,docker volume,docker containers,docker pyhton sdk,docker in dockerandsibling docker,security in docker,linux internals- I have explored countless number of internals and fixed hundred of bugs that taught me a lot. This resulted an Online Judge built from scratch usingdocker. I have learnt so many new concepts while building the projectjust proper by googling!. - 
The next struggle was the
production buildfor the project. I had to shift fromdevelopmentbuild toproduction buildand eventually to deploy the project inAWSandAzureservers. - 
AWS closed my two new account to deploy the project, but after countless of emailing the
aws support, they activated my account and finally I could deploy my project. - 
To wrap up, the entire project was a challenge for me:
The design stage to research stage,to development stage to production stage to deployment stage- I had to repeat all these steps with all the 3 (currently) services behind the Algocode platform. 
- 
I have gained practical experience with
RabbitMQbuilding this project. - 
I have gained deep knowledge on
docker,docker volumes,docker networking,Lunux internalsand many more. - 
As the project is heavily dealing with files, I have gained valuable experience with
file handlingwithpython. - 
As I have built the project from
research,design,dev,productiontodeployment, I have gained invaluable knowledge on design, development, production and deploy the project incloud serviceslikeAWSorAzure. - 
As the project is in
microservises architecture, I have gained practical knowledge oncommunication,networking, between all other services; experience with cloud providers such aAWS,Azureand onveralldev to productionof aSDLC.