diff --git a/apps/safeline/2.4.0/.env.sample b/apps/safeline/2.4.0/.env.sample new file mode 100644 index 00000000..8e6b293b --- /dev/null +++ b/apps/safeline/2.4.0/.env.sample @@ -0,0 +1,12 @@ +CONTAINER_NAME="safeline" +MGT_PORT="40080" +POSTGRES_DB="safeline" +POSTGRES_HOST="postgres" +POSTGRES_PASSWORD="password_xxJdZD" +POSTGRES_PORT="5432" +POSTGRES_USER="postgresql" +REDIS_HOST="redis" +REDIS_PASSWORD="" +REDIS_PORT="6379" +SAFELINE_DIR="./data" +SUBNET_PREFIX="169.254.0" diff --git a/apps/safeline/2.4.0/data.yml b/apps/safeline/2.4.0/data.yml new file mode 100644 index 00000000..29ec2c05 --- /dev/null +++ b/apps/safeline/2.4.0/data.yml @@ -0,0 +1,88 @@ +additionalProperties: + formFields: + - default: "" + edit: true + envKey: REDIS_HOST + key: redis + labelEn: Redis Service + labelZh: Redis服务 + required: true + type: service + - default: "6379" + edit: true + envKey: REDIS_PORT + labelEn: Redis Service Port + labelZh: Redis服务端口 + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: REDIS_PASSWORD + labelEn: Redis Service Password + labelZh: Redis服务密码 + required: true + rule: paramCommon + type: password + - default: "" + edit: true + envKey: POSTGRES_HOST + key: postgresql + labelEn: Postgres database Service + labelZh: Postgres数据库服务 + required: true + type: service + - default: "5432" + edit: true + envKey: POSTGRES_PORT + labelEn: Postgres database Service Port + labelZh: Postgres数据库服务端口 + required: true + rule: paramPort + type: number + - default: safeline + edit: true + envKey: POSTGRES_DB + labelEn: Postgres database Name + labelZh: Postgres数据库名 + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: POSTGRES_USER + labelEn: Postgres database User Name + labelZh: Postgres数据库用户名 + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: POSTGRES_PASSWORD + labelEn: Postgres database User Password + labelZh: Postgres数据库密码 + required: true + rule: paramCommon + type: password + - default: 40080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: SAFELINE_DIR + labelEn: Data storage folder + labelZh: 数据存放文件夹 + required: true + type: text + - default: 169.254.0 + edit: true + envKey: SUBNET_PREFIX + labelEn: Subnet prefix + labelZh: 子网前缀 + required: true + type: text diff --git a/apps/safeline/2.4.0/docker-compose.yml b/apps/safeline/2.4.0/docker-compose.yml new file mode 100644 index 00000000..2927e156 --- /dev/null +++ b/apps/safeline/2.4.0/docker-compose.yml @@ -0,0 +1,98 @@ +version: '3' +services: + safeline-management: + container_name: ${CONTAINER_NAME}-mgt-api + restart: always + networks: + safeline-ce: + ipv4_address: ${SUBNET_PREFIX}.4 + image: chaitin/safeline-mgt-api:2.4.0 + volumes: + - ${SAFELINE_DIR}/resources/management:/resources/management + - ${SAFELINE_DIR}/resources/nginx:/resources/nginx + - ${SAFELINE_DIR}/logs:/logs + - /etc/localtime:/etc/localtime:ro + ports: + - ${PANEL_APP_PORT_HTTP:-9443}:1443 + environment: + - MANAGEMENT_RESOURCES_DIR=/resources/management + - NGINX_RESOURCES_DIR=/resources/nginx + - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - MARIO_URL=http://safeline-mario:3335 + - DETECTOR_URL=http://safeline-detector:8001 + - MANAGEMENT_LOGS_DIR=/logs/management + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-detector: + container_name: ${CONTAINER_NAME}-detector + restart: always + networks: + safeline-ce: + ipv4_address: ${SUBNET_PREFIX}.5 + image: chaitin/safeline-detector:2.4.0 + volumes: + - ${SAFELINE_DIR}/resources/detector:/resources/detector + - ${SAFELINE_DIR}/logs/detector:/logs/detector + - /etc/localtime:/etc/localtime:ro + environment: + - LOG_DIR=/logs/detector + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-mario: + container_name: ${CONTAINER_NAME}-mario + restart: always + networks: + safeline-ce: + ipv4_address: ${SUBNET_PREFIX}.6 + image: chaitin/safeline-mario:2.4.0 + volumes: + - ${SAFELINE_DIR}/resources/mario:/resources/mario + - ${SAFELINE_DIR}/logs/mario:/logs/mario + - /etc/localtime:/etc/localtime:ro + environment: + - LOG_DIR=/logs/mario + - GOGC=100 + - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - REDIS_URL=redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/0 + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-tengine: + container_name: ${CONTAINER_NAME}-tengine + restart: always + image: chaitin/safeline-tengine:2.4.0 + volumes: + - ${SAFELINE_DIR}/resources/nginx:/etc/nginx + - ${SAFELINE_DIR}/resources/management:/resources/management + - ${SAFELINE_DIR}/resources/detector:/resources/detector + - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx + - /etc/localtime:/etc/localtime:ro + - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache + - /etc/resolv.conf:/etc/resolv.conf + environment: + - MGT_ADDR=${SUBNET_PREFIX}.4:9002 + ulimits: + nofile: 131072 + network_mode: host + labels: + createdBy: Apps + +networks: + safeline-ce: + name: safeline-ce + driver: bridge + ipam: + driver: default + config: + - gateway: ${SUBNET_PREFIX:?SUBNET_PREFIX required}.1 + subnet: ${SUBNET_PREFIX}.0/24 + driver_opts: + com.docker.network.bridge.name: safeline-ce \ No newline at end of file diff --git a/apps/safeline/README.md b/apps/safeline/README.md new file mode 100644 index 00000000..e0a8e156 --- /dev/null +++ b/apps/safeline/README.md @@ -0,0 +1,118 @@ +

