15
2024
07
19:22:46

CodeSandbox-Blog备份 (一)

CodeSandBox上部署docker并使用Cloudflare Tunnel打通自己的域名——以青龙面板为例

前言

长期以来白嫖Replit已经成为习惯,突然Replit的政策改变让人猝不及防。

虽然此前就已经知道了CodeSandBox这个平台,但苦于其公开性质,以及不可更换的会直接暴露公开容器的域名分配,一直以来对CodeSandBox的使用也是离不开Replit的——在CodeSandBox部署好服务之后,在Replit部署NGINX服务反代CodeSandBox提供的域名,一定程度上避免CodeSandBox容器的暴露。

那么Replit即将无法白嫖的现状下,怎么快乐的使用CodeSandBox呢?第一时间我想到的是Cloudflare的Workers。但是Workers对于免费用户来讲额度太少,就此浪费掉未免也太可惜,那怎么办呢?

虽说家中的软路由一直以来都使用Cloudflared打通Tunnel进行穿透,但是还得是fscarman2的各种PaaS平台搭建代理的仓库给了我灵感,可以在PaaS平台使用Cloudflared,像家里的软路由内网穿透一样,使用自己的域名。

经过我反复尝试,总算找到了在CodeSandBox上能够比较稳定搭建各种服务的办法。如果你会操作,也可以自行构筑各种镜像进行部署,只需要在 docker-compose.yaml文件末添加Cloudflared部分即可。

这里就以青龙面板为例,讲述一下CodeSandBox的白嫖方法。

部署过程

注册CodeSandBox

CodeSandBox支持Google、Github等多种方式登录,任意方式注册登录即可,这里不再赘述。

编写docker-compose文件

以青龙面板为例,在这里可以找到其docker-compose文件:

YAML
123456789101112131415
version: '2'services:  web:    # alpine 基础镜像版本    image: whyour/qinglong:latest    # debian-slim 基础镜像版本    # image: whyour/qinglong:debian      volumes:      - ./data:/ql/data    ports:      - "0.0.0.0:5700:5700"    environment:      # 部署路径非必须,以斜杠开头和结尾,比如 /test/      QlBaseUrl: '/'    restart: unless-stopped

稍作修改:

YAML
1234567891011
version: '2'services:    qinglong:      image: whyour/qinglong:latest      volumes:        - /project/sandbox/ql/data:/ql/data      ports:       - "0.0.0.0:5700:5700"      environment:        QlBaseUrl: '/'      restart: always

主要修改了其 volumes的部分,因为CodeSandBox的文件目录在 /project/sandbox/下,所以我在此路径下创建 ./ql/data来存储青龙面板的数据,实现数据持久化。

而Cloudflared部分,我是这样写的:

YAML
12345678
cloudflared:      restart: always      network_mode: host      environment:          - TZ=Asia/Shanghai      command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN]      container_name: cloudflared      image: cloudflare/cloudflared:latest

其中的 [ARGO_TOKEN]要替换成自己的token,后文将附上详细教程。

所以整个 docker-compose.yaml的内容如下:

YAML
1234567891011121314151617181920
version: '2'services:    qinglong:      image: whyour/qinglong:latest      volumes:        - /project/sandbox/ql/data:/ql/data      ports:       - "0.0.0.0:5700:5700"      environment:        QlBaseUrl: '/'      restart: always    cloudflared:      restart: always      network_mode: host      environment:          - TZ=Asia/Shanghai      command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN]      container_name: cloudflared      image: cloudflare/cloudflared:latest

获取[ARGO_TOKEN]

详见群晖套件:Cloudflare Tunnel 内网穿透中文教程 支持DSM6、7

此处需要的[ARGO_TOKEN]就是ey开头的那一串。

然后在Cloudflare中设置好相应的域名和本地端口对应,一般协议用http即可。像此处,按照我的 docker-compose.yaml来看,我应该映射5700端口,所以我填的是 0.0.0.0:5700

创建Devbox

在CodeSandBox中进入dashboard,然后点击”Create a Devbox”

选择docker

