{"id":22448168,"url":"https://github.com/monamoxie/metton-app","last_synced_at":"2025-08-01T21:32:57.407Z","repository":{"id":194019628,"uuid":"678286877","full_name":"Monamoxie/metton-app","owner":"Monamoxie","description":"A multi-functional full-stack app written in Python for managing booking appointments. It provides the ability to receive instant notifications, manage calendar and adapt schedules on-the-go.","archived":false,"fork":false,"pushed_at":"2024-10-29T08:56:58.000Z","size":32281,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-29T10:05:09.491Z","etag":null,"topics":["aws","celery","django","django-rest-framework","docker","ec2","elastic-container-service","fargate","gunicorn","nextjs","nginx","postgres","python","rabbitmq","react","typescript"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Monamoxie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-14T07:45:10.000Z","updated_at":"2024-10-29T08:57:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"a43e2d8b-145a-4510-81bc-dbeef6e357e6","html_url":"https://github.com/Monamoxie/metton-app","commit_stats":null,"previous_names":["monamoxie/metton-python-online-scheduler","monamoxie/metton-app"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monamoxie%2Fmetton-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monamoxie%2Fmetton-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monamoxie%2Fmetton-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Monamoxie%2Fmetton-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Monamoxie","download_url":"https://codeload.github.com/Monamoxie/metton-app/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228408729,"owners_count":17915238,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","celery","django","django-rest-framework","docker","ec2","elastic-container-service","fargate","gunicorn","nextjs","nginx","postgres","python","rabbitmq","react","typescript"],"created_at":"2024-12-06T04:21:30.158Z","updated_at":"2025-08-01T21:32:57.379Z","avatar_url":"https://github.com/Monamoxie.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"left\"\u003e\u003cimg src=\"core/static/images/logo.png\"\u003e\u003c/p\u003e\n\n# METTON\n\nA full-stack web app powered by Python and Django, designed to provide seamless and efficient calendar management solution. \n\nWhether you are a solopreneur, SME, or a startup, Metton helps you optimize your schedules, enhance client interactions, and drive your business forward.\n\n[![Github Actions](https://github.com/Monamoxie/metton-python-utility-scheduler/actions/workflows/metton.yml/badge.svg)](https://github.com/Monamoxie/metton-python-utility-scheduler/actions/workflows/metton.yml)\n\n\u003c/p\u003e\n\n## Technology Stack\n\n- Python\n- RabbitMQ / Celery\n- PostgreSQL\n- Docker\n- Django\n- Gunicorn\n- Nginx\n- TypeScript\n- React Js\n- Next Js\n- Material UI\n\n## PRODUCTION ARCHITECTURE\n\u003cp align=\"center\"\u003e\u003cimg src=\"core/static/images/snapshots/metton-arch.webp\"\u003e\u003c/p\u003e\n\nThis project is currently in alpha stage. More components are continuosly being added or dropped as the need arises.\n\n## DEV Setup\n\n- Clone repo\n- Run `cp env.example .env` and fill up details as desired\n- Run `chmox +x ./.shell/python_entrypoint.sh`\n- Run `docker-compose up --build -d --wait`\n- Visit http://127.0.0.1:8080\n- For local setup, you make use of the RabbitMQ and PostgreSQL docker images\n- In production, we take advantage of AWS infrastrures by using MQ and RDS\n\n## WORKFLOW\n- The entire application is fully `containerised`. \n- For `scaling and efficiency` in PROD, I'm taking advangtage of AWS Managed Services for certain components like the Database and Message Queues. \n- For a complete overview of container services available on PROD, please check this file: `ecs-task-definition.json`\n- While for a complete overview of container services available on DEV, please check the docker compose file: `docker-compose.yaml`\n- `Nginx` acts as a reverse proxy; For Development, this is made possible through port 8080 on the Host machine \u0026 port 80 in the container. You can always configure or change this from your `.env` config\n- `Nginx` also serves static contents \u0026 routes incoming requests to `Gunicorn`\n- Django through `Gunicorn` serves the main app on port 8000. The `Python` container EXPOSES port 8000 for this purpose.\n- `collectstatic` uses /var/www/static as static volume in PROD. But you don't have to worry about this during development, as Django would serve the assets directly from core/static\n- `Python` and `Nginx` both share the same static volume\n  \u003cbr\u003e\n\n## AWS Setup with Terraform\nI've designed the follwing guidelines with AWS's Free Tier in mind. However, you're free to scale up the resources as needed depending on usage and requirements.\n\nTo use this Terraform configuration, you need to set up your AWS credentials and configuration files. Follow these steps:\n\n1. **Create a `terraform.tfvars` file** in `.terraform` directory of this project, if it doesn't already exist.\n\n2. **Define your AWS configuration and credentials paths** in the `terraform.tfvars` file. For example:\n\n   ```hcl\n   shared_config_files = [\"/path/to/your/aws/config\"]\n   shared_credentials_files = [\"/path/to/your/aws/credentials\"]\n   aws_region = \"your-aws-region\"\n   profile = \"your-credentials-profile-name\"\n\n   // add as many more credentials and variables in this file. \n   // please check .terraform/aws/variables.tf for a list of variables and credentials you MUST set up in this file. Without these values, terraform may not be able to create the required aws infrastructure\n   ```\n\n   Replace `/path/to/your/aws/config` and `/path/to/your/aws/credentials` with the actual paths to your AWS configuration and credentials files.\n\n3. Store sensitive credentials stored in `.terraform/aws/terraform.tfvars`\n4. For a list of required credentials, please check `.terraform/aws/variables.tf`\n\n### BOOTSTRAPPING TERRAFORM ON AWS\n###### 1. Create an AWS Account\n  - Go to the AWS sign-up page and create a new account.\n\n###### 2. Create a User for Terraform\n- After logging into your AWS console, navigate to the IAM (Identity and Access Management) service.\n- Go to Users and click on Add user.\n- Enter a username for Terraform (e.g., terraform-user), and select Programmatic access.\n- For Permissions, choose Attach existing policies directly, and select AdministratorAccess (you can refine scale down this permission later if needed). This grants Terraform the necessary permissions to create and manage AWS resources.\n\n###### 3. Create Access Key and Secret\n- Create access credentials (Access Key ID and Secret Access Key).\n- Download and store these credentials securely on your machine (this is important as you won’t be able to retrieve the Secret Access Key again).\n- Store them in a secure location (e.g., a password manager or encrypted file).\n\n###### 4. Create an SSH Keypair for EC2 Access\n- On your local machine, open a terminal and generate a new SSH keypair:\n  ```\n  ssh-keygen -t rsa -b 2048 -f ~/.ssh/metton_ec2\n  ```\n- Follow the prompts to set a passphrase (or leave it empty if you prefer).\n- This will generate two files:\n```\n  metton_ec2 (private key)\n  metton_ec2.pub (public key)\n```\n- Important: Store the private key securely, and make sure it is not shared or exposed.\n\n###### 5. Reference the Public Key in Terraform Configuration\n- In your terraform.tfvars, reference the public key for EC2:\n```\nec2_key_pair_name = \"~/.ssh/metton_ec2.pub\"\n```\n##### LIST OF AWS RESOURCES \u0026 TERRFORM MODULES\n```hcl\n.terraform/aws \n├── compute/          # EC2, ECR\n├── database/         # PostgreSQL\n├── messaging/        # RabbitMQ\n├── networking/       # Internet Gateway, Load Balancers, Route Table, Route 53, Subnet Group, Subnet, Cloud Map\n├── storage/          # S3, EFS\n├── security/         # SSL Cert Manager, Security Groups, Key Pairs, KMS, Parameter store, IAM\n├── monitoring/        # Cloudwatch\n```\n\n### DELAYS \u0026 PROPAGATION \n##### Important Note:\n\nWhen applying this Terraform configuration, you may experience delays during resource validation or propagation, especially with resources like ACM certificates and DNS updates. \n\nThese processes may take some time to complete and may not immediately reflect in the Terraform output.\n\n##### What to do:\n\nIf the validation fails or takes longer than expected, try running the process again after some time (waiting a few hours can sometimes help).\n\nIn case of recurring issues, verify that DNS records have been properly updated and propagated before retrying. I recommend being patient during these steps, as AWS and DNS updates can take time to fully propagate.\n\n## UI Components\n- Material UI\n- Magic UI\n\n\u003c!-- ## And it comes with a beautiful User Interface you can customize or use straight out the box\n\n#### Landing page\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"core/static/images/snapshots/home.png\"\u003e\u003c/p\u003e\n\n#### All pages are responsive\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"core/static/images/snapshots/home-mobile-view.png\"\u003e\u003c/p\u003e\n\n#### Booking page\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"core/static/images/snapshots/booking-page.png\"\u003e\u003c/p\u003e\n\n#### Manage Schedules\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"core/static/images/snapshots/manage-schedules.png\"\u003e\u003c/p\u003e\n\n#### Manage Appointments\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"core/static/images/snapshots/upcoming-appointments.png\"\u003e\u003c/p\u003e --\u003e\n\n## License\n\n[MIT license](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonamoxie%2Fmetton-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonamoxie%2Fmetton-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonamoxie%2Fmetton-app/lists"}