{"id":22157506,"url":"https://github.com/yuriytkach/stream-16-demo-app","last_synced_at":"2026-02-14T06:32:32.774Z","repository":{"id":77229690,"uuid":"540962635","full_name":"yuriytkach/stream-16-demo-app","owner":"yuriytkach","description":"Demo application for online YouTube stream #16, #17, #20","archived":false,"fork":false,"pushed_at":"2022-11-14T17:23:12.000Z","size":338,"stargazers_count":2,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-26T12:43:26.615Z","etag":null,"topics":["apache-poi","aws-s3","demo-app","docker","java-mail","sftp-client","spring-boot","testcontainers","youtube-stream"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yuriytkach.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-24T20:44:31.000Z","updated_at":"2022-11-14T17:26:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ec529ed-d343-4ed5-9fd5-b7259dc5c4c4","html_url":"https://github.com/yuriytkach/stream-16-demo-app","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/yuriytkach/stream-16-demo-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriytkach%2Fstream-16-demo-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriytkach%2Fstream-16-demo-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriytkach%2Fstream-16-demo-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriytkach%2Fstream-16-demo-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yuriytkach","download_url":"https://codeload.github.com/yuriytkach/stream-16-demo-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriytkach%2Fstream-16-demo-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29438772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T05:24:35.651Z","status":"ssl_error","status_checked_at":"2026-02-14T05:24:34.830Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["apache-poi","aws-s3","demo-app","docker","java-mail","sftp-client","spring-boot","testcontainers","youtube-stream"],"created_at":"2024-12-02T03:09:48.701Z","updated_at":"2026-02-14T06:32:32.770Z","avatar_url":"https://github.com/yuriytkach.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Demo Project for Online Stream #16,#17,#20, #21 - Microservice for Excel File Processing\n\nDemo project for online stream #16 where a small microservice is created that processes Excel file\nuploaded through REST API, saves file to AWS S3, parses it to JSON and send that to another service.\n\nOn stream #17 the dockerization of the project is done together with additional properties and settings\nto prepare for running in production.\n\nOn stream #20 additional features are added: Sending of file to SFTP folder and then sending email.\nThe integration with all external services is tested with running services in containers.\n\nOn stream #21 monitoring was added to service with Prometheus and Grafana setup to see application metrics\n\n![Diagram for Application](https://github.com/yuriytkach/stream-16-demo-app/blob/main/arch.png?raw=true)\n\n## Access to Online Stream on YouTube\n\nTo get a link to online stream on YouTube please do the following:\n\n- :moneybag: Make any donation to support my volunteering initiative to help Ukrainian Armed Forces by means described on [my website](https://www.yuriytkach.com/volunteer)\n- :email: Write me an [email](mailto:me@yuriytkach.com) indicating donation amount and time\n- :tv: I will reply with the link to the stream on YouTube.\n\nThank you in advance for your support! Слава Україні! :ukraine:\n\n## Technologies\n- Spring Boot\n- Apache POI\n- AWS Java SDK\n- SSHJ for SFTP\n- JavaMail\n- Prometheus for monitoring\n- TestContainers for testing\n- GreenMail for testing mail server\n\n### SFTP notes\nTo connect to SFTP server the SSH private key is used. The generated key is located in `src/test/resources`.\n\nTo generate new key you can use `ssh-keygen` tool on your system.\nNote, that key would be generated in OPENSSH format.\n\nTo convert to PEM format use the following command:\n```shell\nssh-keygen -p -m pem -f /path/to/file\n```\n\n## Building and Running the Application\n\nTo build the app, use gradle:\n```shell\n./gradlew build\n```\n\nTo run application, use gradle:\n```shell\n./gradlew bootRun\n```\n\nAfter that you can access application on [http://localhost:8080](http://localhost:8080)\n\n### Docker\n\nTo build docker image, use gradle:\n```shell\n./gradlew bootBuildImage\n```\n\nThen you run the docker container with exposing app port `8899`:\n```shell\ndocker run -p 8899:8080 -t stream-16-demo-app:0.0.1-SNAPSHOT\n```\n\nAfter that you can access application on [http://localhost:8899](http://localhost:8899)\n\n### Running docker-compose with external dependencies\n\nProject includes the `docker-compose.yml` file where external services are defined together with application.\n\n### Monitoring with Prometheus and Grafana\n\nPrometheus and Grafana are started with docker-compose. Prometheus is set up to scape metrics from application\nthat is also running in docker. The configuration for prometheus is defined in `docker/prometheus.yml` file.\n\nGrafana is set up to read metrics from Prometheus. Grafana is started with default configuration defined in\n`docker/grafana.ini`. Default username and password to login to Grafana is `admin:admin`.\nYou can import dashboards that were created during online stream from json files:\n- `docker/grafana-dashboard-online-stream.json`\n- `docker/grafana-dashboard-spring-boot-stats.json`\n\n## Documentation\n### Reference Documentation\nFor further reference, please consider the following sections:\n\n* [Official Gradle documentation](https://docs.gradle.org)\n* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.7.4/gradle-plugin/reference/html/)\n* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.7.4/gradle-plugin/reference/html/#build-image)\n* [Spring Web](https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#web)\n* [Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#actuator)\n* [Testcontainers](https://www.testcontainers.org/)\n\n### Guides\nThe following guides illustrate how to use some features concretely:\n\n* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)\n* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)\n* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/)\n* [Building a RESTful Web Service with Spring Boot Actuator](https://spring.io/guides/gs/actuator-service/)\n\n### Additional Links\nThese additional references should also help you:\n\n* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuriytkach%2Fstream-16-demo-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyuriytkach%2Fstream-16-demo-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuriytkach%2Fstream-16-demo-app/lists"}