---
title: '部署了人生中第一个博客'
description: 'Astro 博客部署'
pubDate: 'Apr 22 2026'
heroImage: '../../assets/BladeRunner.png'
---

## 在真正部署前我干了啥😫（可以不看）

>由于本人急切想实现外网访问，且不知为何偏好Apache，于是很早之前就把本地项目以下载的形式放在了服务器上，而不是git push。且gitea仓库里也是zip文件😫，还写了如下文字。千万不要这样。

1. 把本地的Astro项目打包。根目录里输入
```bash
npm run build
```
会生成一个`dist`文件夹，即我们的博客成品
2. 将一整个文件夹传到服务器`/var/www/blog`（用的apache）我这里绕了一点弯路，本来打算先将dist.zip传到gitea,再在服务器端下载，后来发现一种更简单的方式
	- 安装lrzsz(Linux下命令行文件传输工具，实现本地-服务器互传文件，但不能传文件夹，要打包)
	```bash
	apt install lrzsz -y
    cd /var/www/blog
    rz    #上传文件到服务器，会弹出窗口
    sz    #下载
	```
	- 解压
	```bash
	unzip -o dist.zip -d  /var/www/blog/  #-o 覆盖已有文件
	```
	我还碰到了问题就是它传成了/var/www/blog/dist，使用`mv dist/* .`就可以解决了。
3. 配置Apache
```bash
vim /etc/apache2/sites-available/000-default.conf
#改为 DocumentRoot /var/www/blog
systemctl restart apache2
```
4. 配置HTTPS
   用 Certbot 给 Apache 配置免费 Let's Encrypt 证书，一键开启 HTTPS：（还没有深入理解原理）
```bash
apt install certbot python3-certbot-apache -y 
certbot --apache -d marvinhers.site
```

并且由于之前在服务器docker里装了gitea,本人不知为何想实现自个网站可登gitea,由此配了子域名git.marvinhers.site，这会牵扯到后面的反向代理😅

## 浅谈一下部署过程🤯