+ +

+

雷池 - 广受好评的社区 WAF

+
+

+ + + + + +

+ +

+ 官方网站 | + 在线 Demo | + 技术文档 | + For English +

+ +一款足够简单、足够好用、足够强的免费 WAF。基于业界领先的语义引擎检测技术,作为反向代理接入,保护你的网站不受黑客攻击。 + +核心检测能力由智能语义分析算法驱动,专为社区而生,不让黑客越雷池半步。 + + + +

相关源码仓库

+

+ 语义分析自动机引擎 | + 流量分析插件 | + T1K 协议 | + 测试工具 +

+ +## 相关特性 + +#### 便捷性 + +采用容器化部署,一条命令即可完成安装,0 成本上手。安全配置开箱即用,无需人工维护,可实现安全躺平式管理。 + +#### 安全性 + +首创业内领先的智能语义分析算法,精准检测、低误报、难绕过。语义分析算法无规则,面对未知特征的 0day 攻击不再手足无措。 + +#### 高性能 + +无规则引擎,线性安全检测算法,平均请求检测延迟在 1 毫秒级别。并发能力强,单核轻松检测 2000+ TPS,只要硬件足够强,可支撑的流量规模无上限。 + +#### 高可用 + +流量处理引擎基于 Nginx 开发,性能与稳定性均可得到保障。内置完善的健康检查机制,服务可用性高达 99.99%。 + +## 🚀 安装 + +### 配置需求 + +- 操作系统:Linux +- 指令架构:x86_64 +- 软件依赖:Docker 20.10.6 版本以上 +- 软件依赖:Docker Compose 2.0.0 版本以上 +- 最小化环境:1 核 CPU / 1 GB 内存 / 10 GB 磁盘 + + +### 一键安装 + +``` +bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)" +``` + +> 更多安装方式请参考 安装雷池 + +## 🕹️ 快速使用 + +### 登录 + +浏览器打开后台管理页面 `https://:9443`。根据界面提示,使用 **支持 TOTP 的认证软件** 扫描二维码,然后输入动态口令登录: + +![login.gif](https://waf-ce.chaitin.cn/images/gif/login.gif) + +### 配置防护站点 + +雷池以反向代理方式接入,优先于网站服务器接收流量,对流量中的攻击行为进行检测和清洗,将清洗过后的流量转发给网站服务器。 + +![config.gif](https://waf-ce.chaitin.cn/images/gif/config_site.gif) + +💡 TIPS: 添加后,执行 `curl -H "Host: <域名>" http://:<端口>` 应能获取到业务网站的响应。 + +### 测试效果 + +使用以下方式尝试模拟黑客攻击,看看雷池的防护效果如何 + +- 浏览器访问 `http://:<端口>/?id=1%20AND%201=1` +- 浏览器访问 `http://:<端口>/?a=` + +![log.gif](https://waf-ce.chaitin.cn/images/gif/detect_log.gif) + +> 如果你需要进行深度测试,请参考 测试防护效果 + +### FAQ + +- [安装问题](https://waf-ce.chaitin.cn/posts/faq_install) +- [登录问题](https://waf-ce.chaitin.cn/posts/faq_login) +- [网站无法访问](https://waf-ce.chaitin.cn/posts/faq_access) +- [配置问题](https://waf-ce.chaitin.cn/posts/faq_config) +- [其他问题](https://waf-ce.chaitin.cn/posts/faq_other) + +## 🏘️ 联系我们 + +1. 可以通过 GitHub Issue 直接进行 Bug 反馈和功能建议 +2. 可以扫描下方二维码加入雷池社区版用户讨论群 + + + +## Star History + + + Star History Chart + diff --git a/apps/safeline/data.yml b/apps/safeline/data.yml new file mode 100644 index 00000000..13dd5d37 --- /dev/null +++ b/apps/safeline/data.yml @@ -0,0 +1,20 @@ +name: 雷池 +tags: + - 工具 +title: 一款足够简单、足够好用、足够强的免费 WAF +type: 工具 +description: 一款足够简单、足够好用、足够强的免费 WAF +additionalProperties: + key: safeline + name: 雷池 + tags: + - Tool + shortDescZh: 一款足够简单、足够好用、足够强的免费 WAF + shortDescEn: A simple and easy to use WAF tool + type: tool + crossVersionUpdate: true + limit: 1 + recommend: 0 + website: https://waf-ce.chaitin.cn/ + github: https://github.com/chaitin/safeline + document: https://waf-ce.chaitin.cn/posts/guide_introduction diff --git a/apps/safeline/latest-1p-network-bug/.env.sample b/apps/safeline/latest-1p-network-bug/.env.sample new file mode 100644 index 00000000..baa2be42 --- /dev/null +++ b/apps/safeline/latest-1p-network-bug/.env.sample @@ -0,0 +1,12 @@ +CONTAINER_NAME="safeline" +MGT_PORT="40080" +POSTGRES_DB="safeline" +POSTGRES_HOST="postgres" +POSTGRES_PASSWORD="password_xxJdZD" +POSTGRES_PORT="5432" +POSTGRES_USER="postgresql" +REDIS_HOST="redis" +REDIS_PASSWORD="" +REDIS_PORT="6379" +SAFELINE_DIR="./data" +SUBNET_PREFIX="172.18.0" diff --git a/apps/safeline/latest-1p-network-bug/data.yml b/apps/safeline/latest-1p-network-bug/data.yml new file mode 100644 index 00000000..aadbb33f --- /dev/null +++ b/apps/safeline/latest-1p-network-bug/data.yml @@ -0,0 +1,88 @@ +additionalProperties: + formFields: + - default: "" + edit: true + envKey: REDIS_HOST + key: redis + labelEn: Redis Service + labelZh: Redis服务 + required: true + type: service + - default: "6379" + edit: true + envKey: REDIS_PORT + labelEn: Redis Service Port + labelZh: Redis服务端口 + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: REDIS_PASSWORD + labelEn: Redis Service Password + labelZh: Redis服务密码 + required: true + rule: paramCommon + type: password + - default: "" + edit: true + envKey: POSTGRES_HOST + key: postgresql + labelEn: Postgres database Service + labelZh: Postgres数据库服务 + required: true + type: service + - default: "5432" + edit: true + envKey: POSTGRES_PORT + labelEn: Postgres database Service Port + labelZh: Postgres数据库服务端口 + required: true + rule: paramPort + type: number + - default: safeline + edit: true + envKey: POSTGRES_DB + labelEn: Postgres database Name + labelZh: Postgres数据库名 + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: POSTGRES_USER + labelEn: Postgres database User Name + labelZh: Postgres数据库用户名 + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: POSTGRES_PASSWORD + labelEn: Postgres database User Password + labelZh: Postgres数据库密码 + required: true + rule: paramCommon + type: password + - default: 40080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: SAFELINE_DIR + labelEn: Data storage folder + labelZh: 数据存放文件夹 + required: true + type: text + - default: 172.18.0 + edit: false + envKey: SUBNET_PREFIX + labelEn: Subnet prefix + labelZh: 子网前缀 + required: true + type: text diff --git a/apps/safeline/latest-1p-network-bug/docker-compose.yml b/apps/safeline/latest-1p-network-bug/docker-compose.yml new file mode 100644 index 00000000..169c01f6 --- /dev/null +++ b/apps/safeline/latest-1p-network-bug/docker-compose.yml @@ -0,0 +1,90 @@ +version: '3' +services: + safeline-management: + container_name: ${CONTAINER_NAME}-mgt-api + restart: always + networks: + 1panel-network: + ipv4_address: ${SUBNET_PREFIX}.234 + image: chaitin/safeline-mgt-api:latest + volumes: + - ${SAFELINE_DIR}/resources/management:/resources/management + - ${SAFELINE_DIR}/resources/nginx:/resources/nginx + - ${SAFELINE_DIR}/logs:/logs + - /etc/localtime:/etc/localtime:ro + ports: + - ${PANEL_APP_PORT_HTTP:-9443}:1443 + environment: + - MANAGEMENT_RESOURCES_DIR=/resources/management + - NGINX_RESOURCES_DIR=/resources/nginx + - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - MARIO_URL=http://safeline-mario:3335 + - DETECTOR_URL=http://safeline-detector:8001 + - MANAGEMENT_LOGS_DIR=/logs/management + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-detector: + container_name: ${CONTAINER_NAME}-detector + restart: always + networks: + 1panel-network: + ipv4_address: ${SUBNET_PREFIX}.235 + image: chaitin/safeline-detector:latest + volumes: + - ${SAFELINE_DIR}/resources/detector:/resources/detector + - ${SAFELINE_DIR}/logs/detector:/logs/detector + - /etc/localtime:/etc/localtime:ro + environment: + - LOG_DIR=/logs/detector + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-mario: + container_name: ${CONTAINER_NAME}-mario + restart: always + networks: + 1panel-network: + ipv4_address: ${SUBNET_PREFIX}.236 + image: chaitin/safeline-mario:latest + volumes: + - ${SAFELINE_DIR}/resources/mario:/resources/mario + - ${SAFELINE_DIR}/logs/mario:/logs/mario + - /etc/localtime:/etc/localtime:ro + environment: + - LOG_DIR=/logs/mario + - GOGC=100 + - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - REDIS_URL=redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/0 + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-tengine: + container_name: ${CONTAINER_NAME}-tengine + restart: always + image: chaitin/safeline-tengine:latest + volumes: + - ${SAFELINE_DIR}/resources/nginx:/etc/nginx + - ${SAFELINE_DIR}/resources/management:/resources/management + - ${SAFELINE_DIR}/resources/detector:/resources/detector + - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx + - /etc/localtime:/etc/localtime:ro + - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache + - /etc/resolv.conf:/etc/resolv.conf + environment: + - MGT_ADDR=${SUBNET_PREFIX}.234:9002 + ulimits: + nofile: 131072 + network_mode: host + labels: + createdBy: Apps + +networks: + 1panel-network: + external: true \ No newline at end of file diff --git a/apps/safeline/latest/.env.sample b/apps/safeline/latest/.env.sample new file mode 100644 index 00000000..8e6b293b --- /dev/null +++ b/apps/safeline/latest/.env.sample @@ -0,0 +1,12 @@ +CONTAINER_NAME="safeline" +MGT_PORT="40080" +POSTGRES_DB="safeline" +POSTGRES_HOST="postgres" +POSTGRES_PASSWORD="password_xxJdZD" +POSTGRES_PORT="5432" +POSTGRES_USER="postgresql" +REDIS_HOST="redis" +REDIS_PASSWORD="" +REDIS_PORT="6379" +SAFELINE_DIR="./data" +SUBNET_PREFIX="169.254.0" diff --git a/apps/safeline/latest/data.yml b/apps/safeline/latest/data.yml new file mode 100644 index 00000000..29ec2c05 --- /dev/null +++ b/apps/safeline/latest/data.yml @@ -0,0 +1,88 @@ +additionalProperties: + formFields: + - default: "" + edit: true + envKey: REDIS_HOST + key: redis + labelEn: Redis Service + labelZh: Redis服务 + required: true + type: service + - default: "6379" + edit: true + envKey: REDIS_PORT + labelEn: Redis Service Port + labelZh: Redis服务端口 + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: REDIS_PASSWORD + labelEn: Redis Service Password + labelZh: Redis服务密码 + required: true + rule: paramCommon + type: password + - default: "" + edit: true + envKey: POSTGRES_HOST + key: postgresql + labelEn: Postgres database Service + labelZh: Postgres数据库服务 + required: true + type: service + - default: "5432" + edit: true + envKey: POSTGRES_PORT + labelEn: Postgres database Service Port + labelZh: Postgres数据库服务端口 + required: true + rule: paramPort + type: number + - default: safeline + edit: true + envKey: POSTGRES_DB + labelEn: Postgres database Name + labelZh: Postgres数据库名 + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: POSTGRES_USER + labelEn: Postgres database User Name + labelZh: Postgres数据库用户名 + required: true + rule: paramCommon + type: text + - default: "" + edit: true + envKey: POSTGRES_PASSWORD + labelEn: Postgres database User Password + labelZh: Postgres数据库密码 + required: true + rule: paramCommon + type: password + - default: 40080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: SAFELINE_DIR + labelEn: Data storage folder + labelZh: 数据存放文件夹 + required: true + type: text + - default: 169.254.0 + edit: true + envKey: SUBNET_PREFIX + labelEn: Subnet prefix + labelZh: 子网前缀 + required: true + type: text diff --git a/apps/safeline/latest/docker-compose.yml b/apps/safeline/latest/docker-compose.yml new file mode 100644 index 00000000..437fae37 --- /dev/null +++ b/apps/safeline/latest/docker-compose.yml @@ -0,0 +1,98 @@ +version: '3' +services: + safeline-management: + container_name: ${CONTAINER_NAME}-mgt-api + restart: always + networks: + safeline-ce: + ipv4_address: ${SUBNET_PREFIX}.4 + image: chaitin/safeline-mgt-api:latest + volumes: + - ${SAFELINE_DIR}/resources/management:/resources/management + - ${SAFELINE_DIR}/resources/nginx:/resources/nginx + - ${SAFELINE_DIR}/logs:/logs + - /etc/localtime:/etc/localtime:ro + ports: + - ${PANEL_APP_PORT_HTTP:-9443}:1443 + environment: + - MANAGEMENT_RESOURCES_DIR=/resources/management + - NGINX_RESOURCES_DIR=/resources/nginx + - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - MARIO_URL=http://safeline-mario:3335 + - DETECTOR_URL=http://safeline-detector:8001 + - MANAGEMENT_LOGS_DIR=/logs/management + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-detector: + container_name: ${CONTAINER_NAME}-detector + restart: always + networks: + safeline-ce: + ipv4_address: ${SUBNET_PREFIX}.5 + image: chaitin/safeline-detector:latest + volumes: + - ${SAFELINE_DIR}/resources/detector:/resources/detector + - ${SAFELINE_DIR}/logs/detector:/logs/detector + - /etc/localtime:/etc/localtime:ro + environment: + - LOG_DIR=/logs/detector + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-mario: + container_name: ${CONTAINER_NAME}-mario + restart: always + networks: + safeline-ce: + ipv4_address: ${SUBNET_PREFIX}.6 + image: chaitin/safeline-mario:latest + volumes: + - ${SAFELINE_DIR}/resources/mario:/resources/mario + - ${SAFELINE_DIR}/logs/mario:/logs/mario + - /etc/localtime:/etc/localtime:ro + environment: + - LOG_DIR=/logs/mario + - GOGC=100 + - DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + - REDIS_URL=redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/0 + cap_drop: + - net_raw + labels: + createdBy: Apps + + safeline-tengine: + container_name: ${CONTAINER_NAME}-tengine + restart: always + image: chaitin/safeline-tengine:latest + volumes: + - ${SAFELINE_DIR}/resources/nginx:/etc/nginx + - ${SAFELINE_DIR}/resources/management:/resources/management + - ${SAFELINE_DIR}/resources/detector:/resources/detector + - ${SAFELINE_DIR}/logs/nginx:/var/log/nginx + - /etc/localtime:/etc/localtime:ro + - ${SAFELINE_DIR}/resources/cache:/usr/local/nginx/cache + - /etc/resolv.conf:/etc/resolv.conf + environment: + - MGT_ADDR=${SUBNET_PREFIX}.4:9002 + ulimits: + nofile: 131072 + network_mode: host + labels: + createdBy: Apps + +networks: + safeline-ce: + name: safeline-ce + driver: bridge + ipam: + driver: default + config: + - gateway: ${SUBNET_PREFIX:?SUBNET_PREFIX required}.1 + subnet: ${SUBNET_PREFIX}.0/24 + driver_opts: + com.docker.network.bridge.name: safeline-ce \ No newline at end of file diff --git a/apps/safeline/logo.png b/apps/safeline/logo.png new file mode 100644 index 00000000..b58a7ce9 Binary files /dev/null and b/apps/safeline/logo.png differ