进入Devbox之后,在左侧的文件管理EXPLORER中可以看到有 .codesandbox和 .devcontainer两个文件夹

先修改 .codesandbox中的 tasks.json文件,在 setupTasks中添加部署命令:

JSON
123456
"setupTasks": [    {      "name": "Deploy",      "command": "cd /project/sandbox/.devcontainer/ && docker compose up -d"    }  ],

然后在 .devcontainer文件夹下新建 docker-compose.yaml文件,把上述的 docker-compose.yaml内容全部复制进去。

最后点击左上角的方框打开菜单,选择”Restart Devbox”,等待容器重启后,你就可以看到青龙运行好了。再试一下刚刚在Cloudflare中映射的域名,也可以用了。

一些问题

不知道为什么,当我使用http2模式运行Cloudflared时,隧道断连后并不会重新连接,auto模式在quic模式断连后自动切换http2模式,再断连又会出现http2模式一样的问题。所以我只能指定其使用quic模式进行运行。原因未知,希望有人能找到原因。

然后,必须保持容器活跃,Cloudflared掉线后才会重连,为保证其活跃,得使用网站监控器监控CodeSandBox自带的映射域名,形同 https://t6a4m-8080.csb.app/的那个。至于网站监控器,Uptime-Kumacron-jobUptimeRobot之类的都行。

注意,有些PaaS平台(比如Glitch)已经禁止了自身服务器ip、公用网站监控器ip进行访问,所以上述的cron-job和UptimeRobot是否能行请自行测试,更加建议自己搭建Uptime-Kuma。

后话

在CodeSandBox上我已经尝试使用此方法部署了AlistqinglongHalo(本站就是)、Pandora_Next以及自己构筑的个别镜像等多个应用,尽数成功。可玩性还是很高的。

但是不得不提醒,这种方法只是避免了从域名上找到自己的容器而已,并不能确保自己的数据不会泄露,毕竟使用的是公共容器,请注意信息安全,不要存储私密信息,否则后果自负。

另,宣传一下QQ群:受虐滑稽


一些可以在CodeSandBox上配合Cloudflared使用的docker-compose

以下任何一个配置,如果不需要Cloudflared打隧道,就把cloudflared部分删掉。

另外,除了Cloudflared打隧道,现在有新的使用自己的域名的方法,详见仓库:k0baya/reserve-vercel

现在已经将Cloudflared部分从各配置中删除,如有需要请自行添加:

12345678910
version: '3.3'services:   cloudflared:     restart: always     network_mode: host     environment:         - TZ=Asia/Shanghai     command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN]     container_name: cloudflared     image: cloudflare/cloudflared:latest

Qinglong

映射5700端口

YAML
1234567891011
version: '2'services:    qinglong:      image: whyour/qinglong:latest      volumes:        - /project/sandbox/ql/data:/ql/data      ports:       - "0.0.0.0:5700:5700"      environment:        QlBaseUrl: '/'      restart: always

Alist

映射5244端口

如果需要使用Aria2实现离线下载,把第14行的 image指定的镜像更改为 xhofe/alist-aria2:main即可

YAML
1234567891011121314
version: '3.3'services:    alist:        restart: always        volumes:            - '/project/sandbox/alist:/opt/alist/data'        ports:            - '5244:5244'        environment:            - PUID=0            - PGID=0            - UMASK=022        container_name: alist        image: 'xhofe/alist:latest'

Halo

映射8090端口

YAML
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
version: "3"services:  halo:    image: halohub/halo:2.11    container_name: halo    restart: on-failure:3    depends_on:      halodb:        condition: service_healthy    networks:      halo_network:    volumes:      - /project/sandbox/data/halo2:/root/.halo2    ports:      - "8090:8090"    healthcheck:      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]      interval: 30s      timeout: 5s      retries: 5      start_period: 30s          command:      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo      - --spring.r2dbc.username=halo      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。      - --spring.r2dbc.password=12345678      - --spring.sql.init.platform=postgresql      # 外部访问地址,请根据实际需要修改      - --halo.external-url=http://localhost:8090/    halodb:    image: postgres:15.4    container_name: halodb    restart: on-failure:3    networks:      halo_network:    volumes:      - /project/sandbox/data/db:/var/lib/postgresql/data    ports:      - "5432:5432"    healthcheck:      test: [ "CMD", "pg_isready" ]      interval: 10s      timeout: 5s      retries: 5    environment:      - POSTGRES_PASSWORD=12345678      - POSTGRES_USER=halo      - POSTGRES_DB=halo      - PGUSER=halonetworks:  halo_network:

