阿里云
阿里云大学认证0元起
发表主题 回复主题
  • 168阅读
  • 0回复

[解决方案]社区系统 Icarus 1.3.0

级别: 论坛版主
发帖
370
云币
639

+6376$dC  
:'Xr/| s  
\xeVDKJH+n  
开源协议 &57U? oY  
ZLIB I.9o`Q[8&  
n1?}Xq|  
W>:kq_gT  
免费且商业友好,这个协议基本上和MIT相同。 8f-:d]  
`M)E*G  
A8!Ed$@  
特性 A6i et~h[  
全局 XNlhu^jh  
I+~bCcgPi  
,ey0:.!;  
文件上传(七牛云) N]u2ql&  
>b43%^yii  
]ViOr8u  
超宽屏支持 DM'qNgB7  
*:j-zrwu&  
(Y)!"_|  
简易的移动端支持 pZ\$50t&O  
Rn;VP:HM  
3G.r-  
实时在线人数 Of#K:`1@  
^r4|{  
&SrGh$:X  
Markdown发帖和评论 uOFnCy 4  
)2]a8JVf  
eQ\jZ0s;p  
包含主题、评论、百科内容的全文搜索(基于Elasticsearch) &N9IcNP  
j[H0SBKC  
>|(%2Zl  
用户系统 n. I2$._(b  
|i u2&p >  
(JU_8j!  
注册、登录 qPUA!-'  
Vpw[B.v  
NhCAv +  
邮件激活 (FG^UA#'  
Zd+>  
D>Ua#<52q  
邮箱找回密码 S?2YJ l8B  
L&'l3|  
#EFMgQO  
修改个人信息 F:,#?  
EP(Eq  
0:#7M}U  
上传头像(七牛云) EZ `}*Yrd  
6: GN(R$0  
~ttKI4  
每日签到 IW mHp]  
q#|r   
@ 'Q%Jc(  
个人提醒 POY=zUQ'/  
,$ mLL  
G\):2Qz!|  
论坛  qJURPK  
3r`<(%\  
smbUu/  
扁平化的内容展示 u X> PefR  
Uqr{,-]5v  
"&}mAWT%If  
创建和管理板块 x~nQm]@`h  
YY\Rua/nG  
juXC?2c  
板块主题颜色 @| P3  
}.OxJ=M  
Q+lbN  
发表和编辑主题 uZ-`fcCjD  
K# /Ch5?  
O8iu+}]/6  
文章页动生成快捷导航 5qeT4| Ol  
|KTpK(6p  
FRc  |D  
@功能 3/:LYvM<  
]yw_n^@  
A7.JFf>  
百科 !\3 }R25  
yB|]LYh  
9*f2b.Aj  
自定义侧边栏和主页 ,b.kw}k  
C5BzWgK  
kqQphKkL  
文章的创建和编辑 -`,~9y;tx  
(R,NV3m?w  
{6-;P#Q0_  
全部文章列表 ^u=PdBY  
:v|r=#OI  
2Zv,K-G  
文章历史 xU#]w6  
WT;.>F  
pg5@lC]J  
随机页面 rE!G,^_{  
S(@*3]!q  
;bUJ+6f:  
管理后台 G~Sy&XJuq  
6z1aG9G  
wjN`EF5$}&  
提供对板块、主题、用户、评论的管理 Y8x(#qp,  
a15,'v$O  
Vp5V m  
管理日志 ~e,f)?  
9_g>BI;"8  
WO.}DUfG+  
安全机制 Lf$Q %eM0  
p,M3#^ q  
GapX$Jb,p  
前端密码加密,后端不取得用户的初始密码,最大限度降低了中间人攻击和数据库泄露的危害 /1[}G!  
yfRUTG  
l5":[C$  
后端二次加密,sha512加盐迭代十万次后储存用户密码 yVu^ >  
]6?c8/M  
4OqE.LFu  
密码相关API均有防*破,可设置IP请求间隔和账号请求间隔,分别提升批量撞库和单点*破的难度 Yc. ~qmG/z  
R{2GQB  
ZmYa.4'L  
隐私数据,例如IP地址脱敏后才可存入数据库 -KJ}.q>upq  
;XKo44%  
p``;!3~ ~  
如何部署 :$X4#k<  
内容较多,详见部署文档 5VoOJ_hq  
V29S*  
s%S_K  
升级指南 Qw{\sCH>  
首先停止服务并更新源码。 LB64W ;#h  
ZmR[5 mv@  
.zSimEOF  
然后请寻找 backend/misc/upgrade 目录下对应的升级文件,例如1.2升级1.3使用u12-u13.py。 +r#=n7 t  
/pSUn"3  
6qHvq A,  
在 backend 目录下执行后删除即可。 O>o}<t7  
,h5-rw'  
YWn6wzu%Vc  
注意如果使用了 pipenv 或其他虚拟环境,要在项目对应环境中完成这个操作。 edImrm1f  
bdsHA2r`s  
0.{oA`5N  
然后分别升级前端项目(根目录)和后端项目(backend目录)的项目依赖。 dg'CHxU  
4E>/*F!  
R>YMGUH~w  
如该版本无特别的升级说明,此时直接重新开启服务即可。 F~d7;x =g  
B3g82dm  
A aF5`  
规划 i"\AyKiJ  
由于空闲时间有限,而且是单枪匹马做整个项目的开发。 ;5JIY7t  
T$N08aju#  
* F%ol;|Q  
目前的版本还有一些不完善的地方以及缺少的功能来不及完成,姑且规划如下: D0E"YEo\nv  
MTFVnoZMQ_  
n[cyK$"  
近期: lo]B 5_en  
e2=,n6N]c  
}9+1<mT9a/  
收藏、感谢、点赞 g]PLW3  
@)juP- o%  
I?B,rT3 h  
个人中心 &T{B~i3w8  
zHum&V8=H  
\q d)l  
强化移动端体验 B| 0s4E  
Sy0s `\[  
{msB+n~WZ  
支持用户对评论进行自删和编辑等操作 E#X!*q&  
\g6 # MNW  
*y\tnsU  
后续: ZWe$(?  
.=w`T #L  
[j+0EVwB  
多终端同时登录的支持 uY%3X/^j  
UmI@":|-  
Lzx(!<v  
支持第三方登录 90(oV&  
$6?KH7lA  
XxU}|jTO#  
搭建独立的项目站点 {ZYCnS&?CL  
g8 *|" {  
n\)f.}YD8d  
RSS支持 *l8vCa9Y  
1Y0oo jD  
qmeEUch`  
完善tests /<Nt$n  
#Q)w$WR  
/(L1!BPP9m  
}Ml z\'{  
如何部署项目 S gsR;)2  
首先 clone 项目。 R =c  
%_LHD|<  
J#;m)5[ a%  
git clone https://github.com/fy0/Icarus.git zW&O>H  
下面逐项照做即可。 2"K~:Tm#w  
,O`*AzjS5Q  
U`4Z j1y  
迫于前端安装node_modules等待时间长,在环境安装完成后,前端篇和后端篇可以一起做,以节省时间。 +|w~j#j9`  
J_Xf:Mz-  
8[p6C Jl)  
环境依赖篇 *)SgdC/f  
1. Python 3.6+ Y]Nab0R&  
Windows上直接使用Anaconda3或者官方版本。 ] ]-0RJ=S?  
 -~aEqj#?  
_NN{Wk/3w  
Linux上部分发行版(例如ArchLinux)天然满足要求。 *==nOO9G  
D[y|y 3F  
pjn%CR`;  
对于其他的发行版,首选方案是通过pyenv来安装和管理不同版本的Python: %NoZf^ ?  
gJv^v`X  
|0%UM}  
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash !XC7F UO  
uV:;y}T^Z  
VX%\_@  
# 重新进入终端后,指定版本进行安装 g >oLc6T  
# 或者也可以选择这里不安装,到后面pipenv的时候会有选项自动安装。 V lNzm  
pyenv update &|;!St]!M  
pyenv install 3.6 R>q'Ymu~  
来源:https://github.com/pyenv/pyenv /_(Dq8^g@  
)Ggx  
@jeV[N,0  
或者使用包管理器安装,这是一个 Debian/Ubuntu 解决方案: *?'T8yf^  
v836nxLM  
96j2D8=w  
sudo add-apt-repository ppa:deadsnakes/ppa ?A>-_B  
sudo apt-get update n-_w0Y  
sudo apt-get install -y python3.6 python3.6-dev python3.6-venv _v,n~a}&  
sudo su -c "curl https://bootstrap.pypa.io/get-pip.py | python3.6" `,"Jc<R7Z  
2. NodeJS \I]'6N=  
建议使用LTS版本的 nodejs,通过包管理器安装: ~3 (>_r  
J-c7ZcTt  
Y8(yOVy9  
https://nodejs.org/en/download/package-manager/ PGGJpD?  
>MH@FnUL  
&aOOG8l  
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - E~Nr4vq  
sudo apt-get install -y nodejs yvvR%]!.  
3. PostgreSQL i/Z5/(zF  
官方提供了一系列操作系统的安装解决方案:https://www.postgresql.org/download/ -9EbU7>!  
J)]W[Nk  
~Ua0pS?  
Windows下你可以下载安装包,主流Linux可以使用包管理器添加软件源。 zx*f*L,6F  
^;d;b<  
#oI`j q  
还是以ubuntu举例:https://www.postgresql.org/download/linux/ubuntu/ x uF_^  
Pmb`05\  
teb(\% ,  
# 为 ubuntu 18.04 添加 PG 源 7=9jXNk Y  
sudo su -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main' > /etc/apt/sources.list.d/pgdg.list" dWA7U6c<  
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \ $fKWB5p|()  
  sudo apt-key add - hSmM OS{  
sudo apt-get update _DQdo  
QB3AL; 7  
!=pemLvH  
# 安装PostgreSQL,需要9.6以上版本 n$QFj'  
sudo apt-get install -y postgresql-10 R.@GLx_zpQ  
装好之后做一些配置 u CXd% CzE  
}V{, kK  
[}D)73h`  
sudo su postgres G>j/d7  
psql &IPT$=u  
# 进入 PQ Shell %{Gqhb=u\  
CREATE DATABASE icarus; K^+B"  
CREATE USER icarus WITH PASSWORD 'IcaruStest123'; @gd-lcMYW  
GRANT ALL ON DATABASE icarus TO icarus; 8eNGPuoL)  
\c icarus; 8wOr`ho B  
CREATE EXTENSION IF NOT EXISTS hstore; QnqX/vnR  
CREATE EXTENSION IF NOT EXISTS citext; !u"Hf7/  
4. Redis zI(Pti  
一般直接使用包管理器安装就可以了。 |kn}iA@72p  
S $Wd}2>  
pw,.*N3P  
Windows上可以使用微软提供的二进制版本 =~)n,5  
<"-sN  
E ?-K_p  
后端篇 5g=" #  
建议使用 pipenv 进行部署,首先切到backend目录,执行: aaBBI S  
x-"7{@lz  
^m~=<4eX  
sudo pip3.6 install pipenv W{%M+a[#l  
pipenv install Y\rKw!u_!  
不过有个问题就是 pipenv 太慢,总是在 Locking。 = #`FXO1C  
TS-[p d  
]2<g"zo0  
可以灵活使用 --skip-lock 参数跳过 Locking 阶段。 }.Ug`7%G  
U|>Js!$  
\"Np'$4eu  
或者使用requirements.txt进行比较传统的安装。 pG (8VteH  
x@/ !H<y  
V{8mx70  
特别地,在Windows上安装aioredis库时可能会遇到依赖的hiredis包无法安装的问题 ,HkJ.6KF  
如果是anaconda用户,那么可以使用: _|F h^hq  
@? t)UE  
-+z^{*\; N  
conda config --append channels conda-forge   {5,CW  
conda install hiredis >yaRz+  
来进行安装。 P\Ka'i  
如果不是anaconda用户,那么可以直接访问 https://anaconda.org/conda-forge/hiredis/files /rquI y^  
直接下载.tar.bz2压缩包把里面的site-packages/hiredis解压出来放到自己的site-packages即可 ej0q*TH.  
|{$Vk%cUE  
[[Z*n/tr  
环境装完之后,这样启动服务: +UB. M  
~;MRQE  
/u?^s "C/  
pipenv shell f\ Qi()  
python main.py FvRog<3X  
运行 backend 目录下的 main.py,初次运行会创建自动 private.py 并退出。 x]F:~(P  
-ohqw+D  
-&+[/  
private.py 里的内容会覆盖 config.py 中的配置。 WzF/wzR  
|_Vlw&qu+  
%/4ChKf!VR  
在初次创建后,用编辑器打开,逐项对内容进行修改,使其符合你机器的实际情况即可。 C}7Sh6  
/CH*5w)1   
"zv?qS  
前端篇 =ove#3  
# 安装项目依赖 mzDbw-#  
cd Icarus [/'W#x  
npm install <"6 }C)G  
迫于安装时间过长,国内可以使用cnpm: li(g?|AD  
'};pu;GA7  
4v Ug:'DM  
npm install -g cnpm --registry=https://registry.npm.taobao.org g%Eb{~v  
cnpm install G8j$&1`:  
如果只是开发环境下看看效果,那么在后端已经跑起来的情况下: \#L}KW  
86oa>#opU  
Y'0H2B8  
npm run serve }qxw Nmx  
然后在浏览器中查看即可。 EP,lT.u3  
y$'(/iyz  
z`XX[9$qm  
扩展篇:Nginx部署 4 1q|R[js!  
如果需要配置外部访问(注意!只是开发则不需要),可以按如下步骤操作: 8a)lrIg  
> <^ ,  
:A"GO c,  
我们的目标是将前端挂在某个域名或端口上,然后将后端挂在同一域名的/api下。 V_^p?Fi #  
N 8 n`f  
DJR_"8  
以此直接绕过同源策略的相关内容,简化配置。这也就是“单端口方案”的含义。 t[ cHdI  
=)!sWY:  
zb.dVK`7N-  
首先,在 Icarus 目录下新建一个 private.js,并按照下例进行填写: fgdqp8~  
WS6'R    
EZypqe):/C  
// 单端口方案 _TEjB:9eY  
var host = window.location.host 4SlEc|'7@  
~lib~Y'-  
'*lVVeSiFw  
export default { Y`3V&8X  
    remote: { =# 0f4z  
        API_SERVER: '//' + host, a]\l:r  
        WS_SERVER: 'ws://' + host + '/ws', 4MUN1/DId`  
    } ?h\fwF3  
} :J6 xYy$  
npm run build K,j'!VQA4g  
生成dist目录备用。 F#=M$j_  
17la/7l<  
bY&!d.  
随后是nginx的配置,当然你要首先安装它。 A1g.ww:  
G{CKb{  
4M*Z1  
我已经写好了配置文件的模板,只要简单改改放进配置目录就可以了。 l$Y*ii  
4Dy|YH$>S  
#;D@`.#\  
这里使用的是单端口绑定前后端,整站使用 9001 向外网提供服务(但后端仍要对内开一个端口)。 fQQj2> 3w  
/Vdu|k=  
:_k5[KT.]9  
在将前端静态目录映射到/的同时,将后端所在的9999端口映射到/api。 YC[c QX  
WF] |-)vw  
{^":^N)  
这样前端页面访问 /api 就是访问后端了,也不存在跨域问题。 9x`1VR :  
z94#:jPmG  
L;h|Sk]{  
sudo apt install nginx A3^_'K  
cd Icarus (h"-#q8$  
sudo cp misc/icarus-1port.conf /etc/nginx/conf.d/ ;vG%[f`K  
随后编辑 /etc/nginx/conf.d/icarus-1port.conf,将 >npTUOGL=n  
ULH<FDot  
dk/f_m  
# root /home/{user}/Icarus/dist; C <Pd_&  
修改为正确的路径,重启服务: v` h n9O  
+I3j 2u8L  
Pj8W]SA_  
sudo service nginx restart ]w0_!Z&  
访问服务器IP的9001端口,就可以看到最上面截图中的画面了。 fG zx;<0P!  
I= 2jQ>$Q  
|@5G\N-  
第一个注册的用户将自动成为管理员。 +;T\:'CU  
#+&"m7 s  
}Q a  
扩展篇:开启全文搜索与关联推荐功能 < &kl:|  
这事情简单,首先在机器上安装ES: :.= #U  
'""s%C+  
v]\T&w%9  
https://www.elastic.co/downloads/elasticsearch CC)Mws+2  
.On3ZN  
Ax6zx  
然后搞到中文分词插件: B[~Q0lPih  
&o]fBdn  
<Uu[nUJ  
https://github.com/medcl/elasticsearch-analysis-ik/releases iUbcvF3aP  
Dtox/ ,"  
YpgO]\/w  
并将分词插件解压在ES插件目录,例如your-es-root/plugins/ik,然后把ES开起来: G<P/COI#M5  
N)/7j7c~;  
7+Er}y>  
# 超低配版,最小内存256M,最大1G _yp<#q]  
# 根据自己服务器情况酌情调整参数 >y+?Sz!  
cd elasticsearch-6.5.1 P6")OWd  
ES_JAVA_OPTS="-Xms256m -Xmx1g" ./bin/elasticsearch ]c1#_MW  
请注意两者版本需要一一对应,如果ES版本过新(更新非常频繁),后者可能尚未来得及更新。 F$ckW'V  
{Y3:Y+2X3*  
F-XMy>9  
随后在第一次执行main.py自动生成的private.py中修改这一段的内容: CDY3+!  
g'Wr+( A_  
Wngc(+6O&  
SEARCH_ENABLE = False vR (nd  
ES_INDEX_NAME = 'icarus-index' G.r =fNP  
ES_HOSTS = [{ 3lbGG42:  
    "host": "localhost", 9rIv-&7'm  
    "port": 9200 _C=01 %/  
}] OKAmw >{  
最省事可以只改一个: 8?rq{&$t  
i*8j|  
(,tL(:c  
SEARCH_ENABLE = True o=-Af|#b  
然后在backend目录下运行: l GJN;G7  
Md0`/F:+2  
G5lBCm   
pipenv shell zcuz @  
python3.6 misc/force_refresh_elasticsearch.py a5(9~. 9  
完成,重启后端进程main.py即可应用。  N!Xn)J  
GPx+]Jw8\  
P~V ^Efz{  
项目地址:https://github.com/fy0/Icarus Od~ e*gA8  
)NTpb  
eep/96G ?  
[ 此帖被寒喵在2019-01-01 00:15重新编辑 ]
本人不是云栖社区工作人员。
无论您在使用中遇到什么问题,不要出言不逊!谢谢合作!
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个