Skip to content

Commit 2ab9ba2

Browse files
committed
Merge branch 'dev'
2 parents 8a54459 + 17d2323 commit 2ab9ba2

File tree

91 files changed

+29043
-47
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+29043
-47
lines changed

.env.example

+4-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#####################################################################
1313

1414
# .env 文件版本
15-
ENV_FILE_VERSION='v2.5'
15+
ENV_FILE_VERSION='v2.6'
1616

1717
###################### 账户配置 Account config #########################
1818
# Freenom 账户 Freenom Account
@@ -138,3 +138,6 @@ CUSTOM_LANGUAGE=zh
138138

139139
# 送信时是否显示服务器信息 1:显示 0:不显示 Whether to display server information when sending messages 1: Display 0: Do not display
140140
SHOW_SERVER_INFO=0
141+
142+
# 是否给敏感信息打码 1:启用 0:不启用 Whether to enable the obfuscation of sensitive information 1: Enabled 0: Not enabled
143+
MOSAIC_SENSITIVE_INFO=0

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
此处包含了自脚本发布以来的所有更新日志。以前的日志只记录了比较大的变更,以后的日志会尽可能详尽一些。
44

5+
#### [v0.5.1](https://github.com/luolongfei/freenom/releases/tag/v0.5.1) - 2022-08-27
6+
7+
- 支持一键部署至 Koyeb、Heroku 等平台,虽然 Heroku 马上要收费了,但 Koyeb 依然免费
8+
- 优化在各种环境下的目录读写权限判断
9+
- 支持给日志或者命令行输出内容中的敏感信息打马赛克,默认不启用
10+
511
#### [v0.5](https://github.com/luolongfei/freenom/releases/tag/v0.5) - 2022-05-15
612

713
- 增加支持 华为云函数、Railway 等部署方式

Dockerfile.koyeb

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
FROM php:8.1.9-fpm-alpine3.16
2+
3+
LABEL author="mybsdc <mybsdc@gmail.com>" \
4+
maintainer="luolongfei <luolongf@gmail.com>"
5+
6+
ENV TZ Asia/Shanghai
7+
ENV IS_KOYEB 1
8+
9+
WORKDIR /app
10+
11+
COPY . ./
12+
13+
COPY ./koyeb/nginx.template.conf ./
14+
COPY ./koyeb/web ./web/
15+
16+
RUN set -eux \
17+
&& apk update \
18+
&& apk add --no-cache tzdata bash nginx gettext \
19+
&& mkdir -p /app/logs \
20+
&& chmod -Rf 666 /app/logs
21+
22+
COPY ./koyeb/startup.sh /
23+
RUN chmod +x /startup.sh
24+
25+
EXPOSE 80 443 2019
26+
27+
# https://www.koyeb.com/docs/deploy-to-koyeb-button
28+
# https://www.koyeb.com/docs/quickstart/deploy-a-docker-application
29+
CMD ["/bin/bash", "-c", "/startup.sh"]

README.md