成果🫠：[点击访问虽然没什么内容主页也没写好](https://marvinhers.site/about/)     [配了个子域名](https://git.marvinhers.site)
>博客用TuF3i推荐的Astro框架（nodejs 开发构建），代码放在Gitea，Act runner 实现cicd，web服务器用的Nginx，https加了密的。
### 配置Nginx

>同为web服务器软件，它们都可以让别人通过网址访问服务器上的网站、接口、文件。但nginx轻量，占有内存少，并发能力强，在负载均衡和反向代理领域表现出众，处理静态资源也更👍

针对我这个博客，先不管主配置`/etc/nginx/nginx.conf`，因为它有`include /etc/nginx/sites-enabled/*;`所以主要是修改它的子配置
在`sites-available`下增加了`blog`和`gitea`两个配置文件，gitea配的是反向代理，虽然这样意义不大，但也算是把学的知识运用一下...
```nginx
# 以gitea配置为例
# 仅保留核心：80端口 + 子域名 + 反向代理 
server { 
	listen 80; 
	server_name git.marvinhers.site; 
	location / { 
		proxy_pass http://127.0.0.1:3000; 
		proxy_set_header Host $host; 
		proxy_set_header X-Real-IP $remote_addr; 
		} 
	}
```

```bash
# 软链接启用配置 
ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/ 
# 测试配置无误 
nginx -t
nginx -s reload
```

#后续还要深入学习
[Nginx 服务器安装及配置文件详解 | 菜鸟教程](https://www.runoob.com/w3cnote/nginx-install-and-config.html)
[反向代理](https://mp.weixin.qq.com/s?__biz=MzA5MTkyMTQ0NA==&mid=2247486136&idx=1&sn=fb7ca1c55e681bdb082d3796e9dbbe04&chksm=907447f3a703cee53b7067685c9d710f5f99946c9d09865099647edd061df7ebdbb010bc34fe&scene=178&cur_album_id=3920274935729356806&search_click_id=#rd)
(虽然学长的课还没听完)
预留`acme.sh`
先用certbot简单配一下吧，以后使用泛域名证书再改用acme.sh......
所以后面就简单地...
```bash
certbot --nginx -d marvinhers.site -d git.marvinhers.site
```

这样讲起来怎么只有这么一点，鬼知道我弄了多久。
### 在Gitea上实现CICD

第一节课的时候接触了gitea 的 actions，配置了一些东西，当时确实挺懵的。
再从头顺一遍吧
#### 开启actions功能

```bash
docker exec -it gitea bash
vim /data/gitea/conf/app.ini
# 添加以下然后退出容器
# [actions]
# ENABLED=true
docker restart gitea
```
#### 开启act runner

Act Runner是一个独立的小程序，它从 Gitea 那里领任务（比如“有人推送代码了，去执行 .gitea/workflows/deploy.yml 文件里的命令”），然后在服务器上执行这些命令。
推荐是在docker里运行的，这里建议看官方文档是如何注册，挂载，运行。这里重点讲一下==挂载==
==挂载 volume 是实现 服务器 和 Act Runner容器 之间的文件互通==
```yml
# 这里展示一下 /root/runner/docker-compose.yml
# 关于令牌，建议参考官方文档
services:
  runner:
    image: gitea/act_runner:nightly
    environment:
      CONFIG_FILE: /config.yaml
      GITEA_INSTANCE_URL: "https://git.marvinhers.site"
      GITEA_RUNNER_REGISTRATION_TOKEN: "{Token}"
      GITEA_RUNNER_NAME: "marvin-blog-runner"
      GITEA_RUNNER_LABELS: "ubuntu-latest,self-hosted"
    volumes:
      - ./config.yaml:/config.yaml
      - ./data:/data
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/www/blog:/var/www/blog
```
==令牌（Token）==是一个注册认证，绑定runner到你的Gitea实例，连接gitea服务器，有不同级别，可复用，可重置。
我是直接用了实例级别的，仓库级别获取好像出了点问题
#后续再了解
```bash
docker exec -u git -it gitea gitea actions generate-runner-token
```
然后`docker compose down` `docker compose up -d` `docker ps` 就能看到在运行了！

#### 终于workflows
##### 讲几个笨得流黄汤的点（没按顺序）：
-  同步到服务器
```yml
- name: 同步到服务器
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SERVER_USER }}
          port: ${{ secrets.SERVER_PORT }}
          key: ${{ secrets.SERVER_SSH_KEY }} 
          source: "dist/"
          target: "/var/www/blog/"
          overwrite: true
          strip_components: 1
    # 1.那一大堆变量这些都是和服务器相关的，尤其ssh_key是在服务器上生成的，我记得我之前填的是在本地生成的。
    # 2.source 的值和 strip_components 扯上关系。后者让前者剥离dist目录
```
生成密钥的bash
#后续了解
```bash
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa -N ""
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys 
chmod 700 ~/.ssh
```

-  ==git==相关，与我自个有关。
由于之前笨得流黄汤，把zip传到了gitea...
然后还有对git命令还不太熟悉...这没啥好说的，肯定是要掌握的东西。💪
#后续还要深入学习 
```bash
# 然后简单触发一下工作流
git add .
git commit -m "fix: some mistakes"
git push -u origin main
```
然后其实是碰上各种各样的问题的，包括一些`.gitignore`的书写导致上传巨慢，HTTP 413报错（上传的代码包体积超过了 Nginx 上限）后在Nignx配置的server块下添加`client_max_body_size 100M;`指令等等啊。
## 浅浅总结

啊确实学到了很多，但是我的基础不太行，像什么docker,git以及文章中一些标签的地方还要深入学习。
然后其实在部署的时候是一个逆向由深入浅的过程碰到问题--再解决，这很不顺，也很浪费时间，所以还是要打好基础🐷以后多多部署东西熟悉熟悉🐷