当前位置: 首页 > article >正文

搭建开源笔记平台:outline

折腾的意义

为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。

其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完全在自己服务器的笔记呢。

开始搭建

这个搭建是真的麻烦,需要一堆东西:

  • redis
  • postgresql
  • minio
  • keycloak

这种依赖多镜像的平台一般推荐docker-compose来搭建,不过我还是喜欢使用docker一个容器一个容器的启动。postgre和redis的容器其实可以复用,没必要每次都重新启动一个,使用docker-compose也可以通过环境变量传递。

docker可用源可以看:https://www.wangdu.site/course/2109.html,我现在用的是docker.mybacc.com,只需要在pull镜像的时候加上,然后重命名一下镜像就可以,源失效的太快,每次改源文件更麻烦。

另外因为证书的申请需要80/443端口,而我使用的是本地电脑没有公网的80和443端口,所以只能部署http的服务,测试会无法使用邮箱登录。

redis

docker pull docker.mybacc.com/redis:7.4.2-alpine

docker tag docker.mybacc.com/redis:7.4.2-alpine redis:7.4.2-alpine

docker rmi docker.mybacc.com/redis:7.4.2-alpine

docker run -d \--name redis \-p 6379:6379 \-v ~/docker-data/redis-data:/data \redis:7.4.2-alpine \redis-server --save 60 1 --loglevel warning --requirepass 密码
postgresql

docker pull docker.mybacc.com/postgres:15.12

docker run -d \--name postgres \-e POSTGRES_PASSWORD=密码 \-e POSTGRES_USER=用户名 \-v ~/docker-data/postgres-data:/var/lib/postgresql/data \-p 5432:5432 \postgres:15.12
minio

https://github.com/minio/minio

这是个文件服务,在outline里做图床用的。直接复制图片到网页里就能上传到minio,不过删除好像需要到minio删除,这个后面研究。

docker pull minio/minio:RELEASE.2025-03-12T18-04-18Z

docker run -d \--name minio \-p 29000:9000 \-p 29001:9001 \-e MINIO_REGION_NAME="cn-homelab-1" \-e MINIO_ROOT_USER="minio用户名" \-e MINIO_ROOT_PASSWORD="minio密码" \-v ~/docker-data/minio-data:/data \minio/minio:RELEASE.2025-03-12T18-04-18Z server /data --console-address ":9001"

创建完成后新建一个名为outline的Buckets,填个名称就行,其他的都默认。

然后设置Region(如果启动的时候给定了MINIO_REGION_NAME环境变量,这里应该有值了),名称随意,保存之后会提示需要重启,点击重启就保存成功了。这个值是后面的AWS_REGION的值

keycloak

https://github.com/keycloak/keycloak

这个是有什么用的就说来话长,反正在outline里就起个登录作用。

docker run -d \--name keycloak \-p 8080:8080 \-e KC_DB=postgres \-e KC_DB_URL=jdbc:postgresql://ip:端口/数据库名称 \-e KC_DB_USERNAME=数据库用户名 \-e KC_DB_PASSWORD=数据库密码 \-e KC_BOOTSTRAP_ADMIN_USERNAME=keycloak用户名 \-e KC_BOOTSTRAP_ADMIN_PASSWORD=keycloak密码 \keycloak/keycloak:26.1.4 start-dev
  • KC_DB: 要使用的数据库,支持的类型有: mariadb、mssql、mysql、oracle、postgres。如果使用的时候有问题,可以换官网推荐的版本
  • KC_DB_URL: 数据库链接,数据库需要自己建
  • KC_DB_USERNAME:数据库的用户名
  • KC_DB_PASSWORD:数据库的密码
  • KC_BOOTSTRAP_ADMIN_USERNAME:keycloak的用户名,自己设置
  • KC_BOOTSTRAP_ADMIN_PASSWORD:keycloak的密码,自己设置

启动的时候有个红色的提示,只是让你不要在生产环境下使用开发者模式(start-dev)。不过要是使用start启动的话会强制https,比较麻烦。当然你也可以使用steveltn/https-portal镜像来一键配置HTTPS,需要80和443端口才能申请证书.

刚启动的时候通过8080端口访问web界面会出现HTTPS required的提示,导致无法正常登录,可以通过进入到容器的shell,执行两个命令来忽略它

docker exec -it keycloak bash
/opt/keycloak/bin/kcadm.sh config credentials --server http://localhost:8080 --realm master --user 用户名
然后输入设置的密码,再执行下面这行
/opt/keycloak/bin/kcadm.sh update realms/master  -s sslRequired=NONE

