Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
eed6d65
FIX FileUtils.upload()
Jan 16, 2026
d9b12c5
Merge pull request #1 from NiveBrooD/master
NiveBrooD Jan 16, 2026
5800a1f
ADD testcontainers
Jan 16, 2026
7b33c02
Revert "ADD testcontainers"
Jan 19, 2026
cf20254
ADD testcontainers
Jan 19, 2026
0f75255
Merge pull request #2 from NiveBrooD/master
NiveBrooD Jan 19, 2026
1d78b57
ADD tests for ProfileRestController
Jan 20, 2026
e11b5c0
Merge pull request #3 from NiveBrooD/master
NiveBrooD Jan 20, 2026
35ae681
ADD TaskTagController
Jan 21, 2026
69ed361
Merge pull request #4 from NiveBrooD/master
NiveBrooD Jan 23, 2026
a8dd1f4
ADD ActivityService.howLongWasInProgress and ActivityService.howLongW…
Jan 23, 2026
fe5f1ed
Merge pull request #5 from NiveBrooD/master
NiveBrooD Jan 26, 2026
62322c2
Fixed mail sender
Jan 26, 2026
5c932d7
FIX oauth, sensitive data
Jan 27, 2026
89b9e2b
FIX oauth, sensitive data
Jan 27, 2026
e679e12
Merge pull request #6 from NiveBrooD/master
NiveBrooD Jan 27, 2026
96a8fc8
Update README.md
NiveBrooD Jan 27, 2026
ac2d876
Update README.md
NiveBrooD Jan 27, 2026
6a68c72
Update README.md
NiveBrooD Jan 27, 2026
0d9fb88
Update README.md
NiveBrooD Jan 28, 2026
ea259cf
Update README.md
NiveBrooD Jan 28, 2026
18bf640
Update README.md
NiveBrooD Jan 28, 2026
d30cc62
ADD docker-compose.yaml
Jan 28, 2026
c93b56e
Merge pull request #7 from NiveBrooD/master
NiveBrooD Jan 28, 2026
ffda619
Update README.md
NiveBrooD Jan 28, 2026
0dfc6bb
ADD messages.properties
Jan 29, 2026
a6a91c5
ADD localization on login page and email message
Jan 29, 2026
be4d3ef
Merge pull request #8 from NiveBrooD/master
NiveBrooD Jan 29, 2026
f60e185
Update README.md
NiveBrooD Jan 29, 2026
5237304
Update README.md
NiveBrooD Jan 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
MAIL_USERNAME=ramist4jr@gmail.com
MAIL_PASSWORD=keosdsdvkcbkqeoe
MAIL_TEST=ramist4jr@gmail.com

CLIENT_SECRET_GITLAB=e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004
CLIENT_SECRET_YANDEX=ed236c501e444a609b0f419e5e88f1e1
CLIENT_SECRET_GOOGLE=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
CLIENT_SECRET_GITHUB=d7bf69a8670d800bda28dff647278ab1cd5f4a16

CLIENT_ID_YANDEX=2f3395214ba84075956b76a34b231985
CLIENT_ID_GITHUB=Ov23li1vRbEW9L5qj7r4
CLIENT_ID_GITLAB=b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494
CLIENT_ID_GOOGLE=413028536182-oe55n414gtnga6a95fosu4vfrombl3vm.apps.googleusercontent.com


DB_URL=jdbc:postgresql://localhost:5432/jira
DB_USER=jira
DB_PASSWORD=JiraRush
DB_NAME=jira
3 changes: 3 additions & 0 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
wrapperVersion=3.3.4
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
22 changes: 22 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM eclipse-temurin:17-jdk-alpine AS builder
WORKDIR /app
COPY .mvn ./.mvn
COPY mvnw mvnw
COPY pom.xml .
COPY src ./src
COPY resources/mails src/main/resources/mails/
COPY resources/view src/main/resources/view/
COPY resources/static src/main/resources/static/
COPY resources/robots.txt src/main/resources/
RUN ./mvnw clean package -DskipTests

FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
RUN apk add --no-cache wget
COPY --from=builder /app/target/jira-1.0.jar app.jar
COPY --from=builder /app/src/main/resources/mails ./resources/mails/
COPY --from=builder /app/src/main/resources/view ./resources/view/
COPY --from=builder /app/src/main/resources/static ./resources/static/
COPY --from=builder /app/src/main/resources/robots.txt ./resources/
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
30 changes: 29 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,31 @@
## Инструкция по запуску
1) Склонировать проект
2) В корне проекта выполнить в терминале docker-compose up (должен быть установлен докер)
3) Всё. Можно открывать http://localhost

