Alist是一款支持多种存储(比如本地存储、阿里云盘、OneDrive、Google Drive)的目录文件列表程序,支持 web 浏览与webdav,且易于拓展. 后端基于gin,前端使用react

AList 从一开始就设计为易于安装,几乎一键开启.但是直接使用官方编译好的程序文件有时候不太满足自己的需求,这时候就需要自己修改源码然后编译安装了.我的需求是删掉”Aliyun Video Previewer”的默认预览,我将用Debian 11演示

编译前的准备工作

1.Golang

1
2
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
tar -zxvf go1.21.0.linux-amd64.tar.gz -C /usr/local/

配置 ${PATH} 包含 Go 的 bin 目录的环境变量 /usr/loca/go/bin:

1
2
echo "export PATH=/usr/local/go/bin:${PATH}" | tee /etc/profile.d/go.sh
source /etc/profile.d/go.sh

查看版本

1
go version

2.nodejs

1
2
3
apt-get install xz-utils -y
wget https://nodejs.org/dist/v18.18.1/node-v18.18.1-linux-x64.tar.xz
tar -xvf node-v18.18.1-linux-x64.tar.xz -C /usr/local/

配置环境变量

1
2
3
4
5
cat << EOF >> /etc/profile
export NODE_HOME=/usr/local/node-v18.18.1-linux-x64
export PATH=/usr/local/node-v18.18.1-linux-x64/bin:$PATH
EOF
source /etc/profile

查看版本

1
node -v

查看npm环境

1
npm -v

3.pnpm(performant npm)

1
npm install -g pnpm

4.gcc、git

1
apt install build-essential git -y

clone alist前端代码

1
git clone --recurse-submodules https://github.com/alist-org/alist-web.git

clone alist后端代码

1
git clone https://github.com/alist-org/alist.git

2023-10-12T14:51:35.png
前后端拉取/克隆好了,但是我们拉取/克隆下来的前端里面只有一个默认的英文语言文件,我们还需要下载一个带中文的语言文件: zh-CN.zip

1
2
3
apt install unzip -y
wget https://sitao.org/alist/zh-CN.zip
unzip zh-CN.zip -d alist-web/src/lang/

这样语言文件就放进去了,继续输入命令:
cd alist-web/
chmod +x ./scripts/i18n.mjs
node ./scripts/i18n.mjs

执行完毕语言里面会出现一个 entry.ts 的文件,这样我们就可以用了

编译前端

确保当前在alist-web目录里
1.修改源码**(如果你没有修改源码的需求请忽略这一步)**

1
vim src/pages/home/previews/index.ts

找到Aliyun Video Previewer,如:
2023-10-12T14:15:48.png
删掉Aliyun Video Previewer {}这部分的内容,并保持格式,如
2023-10-12T14:16:49.png
:wq保存退出

2.开始编译

1
2
pnpm install
pnpm build

需要等待几分钟
编译好后,会看到一个叫 “dist” 的文件夹,我们待会需要把dist/移动到后端代码目录里去
2023-10-12T14:23:00.png

编译后端

进入后端代码目录

1
cd ~/alist

删除原来的dist

1
rm -rf ./public/dist

把刚才的alist-web/dist目录移动到public去

1
mv ~/alist-web/dist ./public

开始编译
创建一个install.sh文件

1
vim compile.sh

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
appName="alist"
builtAt="$(date +'%F %T %z')"
goVersion=$(go version | sed 's/go version //')
gitAuthor=$(git show -s --format='format:%aN <%ae>' HEAD)
gitCommit=$(git log --pretty=format:"%h" -1)
version=$(git describe --long --tags --dirty --always)
webVersion=$(wget -qO- -t1 -T2 "https://api.github.com/repos/alist-org/alist-web/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
ldflags="\
-w -s \
-X 'github.com/alist-org/alist/v3/internal/conf.BuiltAt=$builtAt' \
-X 'github.com/alist-org/alist/v3/internal/conf.GoVersion=$goVersion' \
-X 'github.com/alist-org/alist/v3/internal/conf.GitAuthor=$gitAuthor' \
-X 'github.com/alist-org/alist/v3/internal/conf.GitCommit=$gitCommit' \
-X 'github.com/alist-org/alist/v3/internal/conf.Version=$version' \
-X 'github.com/alist-org/alist/v3/internal/conf.WebVersion=$webVersion' \
"
go build -ldflags="$ldflags" .

:wq保存退出

执行编译

1
bash compile.sh

大概需要1-2分钟

编译成功后,可以看到新增了一个alist二进制文件
2023-10-12T14:54:32.png

至此,我们已经成功编译好了Alist!

运行

1
2
3
mkdir /alist && cd /alist
cp ~/alist/alist .
chmod +x alist

守护进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat << EOF > /etc/systemd/system/alist.service
[Unit]
Description=alist
After=network.target

[Service]
Type=simple
WorkingDirectory=/alist
ExecStart=/alist/alist server
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

相关命令:

1
2
3
4
systemctl enable alist
systemctl daemon-reload
systemctl start alist
systemctl status alist

设置密码

1
./alist admin set your_password

重启服务

1
systemctl restart alist

最后附上nginx反向代理配置文件

server {
    listen 80;
    server_name 你的域名;
    charset utf-8;   
    location / {
    rewrite (.*) https://你的域名$1 permanent;
      }

}
server {
    charset utf-8;
    listen 443 ssl;
    server_name 你的域名;
    #access_log /alist/access_log;
       location / {
        proxy_pass http://127.0.0.1:5244;
        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;
    }

    ssl_certificate 你的域名证书路径.crt;
    ssl_certificate_key 你的域名证书路径.key;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_prefer_server_ciphers on;
}