接着刷新页面就可以正常登录了,然后开始创建realm,名称填outline

接着再outline下创建Clients

第三步的值需要填你outline部署的地址,可以加端口,例如下面的

Root URL: http://xxxx.example.com:3000/
Home URL: http://xxxx.example.com:3000/
Valid redirect URIs: http://xxxx.example.com:3000/*

然后复制Credentials选项卡的Client Secret内容,这个是下面要用到的OIDC_CLIENT_SECRET

接着创建一个用来登录的用户,后面就是跳转到keycloak然后用这个用户登录进去

然后设置这个用户的密码,这个Temporary的选项可以关了,开启的话用户第一次登录需要修改密码

这里还需要禁用outline下的ssl

docker exec -it keycloak bash
/opt/keycloak/bin/kcadm.sh config credentials --server http://localhost:8080 --realm master --user 用户名
然后输入设置的密码,再执行下面这行
/opt/keycloak/bin/kcadm.sh update realms/outline  -s sslRequired=NONE
outline

现在万事俱备,只需要启动outline了

docker pull outlinewiki/outline:0.82.0

docker run -d \-p 3000:3000 \--name outline \-v ~/docker-data/outline-data:/var/lib/outline/data \-e DATABASE_URL=postgres://用户名:密码@域名:端口/数据库名 \-e REDIS_URL=redis://:密码@域名:端口/0 \-e PGSSLMODE=disable \-e FORCE_HTTPS=false \-e SECRET_KEY=22a3dbd6fd96864cb125504826b153cf60a454e43a019afe4692e06f6cacd700 \-e UTILS_SECRET=11121c684ca0dc0352bf7567db9aaf9bc26c45fc34cacd5dbe883c086d7c7e00 \-e URL=http://域名:3000 \-e OIDC_CLIENT_ID=outline \-e OIDC_CLIENT_SECRET=xxxxxxxxxxxxxxx \-e OIDC_AUTH_URI=http://域名:端口/realms/outline/protocol/openid-connect/auth \-e OIDC_TOKEN_URI=http://域名:端口/realms/outline/protocol/openid-connect/token \-e OIDC_USERINFO_URI=http://域名:端口/realms/outline/protocol/openid-connect/userinfo \-e OIDC_USERNAME_CLAIM=preferred_username \-e OIDC_DISPLAY_NAME=keycloak \-e OIDC_SCOPES="openid profile email" \-e AWS_ACCESS_KEY_ID=minio用户名 \-e AWS_SECRET_ACCESS_KEY=minio密码 \-e AWS_S3_UPLOAD_BUCKET_URL=http://域名:端口 \-e AWS_S3_UPLOAD_BUCKET_NAME=outline \-e AWS_REGION=cn-homelab-1 \-e FILE_STORAGE_UPLOAD_MAX_SIZE=26214400 \-e AWS_S3_FORCE_PATH_STYLE=true \-e AWS_S3_ACL=private \outlinewiki/outline:0.82.0

环境变量的解释可以看:https://github.com/outline/outline/blob/main/.env.sample

  • DATABASE_URL: 指定postgre数据库的连接信息
  • REDIS_URL:指定redis的连接信息
  • PGSSLMODE:不用ssl连接postgre数据库
  • FORCE_HTTPS:禁用强制https
  • SECRET_KEY:不知道有什么用,可以通过openssl rand -hex 32生成
  • UTILS_SECRET: 不知道有什么用,可以通过openssl rand -hex 32生成
  • URL:outline的访问地址,就是ip加上-p映射的端口
  • OIDC_CLIENT_ID: 这个是在keycloak里设置的Clients里的Client ID
  • OIDC_CLIENT_SECRET: 这个就算Credentials里的Client Secret
  • OIDC_AUTH_URI:这个链接的构成:http://keycloak的域名:keycloak的端口/realms/keycloak的realm/protocol/openid-connect/auth
  • OIDC_TOKEN_URI:跟上面一样
  • OIDC_USERINFO_URI:跟上面一样
  • OIDC_USERNAME_CLAIM:不知道有什么用,照抄吧
  • OIDC_DISPLAY_NAME:没什么用
  • AWS_ACCESS_KEY_ID:minio用户名
  • AWS_SECRET_ACCESS_KEY:minio密码
  • AWS_S3_UPLOAD_BUCKET_URL:minio连接地址,端口是9000,不是9001(这个是web界面的地址)
  • AWS_S3_UPLOAD_BUCKET_NAME:bucket的名称
  • AWS_REGION:region
  • FILE_STORAGE_UPLOAD_MAX_SIZE:设置上传的最大大小,这个数字是25M
  • AWS_S3_FORCE_PATH_STYLE:不知道什么用
  • AWS_S3_ACL:不知道什么用