+15-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Documentation: [English version](https://github.com/luolongfei/freenom/blob/main
3030

3131
[🚈 通过 Railway 部署](#-通过-Railway-部署)
3232

33+
[📦 通过 Koyeb 部署](#-通过-Koyeb-部署)(推荐没有自己服务器的用户使用此方案,一键部署)
34+
3335
[☁ 通过 各种云函数 部署](#-通过各种云函数部署)
3436

3537
[🚧 直接拉取源码部署](#-直接拉取源码部署)
@@ -79,7 +81,7 @@ Thanks for non-commercial open source development authorization by JetBrains.
7981

8082
无论是续期成败或者程序执行出错,都会收到脚本发出的通知。如果是续期成败相关的通知,通知会包括未续期域名的到期天数等内容。*此处展示的是通知邮件的内容。*
8183

82-
<a href="https://s4.ax1x.com/2022/02/26/bZr7WQ.png"><img src="https://s4.ax1x.com/2022/02/26/bZr7WQ.png" alt="邮件示例" border="0" width="670" height="540" /></a>
84+
<a href="https://s4.ax1x.com/2022/02/26/bZr7WQ.png"><img src="https://s4.ax1x.com/2022/02/26/bZr7WQ.png" alt="邮件示例" border="0" width="95%" height="100%" /></a>
8385

8486
### 🎁 事前准备
8587

@@ -410,8 +412,6 @@ systemctl restart docker
410412

411413
### 🧊 通过 Heroku 部署
412414

413-
~~*推荐没有自己服务器的用户使用此方案部署。此方案完全免费。*~~
414-
415415
**Heroku 将于 2022-11-28 停止提供免费服务,所以,忘掉本文吧。官方通告:[https://blog.heroku.com/next-chapter](https://blog.heroku.com/next-chapter)**
416416

417417
有关 【通过 Heroku 部署】 的具体操作步骤请参考 [此处](https://github.com/luolongfei/freenom/wiki/%E9%80%9A%E8%BF%87-Heroku-%E9%83%A8%E7%BD%B2)
@@ -427,6 +427,18 @@ systemctl restart docker
427427

428428
***
429429

430+
### 📦 通过 Koyeb 部署
431+
432+
*推荐没有自己服务器的用户使用此方案部署。此方案完全免费。*
433+
434+
有关 【通过 Koyeb 部署】 的具体操作步骤请参考 [此处](https://github.com/luolongfei/freenom/wiki/%E9%80%9A%E8%BF%87-Koyeb-%E9%83%A8%E7%BD%B2)
435+
436+
**在看完上行文档的具体内容,并且你确定你行后**,便可点击下方按钮,尝试一键部署:
437+
438+
[![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)](https://app.koyeb.com/deploy?type=docker&name=freenom&ports=80;http;/&env[FF_TOKEN]=20190214&env[SHOW_SERVER_INFO]=1&env[MOSAIC_SENSITIVE_INFO]=1&env[FREENOM_USERNAME]=&env[FREENOM_PASSWORD]=&env[MULTIPLE_ACCOUNTS]=&env[TELEGRAM_CHAT_ID]=&env[TELEGRAM_BOT_TOKEN]=&env[TELEGRAM_BOT_ENABLE]=0&image=docker.io/luolongfei/freenom:koyeb)
439+
440+
***
441+
430442
### ☁ 通过各种云函数部署
431443

432444
所有云函数使用的是同一个压缩包,已做兼容处理,下载地址:

app/Console/FreeNom.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
class FreeNom extends Base
2121
{
22-
const VERSION = 'v0.5';
22+
const VERSION = 'v0.5.1';
2323

2424
const TIMEOUT = 33;
2525

app/Console/Upgrade.php

+7
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,13 @@ public function friendlyDateFormat($date, $timezone = null)
210210
public function handle()
211211
{
212212
try {
213+
// 检查 Data 目录写权限
214+
if (!is_writable(DATA_PATH)) {
215+
system_log(lang('100135'));
216+
217+
return true;
218+
}
219+
213220
if (!$this->needToUpgrade()) {
214221
return true;
215222
}

app/helpers.php

+26-24
Original file line numberDiff line numberDiff line change
@@ -65,30 +65,16 @@ function lang($key = '')
6565
function system_log($content, array $response = [], $fileName = '')
6666
{
6767
try {
68-
# 云函数只有 /tmp 目录可写
69-
$path = IS_SCF ? '/tmp/' : sprintf('%s/logs/%s/', ROOT_PATH, date('Y-m'));
70-
$file = $path . ($fileName ?: date('d')) . '.log';
71-
72-
if (!is_dir($path)) {
73-
mkdir($path, 0777, true);
74-
chmod($path, 0777);
75-
}
76-
77-
$handle = fopen($file, 'a'); // 追加而非覆盖
78-
79-
if (!filesize($file)) {
80-
chmod($file, 0666);
81-
}
82-
8368
$msg = sprintf(
8469
"[%s] %s %s\n",
8570
date('Y-m-d H:i:s'),
8671
is_string($content) ? $content : json_encode($content),
8772
$response ? json_encode($response, JSON_UNESCAPED_UNICODE) : '');
8873

89-
// 在 Github Actions 上运行,过滤敏感信息
90-
if (env('ON_GITHUB_ACTIONS')) {
91-
$msg = preg_replace_callback('/(?P<secret>[\w-.]{1,4}?)(?=@[\w-.]+)/i', function ($m) {
74+
// 过滤敏感信息
75+
if ((int)env('MOSAIC_SENSITIVE_INFO') === 1) {
76+
// 在 php 7.3 之前,连字符“-”在中括号中随便放,但在之后,只能放在开头或结尾或者转义后才能随便放
77+
$msg = preg_replace_callback('/(?P<secret>[\w.-]{1,3}?)(?=@[\w.-]+)/ui', function ($m) {
9278
return str_ireplace($m['secret'], str_repeat('*', strlen($m['secret'])), $m['secret']);
9379
}, $msg);
9480
}
@@ -100,8 +86,26 @@ function system_log($content, array $response = [], $fileName = '')
10086
// 干掉着色标签
10187
$msg = strip_tags($msg); // 不完整或者破损标签将导致更多的数据被删除
10288

103-
fwrite($handle, $msg);
104-
fclose($handle);
89+
// 写入日志文件
90+
if (is_writable(ROOT_PATH)) {
91+
$path = sprintf('%s/logs/%s/', ROOT_PATH, date('Y-m'));
92+
$file = $path . ($fileName ?: date('d')) . '.log';
93+
94+
if (!is_dir($path)) {
95+
mkdir($path, 0666, true); // 0666 所有用户可读写
96+
}
97+
98+
$handle = fopen($file, 'a'); // 追加而非覆盖
99+
100+
if ($handle !== false) {
101+
if (!filesize($file)) {
102+
chmod($file, 0666);
103+
}
104+
105+
fwrite($handle, $msg);
106+
fclose($handle);
107+
}
108+
}
105109

106110
flush();
107111
} catch (\Exception $e) {
@@ -238,11 +242,9 @@ function system_check()
238242
throw new LlfException(34520006, ['7.3', PHP_VERSION]);
239243
}
240244

241-
// 如果是在 云函数 或 Heroku 部署,则不需要检查这几项
242-
if (IS_SCF || (int)env('IS_HEROKU') === 1) {
245+
// 特殊环境无需检查这几项
246+
if (IS_SCF || !is_writable(ROOT_PATH) || (int)env('IS_KOYEB') === 1 || (int)env('IS_HEROKU') === 1) {
243247
system_log(lang('100009'));
244-
system_log(lang('100010'));
245-
system_log(lang('100011'));
246248
} else {
247249
if (!function_exists('putenv')) {
248250
throw new LlfException(34520005);

docker-entrypoint.sh

+3-4
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@ plain='\033[0m'
1515

1616
# 生成配置文件
1717
if [ ! -f /conf/.env ]; then
18-
cp /app/.env.example /conf/.env
19-
echo -e "[${green}Info${plain}] 已生成 .env 文件,请将 .env 文件中的配置项改为你自己的,然后重启容器(如果你是在第三方 Docker 环境中使用容器,例如 railway/heroku 等平台,可忽略本条提醒)"
18+
cp /app/.env.example /conf/.env && echo -e "[${green}Info${plain}] 已生成 .env 文件,请将 .env 文件中的配置项改为你自己的,然后重启容器,如果当前环境非普通 VPS,可忽略此提示" || echo -e "[${yellow}Warn${plain}] 未能正常生成 .env 文件"
2019
fi
2120
if [ ! -f /app/.env ]; then
22-
ln -s /conf/.env /app/.env
21+
ln -s /conf/.env /app/.env || echo -e "[${yellow}Warn${plain}] 未能正常创建 .env 文件链接"
2322
fi
2423

2524
# PHP 命令
26-
PHP_COMMAND='php /app/run > /app/logs/freenom_cron.log 2>&1'
25+
PHP_COMMAND='/usr/local/bin/php /app/run > /app/logs/freenom_cron.log 2>&1'
2726

2827
# 指定脚本执行时间
2928
if [ -z "${RUN_AT}" ]; then

koyeb/favicon.ico

4.72 KB
Binary file not shown.

koyeb/nginx.template.conf

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
worker_processes auto;
2+
3+
error_log stderr;
4+
pid /var/run/nginx.pid;
5+
6+
events {
7+
worker_connections 1024;
8+
}
9+
10+
http {
11+
include /etc/nginx/mime.types;
12+
access_log /dev/stdout;
13+
server_tokens off;
14+
15+
server {
16+
listen 80;
17+
18+
root /app/web;
19+
20+
location / {
21+
index index.php index.html index.htm;
22+
}
23+
24+
location ~ \.php$ {
25+
try_files $uri =404;
26+
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
27+
fastcgi_pass 127.0.0.1:9000;
28+
fastcgi_index index.php;
29+
include /etc/nginx/fastcgi_params;
30+
fastcgi_param SCRIPT_FILENAME /app/web/$fastcgi_script_name;
31+
fastcgi_param PATH_INFO $fastcgi_path_info;
32+
}
33+
}
34+
}

koyeb/startup.sh

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env bash
2+
3+
#===================================================================#
4+
# Author: luolongfei <luolongf@gmail.com> #
5+
# Intro: https://github.com/luolongfei/freenom #
6+
#===================================================================#
7+
8+
set -e
9+
10+
# 自定义颜色变量
11+
red='\033[0;31m'
12+
green='\033[0;32m'
13+
yellow='\033[0;33m'
14+
plain='\033[0m'
15+
16+
echo -e "[${green}Info${plain}] 项目地址:https://github.com/luolongfei/freenom"
17+
echo -e "[${green}Info${plain}] 洛阳亲友如相问,一片冰心在玉壶。 by luolongfei"
18+
19+
# PHP 命令
20+
PHP_COMMAND='/usr/local/bin/php /app/run > /app/logs/freenom_cron.log 2>&1'
21+
22+
# 指定脚本执行时间
23+
if [ -z "${RUN_AT}" ]; then
24+
minute=$( shuf -i 0-59 -n 1 )
25+
hour=$( shuf -i 6-23 -n 1 )
26+
CRON_COMMAND="${minute} ${hour} * * * ${PHP_COMMAND}"
27+
echo -e "[${green}Info${plain}] 已自动指定执行时间,续期任务将在北京时间每天 「${hour}:${minute}」 执行"
28+
echo -e "[${green}Info${plain}] 在没有手动指定 RUN_AT 环境变量的情况下,每次重建容器,程序都会重新在 06 ~ 23 点全时段中自动随机指定一个执行时间,目的是防止很多人在同一个时间点执行任务导致 Freenom 无法稳定提供服务"
29+
else
30+
if [[ "${RUN_AT}" =~ ^([01][0-9]|2[0-3]|[0-9]):([0-5][0-9]|[0-9])$ ]]; then
31+
minute=$( echo ${RUN_AT} | egrep -o '([0-5][0-9]|[0-9])$' )
32+
hour=$( echo ${RUN_AT} | egrep -o '^([01][0-9]|2[0-3]|[0-9])' )
33+
CRON_COMMAND="${minute} ${hour} * * * ${PHP_COMMAND}"
34+
echo -e "[${green}Info${plain}] 你已指定执行时间,续期任务将在北京时间每天 「${hour}:${minute}」 执行"
35+
elif [ "$(php /app/run -c=Cron -m=verify --cron_exp="${RUN_AT}")" -eq 1 ]; then
36+
CRON_COMMAND="${RUN_AT} ${PHP_COMMAND}"
37+
echo -e "[${green}Info${plain}] 你自定义的 Cron 表达式为「${RUN_AT}」,已通过正则验证"
38+
else
39+
echo -e "[${red}Error${plain}] RUN_AT 的值无效"
40+
echo -e "${yellow}请输入一个有效的时间指令,其值可以为时分格式,如:11:24,也可以为 Cron 表达式,如:'24 11 * * *',甚至可以不输入,让程序自动生成,推荐采用自动生成的方式,不建议手动指定此环境变量"
41+
exit 1
42+
fi
43+
fi
44+
45+
# 添加计划任务
46+
sed -i '/freenom_cron/'d /etc/crontabs/root
47+
echo -e "${CRON_COMMAND}" >> /etc/crontabs/root
48+
echo -e "[${green}Info${plain}] 计划任务:${CRON_COMMAND}"
49+
50+
# 启动 Cron
51+
/usr/sbin/crond
52+
53+
# nginx 配置
54+
cp /app/nginx.template.conf /app/nginx.conf
55+
56+
# 启动 php-fpm 与 nginx
57+
php-fpm -D -R; nginx -c /app/nginx.conf -g 'daemon off;'

koyeb/web/composer.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"require": {
3+
"sensiolabs/ansi-to-html": "^1.2"
4+
}
5+
}

0 commit comments

Comments
 (0)