Microsoft_365_E5_RenewX

映射端口1066

YAML
12345678910111213
version: '3.5'services:  renewx:    image: gladtbam/ms365_e5_renewx:latest    container_name: renewx    environment:      - TZ=Asia/Shanghai    volumes:      - /project/sandbox/E5RenewX/Deploy:/renewx/Deploy      - /project/sandbox/E5RenewX/Appdata:/renewx/appdata    ports:      - "1066:1066"    restart: unless-stopped

需要新建 Config.xml文件放在 Deploy内,默认的 Config.xml文件内容如下:

TXT
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
<?xml version="1.0" encoding="utf-8" ?><Configuration>	<!--站点服务器基本配置-->	<Serivce>		<!--服务访问端口-->		<Port>1066</Port>		<!--管理员密码(管理员登录路由/Admin/Login) 重要:首次启动前必须更改-->		<LoginPassword>12345678</LoginPassword>		<!--是否启用内核多线程支持-->		<CoreMultiThread>true</CoreMultiThread>		<!--网站备案(选填)-->		<ICP>			<!--备案显示文本-->			<Text></Text>			<!--备案管理查询机构跳转链接-->			<Link>https://beian.miit.gov.cn</Link>		</ICP>		<!--Bootstrap CDN 若要更改请务必使用bootstrap@5.1.3版本(选填)-->		<CDN>			<!--Bootstrap CSS文件CDN bootstrap.min.css-->			<CSS>https://cdn.staticfile.org/bootstrap/5.1.3/css/bootstrap.min.css</CSS>			<!--Bootstrap JS文件CDN bootstrap.bundle.min.js-->			<JS>https://cdn.staticfile.org/bootstrap/5.1.3/js/bootstrap.bundle.min.js</JS>		</CDN>	</Serivce>	<!--站点Kestrel服务器HTTPS配置 (只支持IIS证书类型 即PFX格式的证书)-->	<HTTPS>		<!--Kestrel是否启用HTTPS(SSL加密传输)-->		<Enable>false</Enable>		<!--SSL证书文件名 (需要将PFX格式的SSL证书放置于该配置文件的同级目录Deploy文件夹下) 如e5.sundayrx.net.pfx-->		<!--不填则默认使用Dev localhost 本地证书-->		<Certificate></Certificate>		<!--SSL证书密钥(PFX证书的访问密钥)-->		<Password></Password>	</HTTPS>	<!--共享站点配置,不共享可无视以下内容 (若要共享站点 请自备以下所需的配置信息 且配置中HTTPS必须启用)-->	<ShareSite>		<!--是否启用站点共享-->		<Enable>false</Enable>		<!--SMTP邮件发送支持-->		<SMTP>			<!--发件邮箱-->			<Email></Email>			<!--邮箱密钥-->			<Password></Password>			<!--SMTP服务器地址-->			<Host></Host>			<!--SMTP服务器端口-->			<Port>587</Port>			<!--SMTP服务器是否使用SSL传输-->			<EnableSSL>true</EnableSSL>		</SMTP>		<!--第三方OAuth登录支持(至少启用以下一种OAuth否则其他用户无法注册)-->		<OAuth>			<!--微软登录授权-->			<Microsoft>				<!--是否启用该OAuth-->				<Enable>true</Enable>				<!--应用程序Id-->				<ClientId></ClientId>				<!--应用程序访问机密-->				<ClientSecret></ClientSecret>			</Microsoft>			<!--GitHub登录授权-->			<Github>				<!--是否启用该OAuth-->				<Enable>true</Enable>				<!--应用程序Id-->				<ClientId></ClientId>				<!--应用程序访问机密-->				<ClientSecret></ClientSecret>			</Github>		</OAuth>		<!--站点系统设置-->		<System>			<!--站点启动后默认是否允许用户注册 建议为false-->			<AllowRegister>false</AllowRegister>			<!--站点启动后默认公告(换行符请使用  进行换行)-->			<Notice></Notice>			<!--站点运营者-->			<Master></Master>			<!--站点运营者推广链接-->			<MasterLink></MasterLink>			<!--站点新用户默认配额数-->			<DefaultQuota>1</DefaultQuota>			<!--站点自动特赦时间间隔 (单位:天 至少30天)-->			<AutoSpecialPardonInterval>30</AutoSpecialPardonInterval>		</System>	</ShareSite></Configuration>