## Проделанные работы:
- Удалить (Easy task) не работающие социальные сети или настроить их (Hard task)
Удалил авторизацию через vk, т.к. он требует редирект на https протокол.
Остальные исправил.
Авторизация через github не удастся, если в профиле публично не указал email.
- Вынес чувствительную информацию в отдельный проперти файл.
- Переделал тесты так, чтоб во время тестов использовался тестконтейнер.
- Написал тесты для всех публичных методов контроллера ProfileRestController.
- Сделал рефакторинг метода com.javarush.jira.bugtracking.attachment.FileUtil#upload чтоб он использовал современный подход для работы с файловой системмой.
- Добавитл новый функционал: добавления тегов к задаче (REST API + реализация на сервисе). Фронт делал.
- Добавил подсчет времени сколько задача находилась в работе и тестировании. Методы в классе com.javarush.jira.bugtracking.task.ActivityService
- Добавил Dockerfile и docker-compose.yaml
- Добавил локализацию для страницы логина (header & footer excluded) и сообщения с подтверждением на почту.
выбор языка зависит от Header Accept-language (Для проверки можно использовать curl 'http://localhost:8080/view/login' -H 'Accept-Language: en-US,en;q=0.9' или поменять язык в браузере)
- Также исправил отправку на почту подтверждение регистрации.
И поправил инжект HandlerExceptionResolver в классе com.javarush.jira.common.internal.config.RestAuthenticationEntryPoint, явно указав @Qualifier в конструкторе,
потому что в докере он не обращал внимание на @Qualifier, когда была аннотация @AllArgsConstructor.

P.S. Насчет подтверждения почты: там сделано так, что в default profile используется тестовый email для подтверждения,
т.е. если вы введете свою почту, подтверждение всё равно будет приходить не на вашу почту, а на тестовую.
Чтобы подтверждение регистрации приходило на вашу почту, нужно указывать Active profile: prod (в docker-compose уже указан профиль prod)


## [REST API](http://localhost:8080/doc)

## Концепция:
Expand Down Expand Up @@ -27,4 +55,4 @@
- https://habr.com/ru/articles/259055/

Список выполненных задач:
...
...
6 changes: 3 additions & 3 deletions config/_application-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ app:
host-url: http://localhost
spring:
datasource:
url: jdbc:postgresql://localhost:5432/jira
username: jira
password: JiraRush
url: ${DB_URL}
username: ${DB_USER}
password: ${DB_PASSWORD}

54 changes: 41 additions & 13 deletions config/nginx.conf
Original file line number Diff line number Diff line change
@@ -1,40 +1,68 @@
# https://losst.ru/ustanovka-nginx-ubuntu-16-04
# https://pai-bx.com/wiki/nginx/2332-useful-redirects-in-nginx/#1
# sudo iptables -A INPUT ! -s 127.0.0.1 -p tcp -m tcp --dport 8080 -j DROP
server {
listen 80;
server_name localhost;

# https://www.digitalocean.com/community/tutorials/how-to-optimize-nginx-configuration
gzip on;
gzip_types text/css application/javascript application/json;
gzip_min_length 2048;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root /opt/jirarush/resources;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Port 80;

if ($request_uri ~ ';') {return 404;}

# proxy_cookie_flags ~ secure samesite=none;
location /health {
access_log off;
return 200 "OK";
add_header Content-Type text/plain;
}

# static
location /static/ {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
expires 30d;
access_log off;
}

location /robots.txt {
proxy_pass http://backend:8080;
access_log off;
}

location ~ (/$|/view/|/ui/|/oauth2/) {
expires 0m;
proxy_pass http://localhost:8080;
proxy_connect_timeout 30s;
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30s;
}

location ~ (/api/|/doc|/swagger-ui/|/v3/api-docs/) {
proxy_pass http://localhost:8080;
proxy_connect_timeout 150s;
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 150s;
}

location / {
try_files /view/404.html = 404;
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 80;

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
70 changes: 70 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@

services:
postgres:
image: postgres:17
container_name: jira-postgres
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- jira-network
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}" ]
interval: 10s
timeout: 5s
retries: 5

backend:
build: .
container_name: jira-app
depends_on:
postgres:
condition: service_healthy
env_file:
- .env
environment:
DB_URL: jdbc:postgresql://postgres:5432/${DB_NAME}
APP_URL: http://localhost
SPRING_APPLICATION_BASEURL: http://localhost
SPRING_PROFILES_ACTIVE: prod
expose:
- "8080"
networks:
- jira-network
restart: unless-stopped
healthcheck:
test: [ "CMD-SHELL", "wget --quiet --tries=1 --spider http://localhost:8080 || exit 1" ]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s

nginx:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "80:80"
volumes:
- ./config/nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- backend
restart: unless-stopped
networks:
- jira-network
healthcheck:
test: [ "CMD-SHELL", "curl -f http://localhost/health 2>/dev/null || exit 1" ]
interval: 30s
timeout: 5s
retries: 3

volumes:
postgres_data:

networks:
jira-network:
driver: bridge
Loading