从入门到放弃,类似于4chan的专业开源画板程序-vichan,附上安装和配置教程。
这篇文章介绍了另外一款开源的类似于4chan的画板程序-tinyib
但是相对来讲,tinyib的功能不是那么强大,tinyib只是一个4chan功能的基本实现
而这款类似于4chan的专业实用强大的开源画板程序-vichan,则是专业级的。
vichan 是一个免费的轻量级、快速、高度可配置和用户友好的图像板软件包。它是用 PHP 编写的,几乎没有依赖项。 从官方公告来看,vichan 应该是已经完全停止开发了,除了安全性漏洞的修复外。官方不建议使用vichan ,但是同时也表示不排除将来会推到vichan进行重构。
vichan的安装要求
- PHP >= 5.4(我们仍然尽量保持与 php 5.3 的兼容性)明确支持 PHP 7.0。PHP 7.2 也可以工作,但可能会导致尚未报告的错误。
- MySQL/MariaDB 服务器
- mbstring
- PHP GD
- PHP PDO
- 类 Unix 操作系统,最好是 FreeBSD 或 Linux
- PHP composer
我们试图确保 vichan 与所有主要的 Web 服务器兼容。vichan 不包含 Apache.htaccess文件,也不需要它
推荐的数据库和缓存
- MySQL/MariaDB 服务器 >= 5.5.3
- ImageMagick(首选命令行 ImageMagick 或 GraphicsMagick)。
- APC(替代 PHP 缓存)、 XCache或 Memcached
- 测试使用了memcached和redis两种缓存服务器,感觉使用redis缓存服务器响应最快。
安装
- 下载 vichan 并将其解压缩到您的 Web 目录或获取最新的开发版本:
git clone git://github.com/vichan-devel/vichan.git
2. `composer install`在目录中运行
3. 在您的网络浏览器中导航`install.php`并按照提示进行操作。
4. 现在应该安装 vichan。`mod.php`使用默认的用户名和密码组合登录:admin **/ password** 。
请记住更改管理员帐户密码。
后台管理地址是doumain.com/mod.php
//这里安装脚本有点问题,建议直接先导入install.sql数据到数据库,
然后直接修改网站根目录下的inc/instance-config.php文件数据库名称,用户名和密码
下面就开始配置vichan了,vichan的根配置文件是inc/config.php文件,通常不建议去修改它
而是使用inc/instance-config.php文件来配置vichan的功能。
vichan非常强大,你可以使用inc/instance-config.php实现不同板块的功能,
比如创建了/demo/分类和/twodemo/分类,那么修改inc/instance-config.php文件复制到两个分类下
即可实现/demo/分类和/twodemo/分类下的不同权限和功能的实现。
下面是折腾了两天测试和使用后没有问题vichan的inc/instance-config.php文件配置代码
iShot_2022-05-27_10.36.19.png