Pandora-Next

映射端口8181

YAML
123456789101112
version: '3.3'services:    pandora-next:        image: pengzhile/pandora-next        container_name: PandoraNext        network_mode: bridge        restart: always        ports:            - "8181:8181"        volumes:            - /project/sandbox/pandora-next/data:/data            - /project/sandbox/pandora-next/sessions:/root/.cache/PandoraNext

Uptime-Kuma

映射端口3001

YAML
12345678910
version: '3.8'services:  uptime-kuma:    image: louislam/uptime-kuma:1    container_name: uptime-kuma    volumes:      - /project/sandbox/uptimekuma:/app/data    ports:      - "3001:3001"  # <Host Port>:<Container Port>    restart: always

KodBox

映射端口8080

YAML
12345678910111213141516171819202122232425262728293031
version: '3.5'services:  db:    image: mariadb    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW    volumes:      - "/project/sandbox/db:/var/lib/mysql"       environment:      - "TZ=Asia/Shanghai"      - "MYSQL_ROOT_PASSWORD=jiehdo!25165n"      - "MYSQL_DATABASE=kodbox"      - "MYSQL_USER=bodbox"      - "MYSQL_PASSWORD=jiehdo!25165n"    restart: always    app:    image: kodcloud/kodbox    ports:      - 8080:80                    links:      - db      - redis    volumes:      - "/project/sandbox/site:/var/www/html"      restart: always  redis:    image: redis:alpine    environment:      - "TZ=Asia/Shanghai"    restart: always

如果照搬上面的设置,初始化时数据库和redis的设置应该如图填写

数据库类型:MySQL
服务器:db
用户名:root
密码:jiehdo!25165n
数据库:kodbox
存储引擎:InnoDB
系统缓存类型:Redis
服务器:redis

Zfile

映射端口8080

YAML
123456789101112
version: '3.3'services:    zfile:        container_name: zfile        restart: always        ports:            - '8080:8080'        volumes:            - '/project/sandbox/zfile/db:/root/.zfile-v4/db'            - '/project/sandbox/zfile/logs:/root/.zfile-v4/logs'            - '/project/sandbox/zfile/file:/data/file'        image: zhaojun1998/zfile

PanIndex

映射端口5238

YAML
123456789101112
version: '3.3'services:    panindex:        container_name: panindex        restart: always        ports:            - '5238:5238'        volumes:            - '/project/sandbox/PanIndex/data:/app/data'        environment:            - "PORT=5238"        image: iicm/pan-index:latest

ShareList

映射端口33001

YAML
12345678910
version: '3.3'services:    sharelist:        container_name: sharelist        restart: always        ports:            - '33001:33001'        volumes:            - '/project/sandbox/sharelist:/sharelist/cache'        image: reruin/sharelist:next

Cloudreve

映射端口5212

进入容器需要先手动创建几个文件,在Terminal中输入以下指令即可:

SHELL
1234567
mkdir -p cloudreve && cd cloudreve \&& mkdir -vp cloudreve/{uploads,avatar} \&& touch cloudreve/conf.ini \&& touch cloudreve/cloudreve.db \&& mkdir -p aria2/config \&& mkdir -p data/aria2 \&& chmod -R 777 data/aria2
YAML
1234567891011121314151617181920212223242526
version: "3.8"services:  cloudreve:    container_name: cloudreve    image: cloudreve/cloudreve:latest    restart: unless-stopped    ports:      - "5212:5212"    volumes:      - /project/sandbox/cloudreve/data:/data      - /project/sandbox/cloudreve/cloudreve/uploads:/cloudreve/uploads      - /project/sandbox/cloudreve/cloudreve/conf.ini:/cloudreve/conf.ini      - /project/sandbox/cloudreve/cloudreve/cloudreve.db:/cloudreve/cloudreve.db      - /project/sandbox/cloudreve/cloudreve/avatar:/cloudreve/avatar    depends_on:      - aria2  aria2:    container_name: aria2    image: p3terx/aria2-pro    restart: unless-stopped    environment:      - RPC_SECRET=jif1568dw87      - RPC_PORT=6800    volumes:      - /project/sandbox/cloudreve/aria2/config:/config      - /project/sandbox/cloudreve/data:/data

Aria2的token默认为 jif1568dw87,如有需要自行修改

初始账号和密码,请在Terminal中输入命令 docker logs cloudreve后在日志中查找。

Typecho

映射端口8080

YAML
12345678910111213141516171819202122232425262728
version: '3.7'services:  typecho:    image: joyqi/typecho:nightly-php7.4-apache    container_name: typecho-server    restart: always    environment:      - TIMEZONE=Asia/Shanghai    ports:      - 8080:80    volumes:      - /project/sandbox/typecho:/app/usr    depends_on:      - mariadb  mariadb:    image: mariadb    container_name: mariadb    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW    volumes:      - "/project/sandbox/db:/var/lib/mysql"       environment:      - "TZ=Asia/Shanghai"      - "MYSQL_ROOT_PASSWORD=jiehdo!25165n"      - "MYSQL_DATABASE=typecho"      - "MYSQL_USER=typecho"      - "MYSQL_PASSWORD=jiehdo!25165n"    restart: always

如果照搬此docker-compose.yaml,初始设置数据库时应该如此填写:

数据库适配器:Mysql 原生函数适配器
数据库前缀:typecho_
数据库地址:mariadb
数据库用户名:root
数据库密码:jiehdo!25165n
数据库名:typecho

Baota_Panel

端口8888为面板,2022为SSH端口,2021为FTP端口,2080和2443为网页服务预留端口,2888是官方给的,不知道作用。

YAML
1234567891011121314151617
version: '3'services:  baota:    image: gettionhub/baota-docker:ltd    container_name: baota    volumes:      - /project/sandbox/www/website_data:/www/wwwroot       - /project/sandbox/www/mysql_data:/www/server/data      - /project/sandbox/www/vhost:/www/server/panel/vhost     ports:      - "8888:8888"      - "2022:22"      - "2021:21"      - "2443:443"      - "2080:80"      - "2888:888"    restart: unless-stopped

面板入口为8888端口的那个网址后面加上 /baota,形同 https://t6a4m-8888.csb.app/baota

初始用户名、密码都为baota

容器内root用户的ssh密码也是baota

WordPress

映射端口8080

YAML
12345678910111213141516171819202122232425
version: '3.1'services:  wordpress:    image: wordpress    restart: always    ports:      - 8080:80    environment:      WORDPRESS_DB_HOST: db      WORDPRESS_DB_USER: exampleuser      WORDPRESS_DB_PASSWORD: examplepass      WORDPRESS_DB_NAME: exampledb    volumes:      - /project/sandbox/wordpree/app:/var/www/html  db:    image: mysql:5.7    restart: always    environment:      MYSQL_DATABASE: exampledb      MYSQL_USER: exampleuser      MYSQL_PASSWORD: examplepass      MYSQL_RANDOM_ROOT_PASSWORD: '1'    volumes:      - /project/sandbox/wordpree/db:/var/lib/mysql

Memos

映射端口5230