接着访问outline的端口就能跳转到keycloak的界面,输入之前创建的用户名密码就登陆成功了,复制图片到网页也能正常上传。等我体验一下再说怎么样

从这里就能看出docker-compose的优点了。

参考链接
  • keycloak官方文档: https://www.keycloak.org/guides#server
  • 搭建Outline私人Wiki私人知识库: https://luckzym.com/posts/a239536c/
  • docker基于本地存储部署outline团队知识库: https://blog.csdn.net/networken/article/details/141961843
  • outline官方文档:https://docs.getoutline.com/s/hosting/doc/hosting-outline-nipGaCRBDu

相关文章:

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。 其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完…...

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…...

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...

MySQL 5.7 Online DDL 技术深度解析

14.13.1 在线DDL操作 索引操作主键操作列操作生成列操作外键操作表操作表空间操作分区操作 索引操作 下表概述了对索引操作的在线DDL支持情况。星号表示有附加信息、例外情况或依赖条件。有关详细信息,请参阅语法和使用说明。 操作原地执行重建表允许并发DML仅修…...

【汽车功能安全:软件与硬件缺一不可】

随着汽车变得越来越智能,功能安全就成为汽车电子系统不可回避的标准体系,日益复杂的功能导致了汽车中电子元件的数量和复杂性的指数级增长(Leen)。如今高级别汽车拥有多达90个电子控制单元(ECU)&#xff0c…...

docker打包使用有头模式playwright

1.打包镜像 创建Dockerfile文件如下 # playywright 官方镜像 FROM mcr.microsoft.com/playwright:v1.37.0-jammy# 设置非交互式环境变量和时区 ENV DEBIAN_FRONTENDnoninteractive ENV TZEtc/UTC# 安装 Python 3.9 和 pip(修复时区阻塞问题) RUN apt-g…...

TCP/IP协议的应用层与传输层

