2 Commits
Author SHA1 Message Date
vladp 11b74e046d Merge branch 'dev' into NCP-3 2025-11-26 12:01:54 +07:00
vladp 149bd961e2 NCP-3 add UserContent entity 2025-11-25 23:09:30 +07:00
8 changed files with 122 additions and 237 deletions
-17
View File
@@ -1,17 +0,0 @@
name: Test Workflow
on:
push:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Print environment variables
run: |
echo "GITHUB_REPOSITORY: $GITHUB_REPOSITORY"
echo "GITHUB_SHA: $GITHUB_SHA"
echo "GITHUB_REF: $GITHUB_REF"
echo "GITHUB_ACTOR: $GITHUB_ACTOR"
echo "PATH: $PATH"
+2 -2
View File
@@ -15,8 +15,8 @@ services:
container_name: postgres container_name: postgres
app: app:
# image: popovtsev/ncp image: popovtsev/ncp
build: . # build: .
container_name: no_copy_app container_name: no_copy_app
environment: environment:
POSTGRES_DB: no_copy_ POSTGRES_DB: no_copy_
@@ -1,218 +0,0 @@
pipeline {
agent any
parameters {
string(
name: 'BRANCH',
defaultValue: 'dev',
description: 'Ветка для деплоя'
)
string(
name: 'SERVER',
defaultValue: '92.242.61.23',
description: 'Сервер для деплоя'
)
}
stages {
stage('Git pull') {
steps {
script {
checkout([
$class: 'GitSCM',
branches: [[name: params.BRANCH]],
userRemoteConfigs: [[
url: 'https://code.3err0.ru/backdev/no-copy.git',
credentialsId: 'nx-jen'
]]
])
}
}
}
stage('Stop old container') {
steps {
script {
withCredentials([
usernamePassword(
credentialsId: 'server-root-password',
usernameVariable: 'SSH_USER',
passwordVariable: 'SSH_PASS'
)
]) {
sh """
echo "Stop old container by branch ${params.BRANCH}..."
sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER "
cd /opt/deployments/${params.BRANCH} 2>/dev/null || mkdir -p /opt/deployments/${params.BRANCH}
# Stop old container if have docker-compose
if [ -f 'docker-compose.yaml' ] || [ -f 'docker-compose.yml' ]; then
if [ -f 'docker-compose.yaml' ]; then
docker-compose -f docker-compose.yaml down 2>/dev/null || true
elif [ -f 'docker-compose.yml' ]; then
docker-compose -f docker-compose.yml down 2>/dev/null || true
fi
fi
# Stop and delete container by name
docker stop app-${params.BRANCH} 2>/dev/null || true
docker rm app-${params.BRANCH} 2>/dev/null || true
echo "Old containder deleted"
"
"""
}
}
}
}
stage('Copy to server') {
steps {
script {
withCredentials([
usernamePassword(
credentialsId: 'server-root-password',
usernameVariable: 'SSH_USER',
passwordVariable: 'SSH_PASS'
)
]) {
sh """
echo "Copy files on server..."
# Clean mkdir
sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER "
rm -rf /opt/deployments/${params.BRANCH}/*
mkdir -p /opt/deployments/${params.BRANCH}
"
# Copy all files
sshpass -p '$SSH_PASS' scp -r ./* $SSH_USER@$SERVER:/opt/deployments/${params.BRANCH}/ 2>/dev/null || true
echo "Files copied"
"""
}
}
}
}
stage('Build on server') {
steps {
script {
withCredentials([
usernamePassword(
credentialsId: 'server-root-password',
usernameVariable: 'SSH_USER',
passwordVariable: 'SSH_PASS'
)
]) {
sh """
echo "Build on server..."
sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER "
cd /opt/deployments/${params.BRANCH}
echo "Build Docker for branch ${params.BRANCH}..."
# delete old docker image
docker rmi app:${params.BRANCH} 2>/dev/null || true
# build from branch
if [ -f 'Dockerfile' ]; then
docker build -t app:${params.BRANCH} .
echo "Docker образ app:${params.BRANCH} собран"
fi
# or from docker-compose
if [ -f 'docker-compose.yaml' ]; then
docker-compose -f docker-compose.yaml build
echo "Build from docker-compose.yaml completed"
elif [ -f 'docker-compose.yml' ]; then
docker-compose -f docker-compose.yml build
echo "Build from docker-compose.yml completed"
fi
echo 'Build completed'
"
"""
}
}
}
}
stage('Start on server') {
steps {
script {
withCredentials([
usernamePassword(
credentialsId: 'server-root-password',
usernameVariable: 'SSH_USER',
passwordVariable: 'SSH_PASS'
)
]) {
sh """
echo "Start container..."
sshpass -p '$SSH_PASS' ssh $SSH_USER@$SERVER "
cd /opt/deployments/${params.BRANCH}
# If have docker-compose - use them
if [ -f 'docker-compose.yaml' ]; then
echo "Start docker-compose.yaml..."
docker-compose -f docker-compose.yaml up -d
elif [ -f 'docker-compose.yml' ]; then
echo "Start docker-compose.yml..."
docker-compose -f docker-compose.yml up -d
# If have Dockerfile - start
elif [ -f 'Dockerfile' ]; then
echo "Start app-${params.BRANCH}..."
docker run -d \\
--name app-${params.BRANCH} \\
-p 8080:8080 \\
app:${params.BRANCH}
else
echo "Error:Dockerfile NOT FOUND, docker-compose.yaml or docker-compose.yml"
exit 1
fi
echo 'Container start'
# Wait start
sleep 10
# Check status
echo 'status container:'
if [ -f 'docker-compose.yaml' ] || [ -f 'docker-compose.yml' ]; then
if [ -f 'docker-compose.yaml' ]; then
docker-compose -f docker-compose.yaml ps
else
docker-compose -f docker-compose.yml ps
fi
else
docker ps --filter "name=app-${params.BRANCH}"
fi
echo ''
echo 'Apps start on:'
echo 'http://$SERVER:80'
"
"""
}
}
}
}
}
post {
success {
echo "Deploy branch ${params.BRANCH} completed"
echo "App : http://$SERVER:80"
}
failure {
echo "Deploy failed"
}
}
}
@@ -0,0 +1,17 @@
package ru.soune.no_copy.dto;
import ru.soune.no_copy.entity.ContentStatus;
import ru.soune.no_copy.entity.FileType;
import java.time.LocalDateTime;
public record UserContentResponse(
Long id,
String filename,
String originalFilename,
FileType fileType,
long fileSize,
String filePath,
ContentStatus status,
LocalDateTime uploadDate
) {}
@@ -0,0 +1,5 @@
package ru.soune.no_copy.entity;
public enum ContentStatus {
PROCESSING, COMPLETED, ERROR
}
@@ -0,0 +1,5 @@
package ru.soune.no_copy.entity;
public enum FileType {
PHOTO, DOCUMENT, AUDIO, VIDEO
}
@@ -0,0 +1,73 @@
package ru.soune.no_copy.entity;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;
import java.time.LocalDateTime;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter @Setter
@Table(name = "user_content",
indexes = {
@Index(name = "idx_user_id", columnList = "user_id"),
@Index(name = "idx_file_type", columnList = "file_type"),
@Index(name = "idx_upload_date", columnList = "upload_date")
})
public class UserContent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false,
foreignKey = @ForeignKey(name = "fk_usercontent_user"))
private User user;
@Column(nullable = false)
private String filename;
@Column(name = "original_filename", nullable = false)
private String originalFilename;
@Enumerated(EnumType.STRING)
@Column(name = "file_type", nullable = false, length = 16)
private FileType fileType;
@Column(name = "file_extension", length = 16)
private String fileExtension;
@Column(name = "file_size", nullable = false)
private Long fileSize;
@Column(name = "file_path", columnDefinition = "TEXT", nullable = false)
private String filePath;
@Column(name = "protection_level")
private Integer protectionLevel;
@Column(name = "geometric_resistant")
private Boolean geometricResistant = false;
@Column(name = "watermark_applied")
private Boolean watermarkApplied = false;
@Column(name = "protection_hash", length = 64)
private String protectionHash;
@Column(name = "watermark_id", length = 50)
private String watermarkId;
@Enumerated(EnumType.STRING)
@Column(length = 16)
private ContentStatus status = ContentStatus.PROCESSING;
@CreationTimestamp
@Column(name = "upload_date", nullable = false, updatable = false)
private LocalDateTime uploadDate;
}
@@ -0,0 +1,20 @@
package ru.soune.no_copy.repository;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import ru.soune.no_copy.entity.FileType;
import ru.soune.no_copy.entity.UserContent;
import java.util.List;
public interface UserContentRepository extends JpaRepository<UserContent, Long> {
List<UserContent> findByUserIdOrderByUploadDateDesc(Long userId);
List<UserContent> findByUserIdAndFileTypeOrderByUploadDateDesc(
Long userId, FileType type, Pageable pageable
);
long countByUserIdAndFileType(Long userId, FileType type);
long countByUserId(Long userId);
}