YAML
123456789
version: "3.0"services:  memos:    image: neosmemo/memos:latest    container_name: memos    volumes:      - /project/sandbox/memos/:/var/opt/memos    ports:      - 5230:5230

Ghost

映射端口8080

首次启动会反复重启几次等待数据库创建文件,是正常的。

YAML
123456789101112131415161718192021222324
version: '3.1'services:  ghost:    image: ghost:4-alpine    restart: always    ports:      - 8080:2368    environment:      database__client: mysql      database__connection__host: db      database__connection__user: root      database__connection__password: example      database__connection__database: ghost      url: http://localhost:8080    volumes:      - /project/sandbox/ghost/app:/var/lib/ghost/content  db:    image: mysql:8.0    restart: always    environment:      MYSQL_ROOT_PASSWORD: example    volumes:      - /project/sandbox/ghost/db:/var/lib/mysql

NGINX-ui

面板端口为8080。网页服务端口预留为8443。

YAML
1234567891011121314151617
version: '3.3'services:    nginx-ui:        stdin_open: true        tty: true        container_name: nginx-ui        restart: always        environment:            - TZ=Asia/Shanghai        volumes:            - '/project/sandbox/appdata/nginx:/etc/nginx'            - '/project/sandbox/appdata/nginx-ui:/etc/nginx-ui'            - '/project/sandbox/www:/var/www'        ports:            - 8080:80            - 8443:443        image: 'uozi/nginx-ui:latest'

继续补充ing……


在CodeSandBox中部署其他应用——以小雅为例

对小雅容器的一些分析

相信部署过小雅的朋友都一直苦恼于小雅的更新频繁,以及阿里网盘更新后的容量限制,给日常观影带来了很不好的体验。随着xiaoyakeeper的诞生,才迎来了转机——自动更新容器+自动清理转存文件,解决了小雅日常使用的痛点。

但是,不论是小雅本身还是xiaoyakeeper,其部署方式都是一键式的脚本,而且部署方式限制的死死的——指定了端口、挂载卷等应该容许自定义的参数,使得其难以部署在各种PaaS平台上。

此前我曾有过最简单的把小雅部署在PaaS平台上的方法构思——基于小雅原镜像进行修改。直接查看小雅的一键部署脚本不难发现,是通过提前创建 /etc/xiaoya路径,再把需要使用到的各项token、id等参数储存为TXT文本文件,放入 /etc/xiaoya后,使用 volume挂载进容器的 /data路径进行读取的。所以只要在原有镜像上进行修改,准备好自己的这些token、id后,将其全部复制到小雅镜像的/data路径,就应当可以在不使用volume挂载的情况下直接部署一个能够正常使用的小雅容器。

但是,首先这个方案比起一键脚本操作复杂太多,而且在我仔细查看了xiaoyakeeper的脚本后,我发现这样操作会使得xiaoyakeeper无法读取docker命令的 -v项,就需要对xiaoyakeeper的脚本进行修改了。但是xiaoyakeeper的脚本又自带自动更新功能,如果一个更新覆盖了我的修改,又不得偿失;如果删掉自动更新的功能,那么如果阿里网盘的政策出现了改变,还得重新手动修改最新的xiaoyakeeper脚本进行替换,难以做到一劳永逸。

通过观察xiaoyakeeper的脚本内容,其更新小雅容器的方法并不是运行小雅的一键更新脚本,而是读取当前小雅容器的各项参数之后,重新进行 docker pulldocker run,也就是说,小雅容器被安装好之后,通过xiaoyakeeper进行更新就能完全摆脱小雅一键脚本。而且,如果小雅容器没有被启动的话,xiaoyakeeper运行之后就会直接启动小雅容器。

对CodeSandBox的分析

摸索暂时比较少,Devbox(Docker)大概理解为一个 Ubuntu为底的,zsh为默认shell执行器的,有root权限的,预装了Docker的虚拟机。在 /project/sandbox/路径下的文件,即便重启也不会丢失。


第二部分 https://www.hqyman.cn/post/8850.html 



推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://www.hqyman.cn/post/7126.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: