Skip to content

Commit

Permalink
Merge pull request #59 from kongying-tavern/feat/image-api
Browse files Browse the repository at this point in the history
feat: image alist host
  • Loading branch information
boxsnake authored Dec 31, 2023
2 parents 501cd38 + df6d7cc commit cfdf243
Show file tree
Hide file tree
Showing 31 changed files with 535 additions and 62 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ database/**/.back_*
application-datasource-dev.yml
application-datasource-prod.yml
application-datasource-uat.yml
application-image-dev.yml
application-image-prod.yml
application-image-uat.yml

### Docker ###
docker/.env
Expand Down
16 changes: 3 additions & 13 deletions docker/Makefile.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,9 @@ check_env
ENV_FILE = get_env ENV_FILE
PROJECT_NAME = get_env PROJECT_NAME
# Generate datasource YAML
yaml_ds_tpl = readfile ./config/api/application-datasource-tpl.yml
yaml_ds_slots = json_parse --collection "[\"PGSQL_USER\", \"PGSQL_PASS\", \"PGSQL_DB\", \"PGSQL_SCHEMA\"]"
yaml_ds_content = replace_env_value ${yaml_ds_tpl} ${yaml_ds_slots}
release ${yaml_ds_slots}
writefile ./cache/application-datasource.yml "${yaml_ds_content}"
# Generate nacos YAML
yaml_nacos_tpl = readfile ./config/api/application-nacos-tpl.yml
yaml_nacos_slots = json_parse --collection "[\"NACOS_USER\", \"NACOS_PASS\"]"
yaml_nacos_content = replace_env_value ${yaml_nacos_tpl} ${yaml_nacos_slots}
release ${yaml_nacos_slots}
writefile ./cache/application-nacos.yml "${yaml_nacos_content}"
replace_env_values_in_file ${ENV_FILE} ./config/api/application-datasource-tpl.yml ./cache/application-datasource.yml
replace_env_values_in_file ${ENV_FILE} ./config/api/application-nacos-tpl.yml ./cache/application-nacos.yml
replace_env_values_in_file ${ENV_FILE} ./config/api/application-image-tpl.yml ./cache/application-image.yml
docker_build "${ENV_FILE}" "${PROJECT_NAME}" "./composer/docker-compose.dev-build.yml"
'''
Expand Down
14 changes: 6 additions & 8 deletions docker/composer/docker-compose.dataenv.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,10 @@ services:
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -p 5432 -U \"${PGSQL_USER}\" | grep accept || exit 1"]
interval: 5m
timeout: 60s
interval: 30s
timeout: 30s
retries: 3
start_period: 30s
start_interval: 5s
start_period: 2m
nacos:
container_name: gsapi-nacos
hostname: gsapi-nacos
Expand All @@ -42,8 +41,7 @@ services:
restart: always
healthcheck:
test: ["CMD-SHELL", "curl -f 'http://localhost:8848/nacos' || exit 1"]
interval: 5m
timeout: 60s
interval: 30s
timeout: 30s
retries: 3
start_period: 60s
start_interval: 5s
start_period: 2m
3 changes: 3 additions & 0 deletions docker/composer/docker-compose.dev-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ services:
gsapi-api:
aliases:
- api.local
gsapi-img-alist:
aliases:
- img-alist.local
volumes:
- ${DATA_DIR}/api/logs:/data/logs
ports:
Expand Down
1 change: 1 addition & 0 deletions docker/composer/docker-compose.dev-build.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ ADD docker/cache docker/cache
RUN --mount=type=cache,target=/root/.m2,rw \
cp -f ./docker/cache/application-datasource.yml ./genshin-map-config/src/main/resources-dev/application-datasource-dev.yml && \
cp -f ./docker/cache/application-nacos.yml ./genshin-map-config/src/main/resources-dev/application-nacos-dev.yml && \
cp -f ./docker/cache/application-image.yml ./genshin-map-config/src/main/resources-dev/application-image-dev.yml && \
cp -f ./docker/cache/application-nacos.yml ./genshin-map-ability/genshin-map-ability-gateway/src/main/resources/application.yml && \
mvn clean package -s ./docker/config/maven.xml -P dev -f pom.xml && \
mkdir -p ./dist && \
Expand Down
23 changes: 10 additions & 13 deletions docker/composer/docker-compose.img-alist-run.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,10 @@ services:
restart: always
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 1m
timeout: 60s
interval: 30s
timeout: 30s
retries: 3
start_period: 15s
start_interval: 10s
start_period: 2m
minio:
container_name: gsapi-minio
hostname: gsapi-minio
Expand All @@ -45,11 +44,10 @@ services:
restart: always
healthcheck:
test: ["CMD", "bash", "/minio/healthcheck.sh"]
interval: 1m
timeout: 60s
retries: 5
start_period: 30s
start_interval: 5s
interval: 30s
timeout: 30s
retries: 3
start_period: 2m
minio-proxy:
container_name: gsapi-minio-proxy
hostname: gsapi-minio-proxy
Expand Down Expand Up @@ -110,11 +108,10 @@ services:
restart: always
healthcheck:
test: ["CMD", "bash", "/alist/healthcheck.sh"]
interval: 1m
timeout: 60s
interval: 30s
timeout: 30s
retries: 3
start_period: 15s
start_interval: 10s
start_period: 2m

# Initialization services
minio-init:
Expand Down
2 changes: 1 addition & 1 deletion docker/config/api/api-core.service
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Wants=network-online.target
Type=simple
User=root
WorkingDirectory=/data/
ExecStart=/bin/java -server -jar /data/genshin-map-api-core-core-1.0.jar
ExecStart=/bin/java -server -Dfile.encoding=UTF-8 -jar /data/genshin-map-api-core-core-1.0.jar
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog
Expand Down
2 changes: 1 addition & 1 deletion docker/config/api/api-gateway.service
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Wants=network-online.target
Type=simple
User=root
WorkingDirectory=/data/
ExecStart=/bin/java -server -jar /data/genshin-map-ability-gateway-1.0.jar
ExecStart=/bin/java -server -Dfile.encoding=UTF-8 -jar /data/genshin-map-ability-gateway-1.0.jar
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog
Expand Down
7 changes: 7 additions & 0 deletions docker/config/api/application-image-tpl.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
image:
minio:
endpoint: http://minio-proxy.local:80
key: {{MINIO_KEY}}
secret: {{MINIO_SECRET}}
bucket: {{MINIO_BUCKET_IMAGE}}
static-url-template: http://localhost:{{MINIO_PORT_PROXY}}/[[fullPath]]
3 changes: 3 additions & 0 deletions docker/config/img-alist-builder/minio-init/init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ function step_init_minio () {
mc admin user svcacct add \
--access-key "${MINIO_KEY}" \
--secret-key "${MINIO_SECRET}" \
--policy /data/policy/uploadService.json \
--name "UploadSvc" \
--description "Image Upload Service" \
minio "${MINIO_ROOT_USERNAME}"
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"admin:*"
]
},
{
"Effect": "Allow",
"Action": [
"kms:*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
24 changes: 16 additions & 8 deletions docker/makefile/util.env.ds
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,30 @@ end

fn get_env_map
env_file = get_env ENV_FILE
env_content = readfile "${env_file}"
env_content = readfile "${1}"
env_map = map
map_load_properties ${env_map} "${env_content}"
return ${env_map}
end

fn replace_env_value
env_map = get_env_map
fn replace_env_values
text = set "${1}"
env_map_keys = map_keys ${2}

for key in ${2}
pattern = concat "{{" "${key}" "}}"
val = map_get ${env_map} "${key}"
text = replace "${text}" "${pattern}" "${val}"
for env_key in ${env_map_keys}
env_slot = concat "{{" "${env_key}" "}}"
env_val = map_get ${2} "${env_key}"
text = replace "${text}" "${env_slot}" "${env_val}"
end

release ${env_map}
release ${env_map_keys}
return ${text}
end

fn replace_env_values_in_file
env_map = get_env_map "${1}"
text_src = readfile "${2}"
text_tar = replace_env_values "${text_src}" ${env_map}
writefile "${3}" "${text_tar}"
release ${env_map}
end
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ genshin:
- /api/punctuate/**
- /api/marker/**
- /api/marker_link/**
- /api/res/**
MAP_MANAGER:
- /api/punctuate_audit/**
- /api/tag/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@
</dependency>
<!--END Auth用依赖-->

<!-- minio client -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
</dependency>

</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package site.yuanshen.genshin.core.aspect;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
Expand All @@ -9,8 +10,11 @@
import org.springframework.util.StopWatch;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
* @author kraken
Expand All @@ -24,6 +28,30 @@ public class WebLogAspect {
private static final String LINE_SEPARATOR = System.lineSeparator();
public static final ThreadLocal<StopWatch> STOP_WATCH_THREAD_LOCAL = new ThreadLocal<>();

public static final JSONWriter.Feature[] defaultWriteFeatures = new JSONWriter.Feature[]{
JSONWriter.Feature.BrowserCompatible,
JSONWriter.Feature.WriteEnumUsingToString,
JSONWriter.Feature.WriteBigDecimalAsPlain,
JSONWriter.Feature.WriteEnumUsingToString,
JSONWriter.Feature.WriteNonStringKeyAsString
};

private Object[] sanitizeArgs(Object[] args) {
final Object[] sanitizedArgs = List.of(args)
.parallelStream()
.map(arg -> {
if(arg == null) {
return null;
} else if(arg instanceof MultipartFile) {
return "@[Instance MultipartFile]";
} else {
return arg;
}
})
.toArray();
return sanitizedArgs;
}

/**
* 以 controller 包下定义的所有请求为切入点
*/
Expand Down Expand Up @@ -64,7 +92,7 @@ public void doBefore(JoinPoint joinPoint) {
+ request.getRemoteAddr()
+ LINE_SEPARATOR
+ "请求入参 : "
+ JSON.toJSONString(joinPoint.getArgs())
+ JSON.toJSONString(sanitizeArgs(joinPoint.getArgs()), defaultWriteFeatures)
+ LINE_SEPARATOR);
}

Expand Down Expand Up @@ -101,7 +129,7 @@ public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
throw e;
} finally {
STOP_WATCH_THREAD_LOCAL.get().stop();
String s = JSON.toJSONString(result);
String s = JSON.toJSONString(result, defaultWriteFeatures);
log.info(
LINE_SEPARATOR
+ "URL : "
Expand All @@ -124,4 +152,4 @@ public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
STOP_WATCH_THREAD_LOCAL.remove();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package site.yuanshen.genshin.core.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import site.yuanshen.common.web.response.R;
import site.yuanshen.common.web.response.RUtils;
import site.yuanshen.data.dto.ResourceUploadDto;
import site.yuanshen.data.vo.ResourceUploadVo;
import site.yuanshen.genshin.core.service.ResourceService;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/res")
@Tag(name = "resource", description = "资源API")
public class ResourceController {

private final ResourceService resourceService;

@PutMapping("/upload/image")
@Operation(summary = "上传图片", description = "上传图片至图床并返回访问地址")
public R<ResourceUploadVo> uploadImage(@RequestParam(value = "file", required = false) MultipartFile file, @ModelAttribute ResourceUploadVo uploadVo) {
R<ResourceUploadVo> result = RUtils.create(
resourceService.uploadImage(
(new ResourceUploadDto(uploadVo)).withFile(file)
)
);
return result;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package site.yuanshen.genshin.core.sao;

import io.minio.MinioClient;
import org.springframework.web.multipart.MultipartFile;
import site.yuanshen.common.core.exception.minio.BucketNotFoundException;
import site.yuanshen.common.core.exception.minio.ObjectPutException;

public interface MinioSao {

/**
* 创建 MinIO 客户端连接
*/
MinioClient createClient(String endpoint, String key, String secret);

/**
* 检查存储桶是否存在
*/
boolean bucketExist(MinioClient client, String bucket) throws BucketNotFoundException;

/**
* 检查对象是否存在
*/
boolean objectExists(MinioClient client, String bucket, String object);

String putObject(MinioClient client, String bucket, String object, MultipartFile file) throws ObjectPutException;
}
Loading

0 comments on commit cfdf243

Please sign in to comment.