TCP/IP协议簇是互联网的核心通信框架,定义了数据如何在网络中封装、寻址、传输和路由(确定数据包从源主机到目标主机的传输路径的过程)。 应用层 直接面向用户和应用,负责实现网络服务的具体功能(如网页浏览、文件传输…...

51c自动驾驶~合集15

我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器(新加坡国立) 运动规划是一项具有挑战性的任务,在高度动态和复杂的环境中生成安全可行的轨迹,形成自动驾驶汽车的核心能…...

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 版本7.3-7.4 都试过加密没什…...

【Git】5 个分区的切换方式及示例

目录 1. **工作区(Working Directory)**2. **缓存区(Stage/Index)**3. **本地仓库(Local Repository)**4. **远程仓库(Remote Repository)**5. **贮藏区(Stash&#xff0…...

Java高频面试之并发编程-02

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:进程和线程的区别是什么? 1. 资源分配与独立性 进程: 独立性:每个进程拥有独立的内存…...

openwebui和keycloak集成,使用keycloak的用户名和密码登录

1,实现效果 使用keycloak定义的用户名和密码,直接登录openwebui 2,实现原理 keycloak中用户信息中包含用户名和密码,以及email。 使用keycloak中的用户名和密码登录之后,会用email创建一个openwebui的账号。之后每次…...

html实现手势密码

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>手势密码</title><style>body {font-fam…...

【区块链安全 | 第八篇】多签机制及恶意多签

部分参考&#xff1a;慢雾科技 文章目录 为什么需要多签多签机制Tron钱包下的恶意多签Tron 钱包多签权限分类Tron 多签机制的运作方式 恶意多签的过程黑客通过多签机制控制账户黑客剥夺用户权限&#xff0c;完全控制账户 恶意多签成因 在区块链中&#xff0c;多签&#xff08;M…...

项目如何安装本地tgz包并配置局部registry

一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤&#xff1a; 1. 全局配置 如果你希望对所有项目生效&#xff0c;可以将这行配置添加到全局.npmr…...

二月公开赛Web-ssrfme

目录 环境搭建 题目分析 分析代码 解题过程 Redis未授权访问 寻找Flag 环境搭建 进入含有docker-compose.yml的文件内&#xff0c;拉取容器镜像 docker-compose up -d 题目分析 访问容器地址172.25.254.200:8091查看题目 分析代码 url通过GET请求访问界面&#xff0c…...

JavaRedis和数据库相关面试题

JavaRedis面试题 1. Redis是什么以及Redis为什么快&#xff1f; ​ Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存键值数据库&#xff0c;支持多种数据结构&#xff08;如字符串、哈希、列表、集合等&#xff09;&#xff0c;并提供持久化、复制、…...

告别枯燥工作,走向自动化

嘿&#xff0c;小伙伴们&#xff01;今天给你们介绍两款超实用的RPA办公自动化软件&#xff0c;用它们&#xff0c;再也不用像机器一样做重复劳动啦&#xff0c;超省时间&#xff01; 工具名称&#xff1a;影刀RPA&#xff08;类似产品&#xff0c;八爪鱼 RPA&#xff0c;操作上…...

Spring的 @Conditional @ConditionalOnProperty 注解 笔记250330

Spring的 Conditional ConditionalOnProperty 注解 Spring 的 Conditional 与 ConditionalOnProperty 注解详解 在 Spring 框架中&#xff0c;Conditional 和 ConditionalOnProperty 是用于动态控制 Bean 注册的重要注解。虽然它们都服务于条件化配置&#xff0c;但定位和使用…...

可信数据空间:构筑安全可控数据流通

前言&#xff1a;可信数据空间是一种数据基础设施&#xff0c;发展可信数据空间是全国及各地数据基础设施建设的重要方面。国内数据空间的探索和实践仍然数据探索阶段。本期分享&#xff1a;可信数据空间构筑安全可控数据流通&#xff0c;包括可信数据空间技术介绍、如何助力数…...

Zookeeper特性与节点数据类型

数据结构和监听机制 CP 文件系统形式存储 观察者模式监听节点数据变化、 临时节点客户端超时或发生异常节点就会删除 2888同步数据 3888选举端口 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来…...

【C++游戏引擎开发】《线性代数》(6):SVD(奇异值分解)的数学原理与实现

一、奇异值分解(SVD)的数学定义 奇异值分解​(Singular Value Decomposition,SVD)是一种将任意实数或复数矩阵分解为三个特定矩阵乘积的方法。其数学定义如下: 1.1 分解形式 给定一个秩为 r r r的矩阵 A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn(或…...

C语言pthread库创建线程的案例

一、代码案例 #include<stdio.h> #include<stdlib.h> // 多线程库 #include<pthread.h> // 线程1的逻辑描述 void* thread_method_01(void* v){ printf("线程1执行完毕。\n"); return NULL; } // 线程2的执行逻辑 void* thread_meth…...

处理 Linux 信号:进程控制与异常管理的核心

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在 Linux 操作系统中&#xff0c;信号是用于进程间通信的一种机制&#xff0c;能够向进程发送通知&#xff0c;指示某些事件的发生。信号通常由操作系统内核、硬件中断或其他进程发送。接收和处理信号是 Li…...

【蓝桥杯每日一题】4.1

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x "今日秃头刷题&#xff0c;明日荣耀加冕&#xff01;" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看&#xff1a;【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …...

分享系列项目的基础项目

本人分享了一系列的框架项目&#xff0c;它们共同需要依赖这个公共基础&#xff0c;结构如下图所示&#xff1a; 其中&#xff1a; audit: JPA的审计信息基础类auth&#xff1a;认证授权相关类config: 包括redis配置&#xff0c;client中token配置&#xff0c;openai文档配置…...

为 MinIO AIStor 引入模型上下文协议(MCP)服务器

Anthropic 最近宣布的模型上下文协议 &#xff08;MCP&#xff09; 将改变我们与技术交互的方式。它允许自然语言通信替换许多任务的复杂命令行语法。不仅如此&#xff0c;语言模型还可以总结传统工具的丰富输出&#xff0c;并以人类可读的形式呈现关键信息。MinIO 是世界领先的…...

spring boot前后端开发上传文件时报413(Request Entity Too Large)错误的可能原因及解决方案

可能原因及解决方案 1. Spring Boot默认文件大小限制 原因&#xff1a;Spring Boot默认单文件最大为1MB&#xff0c;总请求体限制为10MB。解决方案&#xff1a; 在application.properties中配置&#xff1a;spring.servlet.multipart.max-file-size10MB # 单文件最大 spring…...

数据结构实验1.1: 顺序表的操作及其应用

这里写自定义目录标题 一、实验目的二、注意事项三、实验内容&#xff08;一&#xff09;问题描述&#xff08;二&#xff09;基本要求 四&#xff0c;操作步骤&#xff08;一&#xff09;使用visual studio集成环境编写程序 五&#xff0c;示例代码六&#xff0c;运行效果 一、…...