<?php
/*
* Instance Configuration
* ----------------------
* Edit this file and not config.php for imageboard configuration.
*
* You can copy values from config.php (defaults) and paste them here.
*/
// 數據庫配置
$config['db']['type'] = 'mysql';
$config['db']['server'] = '127.0.0.1';
$config['db']['user'] = '数据库用户名';
$config['db']['password'] = '数据库用户名密码';
$config['db']['database'] = '数据库名称';
$config['db']['persistent'] = true; //永久链接
$config['db']['timeout'] = 60;
//全局公告
$config['global_message'] = 'Don\'t touch porn anyting! Dou\' touch Child Porn!thank you!';
//緩存和排錯,更新
$config['check_updates'] = true;
$config['check_updates_time'] = 43200; // 12小时
$config['debug'] = false;
$config['verbose_errors'] = false;
$config['deprecation_errors'] = false;
$config['debug_explain'] = false;
$config['has_installed'] = '.installed';
$config['syslog'] = true;
$config['fcrdns'] = true;
$config['cache']['enabled'] = 'redis';
$config['cache']['timeout'] = 60 * 1;
$config['cache']['redis'] = array('127.0.0.1', 6379, '', 1);
$config['cache_config'] = false;
$config['lock']['enabled'] = 'redis';
$config['queue']['enabled'] = 'redis'; // xD
//Cookie 设置
$config['cookies']['mod'] = 'mod';
$config['cookies']['js'] = 'serv';
$config['cookies']['path'] = '/';
$config['cookies']['expire'] = 60 * 60 * 24 * 30 * 1;
$config['cookies']['salt'] = 'oF^A3!DkK!cyjMQfbL%sWTWAUf!EfJ@um!v$n4X72H()';
$config['cookies']['httponly'] = true;
$config['secure_trip_salt'] = ')(mCb3&7ZvCNt59SSDJyy4MVgeNP&47Wy\zhL@%jWv%';
//防止拉圾信息
$config['anti_bump_flood'] = true;
$config['spam']['hidden_inputs_min'] = 4;
$config['spam']['hidden_inputs_max'] = 12;
$config['spam']['hidden_inputs_max_pass'] = 12;
$config['spam']['hidden_inputs_expire'] = 60 * 60 * 3;
$config['spam']['unicode'] = true;
$config['spam']['hidden_input_names'] = array(
'user',
'username',
'login',
'search',
'q',
'url',
'firstname',
'lastname',
'text',
'message'
);
$config['spam']['valid_inputs'] = array(
'hash',
'board',
'thread',
'mod',
'name',
'email',
'subject',
'post',
'body',
'password',
'sticky',
'lock',
'raw',
'embed',
'g-recaptcha-response',
'captcha_cookie',
'captcha_text',
'spoiler',
'page',
'file_url',
'json_response',
'user_flag',
'no_country',
'tag'
);
$config['captcha']['enabled'] = false;
$config['recaptcha'] =true;
$config['recaptcha_public'] = '自行到谷歌后台创建';
$config['recaptcha_private'] = '自行到谷歌后台创建';
//https://www.google.com/recaptcha/admin/create //适用v2版本,v3版本没有测试
$config['new_thread_capt'] = false; //为ture是会启用系统自带验证码而不是谷歌验证码
$config['proxy_check'] = true;
$config['proxy_save'] = true;
$config['filters'][] = array(
'condition' => array(
'flood-match' => array('ip', 'body'), // Match IP address and post body
'flood-time' => &$config['flood_time_ip'],
'!body' => '/^$/', // Post body is NOT empty
),
'action' => 'reject',
'message' => &$config['error']['flood']
);
$config['filters'][] = array(
'condition' => array(
'flood-match' => array('file'), // Match file hash
'flood-time' => 60 * 2 // 2 minutes minimum
),
'action' => 'reject',
'message' => &$config['error']['flood']
);
$config['filters'][] = array(
'condition' => array(
'name' => '/^关键词$/',
'body' => '/关键词2,\s+(the )?s关键词3$/i',
'OP' => false
),//关键词过滤,如果发布内容包含上门的字符就会被丢弃
'action' => 'ban',
'add_note' => true,
'expires' => 60 * 60 * 3, // 3 hours
'reason' => 'Go away, spammer.'
);
$config['flood_cache'] = 60 * 60 * 2;
// 发布设置‘
$config['force_body'] = true;
$config['force_body_op'] = true;
$config['force_image_op'] = false;
$config['strip_superfluous_returns'] = true;
$config['strip_combining_chars'] = true;
$config['max_body'] = 1800;
$config['body_truncate'] = 15;
$config['body_truncate_char'] = 2500;
$config['max_links'] = 20;
$config['max_cites'] = 30;
$config['max_cross'] = $config['max_cites'];
$config['track_cites'] = true;
$config['max_filename_len'] = 255;
$config['max_filename_display'] = 30;
$config['allow_delete'] = true;
$config['delete_time'] = 10;
$config['reply_limit'] = 250;
$config['image_hard_limit'] = 0;
$config['reply_hard_limit'] = 0;
$config['robot_enable'] = true;
$config['robot_strip_repeating'] = true;
$config['robot_mute'] = true;
$config['robot_mute_hour'] = 336;
$config['auto_unicode'] = true;
$config['markup_urls'] = true;
$config['allow_upload_by_url'] = false;
$config['early_404'] = false;
$config['early_404_page'] = 3;
$config['early_404_replies'] = 5;
$config['early_404_staged'] = false;
$config['field_disable_name'] = true;
$config['field_disable_email'] = true;
$config['field_disable_subject'] = false;
$config['field_disable_reply_subject'] = false;
$config['field_disable_password'] = true;
$config['slugify'] = false;
$config['slug_max_size'] = 80;
//标记设置
$config['markup'][] = array("/'''(.+?)'''/", "<strong>\$1</strong>");
$config['markup'][] = array("/''(.+?)''/", "<em>\$1</em>");
$config['markup'][] = array("/\*\*(.+?)\*\*/", "<span class=\"spoiler\">\$1</span>");
$config['markup'][] = array("/^[ |\t]*==(.+?)==[ |\t]*$/m", "<span class=\"heading\">\$1</span>");
$config['markup_code'] = false;
$config['markup_repair_tidy_bare'] = true;
$config['always_regenerate_markup'] = false;
// 图像设置
$config['max_images'] = 1;
$config['multiimage_method'] = 'split';
$config['thumb_width'] = 255;
$config['thumb_height'] = 255;
$config['thumb_op_width'] = 255;
$config['thumb_op_height'] = 255;
$config['thumb_ext'] = 'png';
$config['thumb_keep_animation_frames'] = 1;
$config['thumb_method'] = 'convert';
$config['convert_args'] = '-size %dx%d %s -thumbnail %dx%d -auto-orient +profile "*" %s';
$config['convert_auto_orient'] = false;
$config['convert_manual_orient'] = false;
$config['ie_mime_type_detection'] = '/<(?:body|head|html|img|plaintext|pre|script|table|title|a href|channel|scriptlet)/i';
$config['allowed_ext'][] = 'jpg';
$config['allowed_ext'][] = 'jpeg';
$config['allowed_ext'][] = 'bmp';
$config['allowed_ext'][] = 'gif';
$config['allowed_ext'][] = 'png';
$config['allowed_ext'][] = 'webp';
$config['file_thumb'] = 'static/%s';
$config['spoiler_image'] = 'static/spoiler.png';
$config['image_deleted'] = 'static/deleted.png';
$config['minimum_copy_resize'] = false;
$config['max_filesize'] = 1 * 1024 * 1024; // 1MB
$config['max_width'] = 4096;
$config['max_height'] = $config['max_width'];
$config['image_reject_repost'] = true;
$config['image_reject_repost_in_thread'] =true;
$config['show_filename'] =false;
$config['gnu_md5'] = true;
//显示设置
$config['mod']['shadow_name'] = false;
$config['anonymous'] = '匿名';
$config['threads_per_page'] = 10;
$config['max_pages'] = 10;
$config['threads_preview'] = 5;
$config['threads_preview_sticky'] = 1;
$config['board_abbreviation'] = '/%s/';
$config['report_limit'] = 3;
$config['allow_subtitle_html'] = false;
$config['locale'] = 'zh_TW';
$config['timezone'] = 'Asia/Macau';
$config['post_date'] = '%y/%m/%d / %H:%M:%S';
$config['ban_date'] = '%A %e %B, %Y';
$config['button_newtopic'] = _('新話題');
$config['button_reply'] = _('新回覆');
$config['thread_subject_in_title'] = false;
//$config['footer'][] = _('所有本頁上的商標、著作權、留言、圖片、軟體分別為當事人所擁有並負責.');
//添加页脚声明
$config['genpassword_chars'] = 'jX4TctfVswFprFRtAfNGEWni57Lsz$hv$s9%fUATd$fQhLs@tto&5esxmfd$mBgPfm()_+';
// available stylesheets (or create your own).
$config['stylesheets']['Yotsuba B'] = ''; // Default; there is no additional/custom stylesheet for this.
$config['stylesheets']['Yotsuba'] = 'yotsuba.css';
$config['stylesheets']['Futaba'] = 'futaba.css';
$config['stylesheets']['Dark'] = 'dark.css';
$config['default_stylesheet'] = array('Yotsuba B', $config['stylesheets']['Yotsuba B']);
$config['stylesheets_board'] =true;
$config['font_awesome'] = true;
$config['font_awesome_css'] = 'stylesheets/font-awesome/css/font-awesome.min.css';
$config['boards'] = array(
array('分类14', '分类15'),
array('分类1', '分类2', '分类3', '分类4', 'g'),
array('h', 'i', 'j'),
array('k', array('l', 'm')),
//array('status' => 'http://status.example.org/')
);//添加链接到网站头部导航
$config['boardlist_wrap_bracket'] = false;
$config['page_nav_top'] = true;
$config['catalog_link'] = 'catalog.html';
$config['minify_html'] = true;
//视频嵌入,通过修改和自定义支持任何网站,比如P站。
$config['enable_embedding'] = true;
$config['embedding'] = array(
array(
'/^https?:\/\/(\w+\.)?youtube\.com\/watch\?v=([a-zA-Z0-9\-_]{10,11})(&.+)?$/i',
'<iframe style="float: left; margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" id="ytplayer" src="https://www.youtube.com/embed/$2"></iframe>'
),
array(
'/^https?:\/\/(\w+\.)?vimeo\.com\/(\d{2,10})(\?.+)?$/i',
'<iframe style="float: left; margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" src="https://player.vimeo.com/video/$2"></iframe>'
),
array(
'/^https?:\/\/(\w+\.)?dailymotion\.com\/video\/([a-zA-Z0-9]{2,10})(_.+)?$/i',
'<iframe style="float: left; margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" src="https://www.dailymotion.com/embed/video/$2" allowfullscreen></iframe>'
),
array(
'/^https?:\/\/(\w+\.)?metacafe\.com\/watch\/(\d+)\/([a-zA-Z0-9_\-.]+)\/(\?[^\'"<>]+)?$/i',
'<iframe style="float: left; margin: 10px 20px;" width="%%tb_width%%" height="%%tb_height%%" frameborder="0" src="https://www.metacafe.com/embed/$2/$3/" allowfullscreen></iframe>'
),
array(
'/^https?:\/\/(\w+\.)?vocaroo\.com\/([a-zA-Z0-9]{2,12})$/i',
'<iframe style="float: left; margin: 10px 20px;" width="300" height="60" frameborder="0" src="https://vocaroo.com/embed/$2"></iframe>'
)
);
// Embedding width and height.
$config['embed_width'] = 300;
$config['embed_height'] = 246;
//靜態文件
$config['file_index'] = 'index.html';
$config['file_page'] = '%d.html'; // NB: page is both an index page and a thread
$config['file_page50'] = '%d+50.html';
$config['file_page_slug'] = '%d-%s.html';
$config['file_page50_slug'] = '%d-%s+50.html';
$config['file_mod'] = 'mod.php';
$config['file_post'] = 'post.php';
$config['file_script'] = 'main.js';
// Board directory, followed by a forward-slash (/).
$config['board_path'] = '%s/';
// Misc directories.
$config['dir']['img'] = 'src/';
$config['dir']['thumb'] = 'thumb/';
$config['dir']['res'] = 'res/';
$config['dir']['template'] = getcwd() . '/templates';
// Location of Tinyboard "themes".
$config['dir']['themes'] = getcwd() . '/templates/themes';
// Same as above, but a URI (accessable by web interface).
$config['dir']['themes_uri'] = 'templates/themes';
// Home directory. Used by themes.
//$config['dir']['home'] = '';
// "## Admin" makes everything red and bold, including the name and tripcode:
$config['custom_capcode']['Admin'] = array(
'<span class="capcode" style="color:red;font-weight:bold"> ## %s</span>',
'color:red;font-weight:bold', // Change name style; optional
'color:red;font-weight:bold' // Change tripcode style; optional
);
$config['mod']['dns_lookup'] = true;
// Number of posts to display on the reports page.
$config['mod']['recent_reports'] = 10;
// Number of actions to show per page in the moderation log.
$config['mod']['modlog_page'] = 350;
// Number of bans to show per page in the ban list.
$config['mod']['banlist_page'] = 350;
// Number of news entries to display per page.
$config['mod']['news_page'] = 40;
// Number of results to display per page.
$config['mod']['search_page'] = 200;
// Number of entries to show per page in the moderator noticeboard.
$config['mod']['noticeboard_page'] = 50;
// Number of entries to summarize and display on the dashboard.
$config['mod']['noticeboard_dashboard'] = 5;
$config['mod']['rebuild_timelimit'] = 120;
$config['mod']['raw_html_default'] = false;
$config['mod']['dismiss_reports_on_lock'] = true;
$config['mod']['config_editor_php'] = false;
//公共页面
$config['search'] = array();
$config['search']['enable'] = false;
$config['board_search'] = false;
$config['search']['queries_per_minutes'] = Array(15, 2);
$config['search']['queries_per_minutes_all'] = Array(20, 2);
$config['search']['search_limit'] = 10;
$config['public_logs'] = 1;
$config['api']['enabled'] = false;
$config['meta_keywords'] = '生活,成人,健康,音樂,電影,軟體,程序,工具,娛樂';
$config['purge_timeout'] = 3;
$config['gzip_static'] = true;
$config['board_regex'] = '[0-9a-zA-Z$_\x{0080}-\x{FFFF}]{1,58}';
$config['youtube_js_html'] = '<div class="video-container" data-video="$2">'.
'<a href="https://youtu.be/$2" target="_blank" class="file">'.
'<img style="width:360px;height:270px;" src="//img.youtube.com/vi/$2/0.jpg" class="post-image"/>'.
'</a></div>';
$config['password_crypt'] = '$6$rounds=25000$';
$config['password_crypt_version'] = 1;
?>
iShot_2022-05-27_10.37.40.png

为什么说4chan从入门到放弃?事实上一直都想搭建一个干净的交流平台
找到志同道合,或者可以让人干净分享生活,工作点滴的平台
经过两天的思考,最终决定还是放弃了,想想有再牛逼技术的程序员都放弃构建自己的交流平台
一是非常耗费自己的时间,而来就是你真的无法去管理网络的复杂性和可控性
所以更不可能去搭建一个匿名的网络平台了,
官方代码仓库
https://github.com/vichan-devel/vichan
有兴趣可以看看。