本文最后更新于 701 天前,其中的信息可能已经有所发展或是发生改变。
实现目标
- nginx启用tcp级别分流,通过sni实现复用443端口,服务器仅对外开放443、80端口
- 自建bitwarden
- 自建obsidian的同步服务器,使用的是couchdb数据库+self-hosted lifeSync插件
- wordpress
- acme
- 除acme外,其他全部用docker容器实现
没有使用宝塔面板、1pannel、npm之类的面板
折腾记录
环境
debian12
配置服务器安全措施
- 更换ssh端口
- 密钥登录
安装docker
其他版本系统的安装方法请参考docker官方 docker安装
添加源
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
我是用非root用户执行安装的,装完后经常碰到permission问题
解决方法:
查看用户组的情况
ls -l /lib/systemd/system/docker.socket
结果为-rw-r--r-- 1 root root 295 Oct 26 17:06 /lib/systemd/system/docker.socket 表示docker为root用户组的权限,非root用户要做的就是添加docker用户组,并将自己添加到docker用户组
sudo usermod -aG docker $USER
sudo usermod -aG docker mming
sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
acme自动维护证书
获得api令牌后进行测试
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
-H "Authorization: Bearer 4DomSfJrHGs5bYLQ5SGM5KWykebV" \
-H "Content-Type:application/json"
测试通过后配置必要的环境变量
export CF_Token="your_token"
export CF_Account_ID="your_id"
export CF_Zone_ID="your_zone_id"
执行命令
acme.sh --issue --force -d exsample1.com -d exsample2.com --dns dns_cf -k ec-256 --days 60 && acme.sh --installcert -d exsample1.com -d exsample2.com \
--key-file /path/to/dockers/ca/private.key \
--fullchain-file /path/to/dockers/ca/cert.crt \
--reloadcmd "docker restart nginx"
/path/to/ 要换成你自己的想存放证书的路径!~
为了正确执行--reloadcmd "docker restart nginx",我一般会先用docker pull 个nginx下来运行着
| 字段信息 | 解释 |
|---|---|
| -issue | 签发请求 |
| -days [days] | 请求签发证书的周期,配合 –issue 使用 |
| -server [ACME 目录 URL] | 证书服务商的 ACME 目录 URL,配合 –issue 使用 |
| -installcert | 安装证书 |
| -d [网站域名] | 配置证书的域名信息 |
| -webroot [网站跟文件路径] | 文件验证需要的网站跟文件路径 |
| -dns [DNS类型] | 配置验证域名的DNS信息 |
| -cert-file [证书保存的路径] | 安装证书保存的路径 |
| -key-file [私钥保存的路径] | 安装私钥保存的路径 |
| -fullchain-file [证书链保存的路径] | 安装证书链保存的路径 |
| -reloadcmd [Web 重载命令] | 安装证书完成之后Web服务的重载命令 |
各类配置文件
nginx
vaultwarden
couchdb
dockercompose
version: '3'
services:
nginx:
restart: always
container_name: nginx
image: nginx
networks:
- nginx_share_network
ports:
- 80:80
- 443:443
volumes:
- /path/to/nginx/data/html:/usr/share/nginx/html
- /path/to/nginx/data/www:/var/www
- /path/to/nginx/data/logs:/var/log/nginx
# 有可能会出现不能挂载,这个时候用手动拷贝配置文件就行
- /path/to/nginx/data/nginx.conf:/etc/nginx/nginx.conf
- /path/to/ca:/etc/nginx/cert
- /path/to/nginx/data/conf.d:/etc/nginx/conf.d
- /path/to/nginx/data/stream.conf.d:/etc/nginx/stream.conf.d
environment:
- NGINX_PORT=80
- TZ=Asia/Shanghai
vaultwarden:
restart: always
image: vaultwarden/server:latest
container_name: vaultwarden
networks:
- nginx_share_network
environment:
- DOMAIN=https://exsample.com/vault/ # 这是您希望与您的Vaultwarden实例关联的域名。
- LOGIN_RATELIMIT_MAX_BURST=10 # 允许在一阵登录/两步验证尝试中的最大请求次数。
- LOGIN_RATELIMIT_SECONDS=60 # 这是来自同一IP的登录请求之间的平均秒数,在Vaultwarden限制登录次数之前。
- ADMIN_RATELIMIT_MAX_BURST=10 # 这与LOGIN_RATELIMIT_MAX_BURST相同,只争对admin面板。
- ADMIN_RATELIMIT_SECONDS=60 # 这与LOGIN_RATELIMIT_SECONDS相同
- ADMIN_SESSION_LIFETIME=20 # 会话持续时间
# - ADMIN_TOKEN=yourtoken # 此值是Vaultwarden管理员面板的令牌(一种密码)。为了安全起见,
- ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=yours #新的admin验证方式,这儿是hash值,web进入admin页面的时候输入生成hash的密码就可以
- SENDS_ALLOWED=true # 此设置决定是否允许用户创建Bitwarden发送 - 一种凭证共享形式。
- EMERGENCY_ACCESS_ALLOWED=true # 此设置控制用户是否可以启用紧急访问其账户的权限。例如,这样做可以在用户去世后,配偶可以访问密码库以获取账户凭证。>
- WEB_VAULT_ENABLED=true # 此设置决定了网络保险库是否可访问。一旦您配置了您的账户和客户端,停止您的容器,然后将此值切换为false并重启Vaultwarden,[>
- SIGNUPS_ALLOWED=false # 此设置控制新用户是否可以在没有邀请的情况下注册账户。可能的值:true / false。
- WEBSOCKET_ENABLED=true
- IP_HEADER:X-Forwarded-For
- LOG_FILE=/var/log/vaultwarden/vaultwarden.log
# ports:
# - '127.0.0.1:8200:80'
volumes:
- vaultwarden-data:/data/
- ./vaultwarden_log:/var/log/vaultwarden
backup:
restart: always
image: ttionya/vaultwarden-backup:latest
container_name: vw-backup
networks:
- nginx_share_network
environment:
# RCLONE_REMOTE_NAME: 'BitwardenBackup'
# RCLONE_REMOTE_DIR: '/BitwardenBackup/'
# RCLONE_GLOBAL_FLAG: ''
# CRON: '5 * * * *'
# ZIP_ENABLE: 'TRUE'
# ZIP_PASSWORD: 'WHEREISMYPASSWORD?'
# ZIP_TYPE: 'zip'
# BACKUP_FILE_SUFFIX: '%Y%m%d'
BACKUP_KEEP_DAYS: 10
# PING_URL: ''
# MAIL_SMTP_ENABLE: 'FALSE'
# MAIL_SMTP_VARIABLES: ''
# MAIL_TO: ''
# MAIL_WHEN_SUCCESS: 'TRUE'
# MAIL_WHEN_FAILURE: 'TRUE'
# TIMEZONE: 'UTC'
TIMEZONE: 'Asia/Shanghai'
volumes:
- vaultwarden-data:/bitwarden/data/
- vaultwarden-rclone-data:/config/
# - /path/to/env:/.env
couchdb:
restart: always
image: couchdb
container_name: obsidian-livesync
networks:
- nginx_share_network
environment:
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=yours # 密码
- PUID=1000
- PGID=1000
- LETSENCRYPT_HOST=couchdb.exsample.com #域名 好像不加这参数也行
- VIRTUAL_HOST=couchdb.exsample.com #域名 好像不加这参数也行
- VIRTUAL_PORT=5984
volumes:
- ./data-couch:/opt/couchdb/data
- ./cfg-couch:/opt/couchdb/etc/local.d 这里面又个ini文件要配置好
db:
image: mysql:8.0 # 使用mysql镜像,不建议修改版本号,后续如果要升级,千万记得备份数据库
container_name: wordpress-db
restart: unless-stopped
command: --max-binlog-size=200M --expire-logs-days=2
environment:
MYSQL_ROOT_PASSWORD: passwd1 # 这里是上面的root密码
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: passwd2 # 这里是原来的密码
volumes:
- './blog/db:/var/lib/mysql'
networks:
- nginx_share_network
app:
image: wordpress:latest
container_name: wordpress-app
restart: unless-stopped
# ports:
# - 8080:80 # 按需修改,左边的8080可以改成服务器上没有用过的端口
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: passwd3 # 按需修改
volumes:
- './blog/app:/var/www/html'
links:
- db:db
depends_on:
- redis
- db
networks:
- nginx_share_network
redis:
image: redis:alpine
container_name: wordpress-redis
restart: unless-stopped
volumes:
- ./blog/redis-data:/data
networks:
- nginx_share_network
volumes:
vaultwarden-data:
# Specify the name of the volume where you save the vaultwarden data,
# use vaultwarden-data for new users
# and bitwardenrs-data for migrated users
name: vaultwarden-data
# name: bitwardenrs-data
vaultwarden-rclone-data:
external: true
# Specify the name of the volume where you save the rclone configuration,
# use vaultwarden-rclone-data for new users
# and bitwardenrs-rclone-data for migrated users
name: vaultwarden-rclone-data
# name: bitwardenrs-rclone-data
networks:
nginx_share_network:
driver: bridge
vaultwarden的hash模式密码参考:
Secure the ADMIN_TOKEN
搁浅,虽然自己折腾完了,但是要再写成教程的话并不容易,😓
评论