baota宝塔docker制作

这两天瞎折腾,因为数据库不一致的问题,一气之下把baota image删掉了,很多跟数据库相关的服务都歇了。

宝塔自用,在nas环境配合下数据库,搞个网络环境还是很方便的。

再重新拉取baota镜像时,发现怎么也访问不了,看日志,也没发现什么线索,所以才萌生了自己搞个docker的念头,主要是想定位下问题。

根据官方 www.bt.cn 最新的安装脚本制作了最新的 docker镜像:
https://gitlab.com/hiproz/baota-centos7-docker

特点:

  1. 和一般宝塔docker不同的是,采用延后安装的方式,支持将整个/www暴露出来,这样就可以将应用数据特别是数据库数据映射到用户空间,不至于不小心删除docker时,整个数据库数据丢失。
  2. 支持自动重新安装,如果系统发生未知问题,无法通过系统内更新,可以通过外部脚本的need_update 来更新。

docker的使用

docker run -tid --name baota --restart always -v /your-local-dir:/www -p your-local-port:8888 registry.gitlab.com/hiproz/baota-centos7-docker

安装进度日志

查看 run.log

默认登录路径和账号密码

查看映射路径下的default.txt, 注意要使用实际映射的端口,default.txt显示的是系统内部的端口。

PowerDNS和BIND/named的区别

  • PowerDNS supports DNSSEC in DNS clustering, while BIND/named does not.
  • PowerDNS uses the pdns_control utility to control the nameserver functions, while BIND/named uses rndc to administer these functions.
  • PowerDNS does not provide a recursive/caching nameserver and thus requires external nameservers in the resolv.conf file, while BIND/named does provide a recursive/caching nameserver.

unraid安装qbittorrent

  1. 从unraid的apps商店安装, 一般选择linuxserver,默认安装就可以
  2. 要点是端口设置
    file

    • port是你访问的端口也就是docker映射的外部端口,理论上可以是任何合理的端口,但是发现8080稳定,至于为什么,等你不好用时再来体会
    • WEBUI_PORT 这个表示是docker内部的服务端口,只能是8080,刚开始不理解,走了很多弯路,怎么也不通

通过homeassistant将ip camera接入苹果homekit

最近在淘宝买了个tplink的ipc玩,买的时候是冲着onvif的,实际测试下,根本是骗人的,不支持onvif,本来想着退掉,后来研究了下,猜出来了rtsp的地址,也就凑合着用了。

在实现了通过rtsp全天录像后,今天想玩下通过HomeaAssistant把摄像头接入苹果homekit. 特将过程整理分享出来,供大家参考。

整个步骤如下:

  1. 安装HA,这个参考网上的教程就可以,基本都能通。我的HA是安装在unraid中,所以使用的是docker方式安装的。
  2. 添加摄像头,先用手机模拟了一台http流的,另一台tp的是rtsp流的,因为没法通过硬件品牌的官方网关接入HA,所以都是通过修改HA配置直接接入HA的。
  3. console登录进HA,编辑/config/configuration.yaml
  4. http格式视频流:
    android_ip_webcam:
    - host: 192.168.xx.xx
  5. rtspshi视频流:
    camera:
    - platform: ffmpeg
     input: -rtsp_transport tcp -i rtsp://xx:xx@192.168.xx.xx/xx
     name: tp-cam
  6. 重启HA。
  7. 如果配置有错误,参看日志,根据日志定位,一般的就是配置文件的错误。
  8. 在HA中,设置=》设备与服务=》添加集成,选择HomeKit,然后下一步选择域,这里我们只关注camera类型:
    file
    file
  9. 下一步,选择区域,默认卧室或者客厅,然后“完成”。
  10. 成功后在HA的左下角通知栏中就会出现二维码的通知:
    file
  11. 通过苹果手机的“家庭”,点击“+”号,扫描HA通知中的二维码,就完成了HA中设备和HomeKit的绑定,然后就可以在苹果“家庭”应用中看到刚才绑定的摄像头数据了。

以上就基本完成了通过HA绑定到苹果的目的,但这个时候HA的首页还是空的,如果想在首页展示摄像头,需要点击web页面右上角的 “编辑仪表盘”=》“添加卡片”,自己选择编辑才会出现摄像头的实时视频,刚开始在这一步迟疑了好久,以为配置成功了设备就应该自己出现在HA的首页。
file
点击进入详情,相机实体中,选择实际添加的相机,就可以。

git personal token issue

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.

fix:

git remote set-url origin  https://tokenj@github.com/username/reponame.git/

unraid下安装shinobi

shinobi是一个nvr服务器,可以自己搭配ipc和各种手机app使使用,结合unraid的存储,就是一台超级存储容量的NVR录像机了,比收费的云存合适多了。

docker:spaceinvaderone/shinobi_pro_unraid:latest

按照默认的配置安装就可以了。

安装后,登陆super账户: xxx:xxx/super,账号是在docker安装时设置的,默认 admin password

登陆后可能会提示mysql没有运行,实际是数据库配置没生效:
https://hub.shinobi.video/articles/view/wcz3OabYEfOhS7h

  1. Navigate to your Shinobi directory

    cd /home/Shinobi
  2. Open the MariaDB/MySQL Terminal client
    mysql

  3. Load the SQL files. framework.sql is the database architecture. user.sql are the credentials for Shinobi to connect to the database.

    source sql/framework.sql;
    source sql/user.sql;
  4. Exit the SQL client

    exit;
  5. If you need to enable the mysql database type you can run the following.

    node tools/modifyConfiguration.js databaseType=mysql
  6. restart shinobi

    pm2 restart all

addr2line

xxxx-addr2line.exe -e xxxx/xxx.so addr1 addr2

支持多个地址,addr1 和addr2表示2个地址,可以参看崩溃的日志:

backtrace:
 #00 pc addr1 xxx
 #01 pc addr2 xxx

addr1,addr2 表示离so首地址的偏移量

c语言不常用写法集锦

想说奇淫技巧来着,想着其实只是些不常见的写法而已,并不值得推崇和觉得高明,只是整理出来给大家涨个见识,看个乐而已。

不用memset和bzero清零结构体

t_mystruct mystruct = {};

或者

t_mystruct mystruct;
mystruct = (t_mystruct){};

index[array]来替代array[index]

int ft_strlen(char *str) {
    int i = 0;
    while (i[str])
        ++i;

    return i;
}

负索引数组

#include <limits.h>   // INT_MAX
#include <stdio.h>    // printf

int main(void) {
    int x[2001];
    int *y = &x[1000];

    (void)x;
    y[-10] = 5;
    printf("%d\n", y[-10]);
}