From fef2f52ad15f7b5578245d1efab4244573d23eae Mon Sep 17 00:00:00 2001 From: CrimsonTome Date: Sun, 8 May 2022 00:12:24 +0100 Subject: [PATCH] rm files that arent needed and added new in progress slides --- .gitignore | 78 - .gitmodules | 3 - 201/Lab-Sheet.md | 643 -- 201/images/feedback.svg | 532 -- 201/images/nginx-default.png | Bin 32610 -> 0 bytes 201/images/puttygen-password.png | Bin 17759 -> 0 bytes 201/images/puttygen-randomness.png | Bin 4420 -> 0 bytes 201/images/puttygen.png | Bin 12796 -> 0 bytes 201/index.html | 133 - Freeside_introduction.odp | Bin 0 -> 57452 bytes Notes.md | 17 - README.md | 7 +- build | 209 - css/lab-sheet.css | 119 - css/theme.css | 79 - images/Logos/alpine.png | Bin 24900 -> 0 bytes images/Logos/archlinux.png | Bin 102823 -> 0 bytes images/Logos/debian.png | Bin 25153 -> 0 bytes images/Logos/devuan.png | Bin 8856 -> 0 bytes images/Logos/fedora.png | Bin 20135 -> 0 bytes images/Logos/gentoo.png | Bin 108196 -> 0 bytes images/Logos/ubuntu.png | Bin 31623 -> 0 bytes images/QR-Feedback.svg | 577 -- images/VM-Install/0.png | Bin 7837 -> 0 bytes images/VM-Install/1.png | Bin 4824 -> 0 bytes images/VM-Install/10.png | Bin 193063 -> 0 bytes images/VM-Install/11.png | Bin 175953 -> 0 bytes images/VM-Install/12.png | Bin 192307 -> 0 bytes images/VM-Install/13.png | Bin 104491 -> 0 bytes images/VM-Install/14.png | Bin 230140 -> 0 bytes images/VM-Install/15.png | Bin 235150 -> 0 bytes images/VM-Install/16.png | Bin 153848 -> 0 bytes images/VM-Install/17.png | Bin 67050 -> 0 bytes images/VM-Install/18.png | Bin 75341 -> 0 bytes images/VM-Install/19.png | Bin 157201 -> 0 bytes images/VM-Install/2.png | Bin 73430 -> 0 bytes images/VM-Install/20.png | Bin 168947 -> 0 bytes images/VM-Install/21.png | Bin 226368 -> 0 bytes images/VM-Install/3.png | Bin 100594 -> 0 bytes images/VM-Install/4.png | Bin 89020 -> 0 bytes images/VM-Install/5.png | Bin 89424 -> 0 bytes images/VM-Install/6.png | Bin 89262 -> 0 bytes images/VM-Install/7.png | Bin 89173 -> 0 bytes images/VM-Install/8.png | Bin 186757 -> 0 bytes images/VM-Install/9.png | Bin 80571 -> 0 bytes images/freeside.svg | 149 - images/linux-logos.png | Bin 771374 -> 0 bytes images/linux-timeline-17.10.svg | 8649 ------------------------ images/linux-vs-windows-desktop-os.svg | 4 - images/linux-vs-windows-server-os.svg | 4 - index.html | 374 - js/index.mjs | 19 - lantern-build-engine | 1 - package-lock.json | 3176 --------- package.json | 29 - rollup.config.js | 93 - 56 files changed, 2 insertions(+), 14893 deletions(-) delete mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 100644 201/Lab-Sheet.md delete mode 100644 201/images/feedback.svg delete mode 100644 201/images/nginx-default.png delete mode 100644 201/images/puttygen-password.png delete mode 100644 201/images/puttygen-randomness.png delete mode 100644 201/images/puttygen.png delete mode 100644 201/index.html create mode 100644 Freeside_introduction.odp delete mode 100644 Notes.md delete mode 100755 build delete mode 100644 css/lab-sheet.css delete mode 100644 css/theme.css delete mode 100644 images/Logos/alpine.png delete mode 100644 images/Logos/archlinux.png delete mode 100644 images/Logos/debian.png delete mode 100644 images/Logos/devuan.png delete mode 100644 images/Logos/fedora.png delete mode 100644 images/Logos/gentoo.png delete mode 100644 images/Logos/ubuntu.png delete mode 100644 images/QR-Feedback.svg delete mode 100644 images/VM-Install/0.png delete mode 100644 images/VM-Install/1.png delete mode 100644 images/VM-Install/10.png delete mode 100644 images/VM-Install/11.png delete mode 100644 images/VM-Install/12.png delete mode 100644 images/VM-Install/13.png delete mode 100644 images/VM-Install/14.png delete mode 100644 images/VM-Install/15.png delete mode 100644 images/VM-Install/16.png delete mode 100644 images/VM-Install/17.png delete mode 100644 images/VM-Install/18.png delete mode 100644 images/VM-Install/19.png delete mode 100644 images/VM-Install/2.png delete mode 100644 images/VM-Install/20.png delete mode 100644 images/VM-Install/21.png delete mode 100644 images/VM-Install/3.png delete mode 100644 images/VM-Install/4.png delete mode 100644 images/VM-Install/5.png delete mode 100644 images/VM-Install/6.png delete mode 100644 images/VM-Install/7.png delete mode 100644 images/VM-Install/8.png delete mode 100644 images/VM-Install/9.png delete mode 100644 images/freeside.svg delete mode 100644 images/linux-logos.png delete mode 100644 images/linux-timeline-17.10.svg delete mode 100644 images/linux-vs-windows-desktop-os.svg delete mode 100644 images/linux-vs-windows-server-os.svg delete mode 100644 index.html delete mode 100644 js/index.mjs delete mode 160000 lantern-build-engine delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 rollup.config.js diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4951fec..0000000 --- a/.gitignore +++ /dev/null @@ -1,78 +0,0 @@ -dist/ -# ---> Node -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless - -# FuseBox cache -.fusebox/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index ecc03d9..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "lantern-build-engine"] - path = lantern-build-engine - url = https://gitlab.com/sbrl/lantern-build-engine.git diff --git a/201/Lab-Sheet.md b/201/Lab-Sheet.md deleted file mode 100644 index 207487a..0000000 --- a/201/Lab-Sheet.md +++ /dev/null @@ -1,643 +0,0 @@ ---- -title: "Linux 201: Web Server Setup" ---- - - - -## Introduction -Hello, and welcome to Linux 201! This Lab sheet will guide you through setting up a Linux-based web server, and look at a number of other useful aspects of server management and administration along the way. - -If you follow this lab sheet to the end, you should: - - - Understand the process of setting up a web server - - Understand why security is important when setting a web server. - - Have setup a basic web server to serve static files - -If you have any questions, please ask! There should be a number of Freeside Admins experienced with server administration to help you out should you get stuck. - -It is worth mentioning before we begin though that this lab sheet will _not_ be showing you how to do the following: - - - Set up HTTPS - This requires that you have a domain name. - -Despite this, links to some useful tutorials showing you how to do these things will be provided at the end of this lab sheet. In addition, you can always ask on the Freeside Discord or Forums, and we'll be happy to help you out: - - - [Discord](http://discord.freeside.co.uk/) [^discord_invite] - - [Forums](https://forums.freeside.co.uk) [^forums] - Login with your Freeside account (or get one [here](https://profiles.freeside.co.uk/join) [^freeside_account]!) - -[^discord_invite]: -[^forums]: -[^freeside_account]: - -Finally, before we get started, a word on the rationale behind the software we're going to be using in this tutorial. Firstly, Ubuntu Server is the server version of the highly popular Ubuntu Linux distribution - which has _heaps_ of support out there should you run into difficulties in the future after this lab. It's well tested, and great for beginners. - -Secondly, we're going to be using _[Nginx](https://nginx.org/)_ as our web server here. Although most people may be heard of or perhaps even used _Apache_ before, _Nginx_ is the web server of choice here for several reasons: - - - It's much higher performance than Apache - - It's event-based, not thread-based like Apache - which means it can handle more requests faster with a lower overhead - - It's more powerful than Apache - especially when you start getting into the more advanced use-cases. - - It's rapidly becoming (if not already) an industry standard - -In short, skills in _Nginx_ will likely be much more useful in the future - especially when dealing with reverse-proxying to application servers, which will be a topic covered in _Linux 301_. - - -## Getting Started -This workshop will make use of a virtual machine running on the Department on Computer Science's cluster. 1 virtual machine has been allocated per student attending the workshop. To access it, click on the following link: - - - -Note that if you have turned up to the lab without having first filled out the registration form, you won't have access to a virtual machine. This is easily fixed however - simply talk to a Freeside Admin and they will get one allocated for you. - -Once you've got access to your virtual machine, you can begin setting it up by following the instructions below. As it's a server, it won't have a graphical user interface. Instead, you'll be configuring it through the command line, or _terminal_ as it's known in the Linux world. - -The Linux terminal (in this case) is _Bash_, and is very similar to the Windows command prompt, if you have any experience with that. There are a few command differences, but if you have experience with 1 then the other should feel at least somewhat familiar. - -If you don't have command-line experience yet, don't worry! It's all part of the learning process. In short, on a command-line (or terminal), you enter text-based commands to tell the computer what you want it to do. Much like any other programming language, there are patterns and syntax rules - so try to look out for those. For example, things are always space-separated, and the first word is always the name of the command to execute: - -```bash -nano myfile.txt -``` - -The above command launches the _nano_ text editor and tells it to open `myfile.txt`. If you forget the space, like this: - -```bash -nanomyfile.txt -``` - -...then the server is probably going to get rather upset and throw an error: - -``` -nanomyfile.txt: command not found -``` - -Thankfully, the error message in this instance is fairly straight-forward and tells us what went wrong. In other cases the problem might not be so obvious, so don't forget that you can ask any of the Freeside Admins for assistance. - -A good reference for Linux commands can be found here: . - - -## Setting the hostname -The first thing we should do to our server is to give it a unique hostname. On _Ubuntu Server 18.04_, this is fairly easy to do: - -```bash -sudo hostnamectl set-hostname INSERT_HOSTNAME_HERE -``` - -For this workshop, we'll use a standard naming convention. Please set your hostname to be the following: - -``` -linux201-server-XX -``` - -....where XX is the number of your server from the list linked to above. Notice the `sudo` in the command above. It's short for _super-user do_, and tells Linux that you want to run a command as an administrator. You'll have to type your password for this, which is a key security mechanism that's built-in to Linux. If you've been to _Linux 101_, it was explained in more detail there. For the curious, the Linux 101 slide deck can be found here: - - - -You might need to quickly restart your shell for this to take effect: - -```bash -exec bash -``` - -You should now see that the prompt has changed to reflect the new hostname. If not, try rebooting: - -```bash -sudo reboot -``` - - -## Basic Security -`root` is the administrative account of Linux systems. Owing to the extremely broad permissions granted to root accounts, one of the core tenants of Linux security is ensuring each user has their own account. - -This is because root can be used, even accidentally to damage or destroy the system because of its extensive permissions. Having separate accounts, such as "yourusername" also increases accountability and decreases the likelihood of system damage. - -Normally, this is handled by your operating system installer, so you shouldn't need to create a new account manually here. If you'd like to rename the default user account here, this is how you'd do it. - -_This section is optional. If you'd prefer, you can skip this section and move on to the next section, [setting your password](#setting-your-password)._ - -To create a new non-root account, do the following: - -`sudo adduser "yourusername"` - -We should create the new user as root, so don't forget to prefix it with `sudo` (though if you're already logged in as root, there's no need for `sudo`. You can tell if you're logged in as root by the last character in the prompt: if it's a dollar `$` then you're a regular user and need to use `sudo`, if it's a hash `#` then you're the root user). - -Execute the command as above, replacing `"yourusername"` with a desired username. - -During the setup, you may be asked for a password along with other information. You may customise this information as you wish. - -Now that the user has been created, we should ensure that that user can execute commands with escalated permissions - i.e. as the `root` account. These are called `sudo` permissions. These can be assigned to your new account like this: - -`sudo usermod -aG sudo yourusername` - -Execute the command as above, replacing `"yourusername"` with the user you created in the previous step. - -This adds your new user account to the `sudo` group of users on the system, which is a group of users permitted to use the `sudo` command to run commands as other users - including `root`. - -At this point, you should be able to logout and log back in as the new user account you've just created - you should do this now. - -If you're creating a new account to replace the default non-root user account, it's a good idea at this point to delete the old default user account now. This helps keep your VM secure, as fewer user accounts (note: system accounts are a different topic) mean fewer potential entry points for attackers. - -Don't forget also that you should always know _why_ you're typing your password. This is a key security mechanism in Linux: anything that needs administrative privileges should be done through `sudo`, and `sudo` requires your password. If it didn't require your password, then _anything_ running under a user account that has `sudo` privileges would be able to run a command as `root` at any time, which is obviously a bad thing. - -### Setting your password -If you didn't change the default user account that's come with your VM (or even if you did), you should probably change your account password. Leaving your account password as the default is the best way to invite an attacker in to hack your server. - -Thankfully, this is really easy to do. Simply enter the following command: - -```bash -passwd -``` - -It will ask you for your current password, and ten for a new password twice. Once done, try logging out and then back in again to see that your new password has been applied. Note that this will also affect things when you're using `sudo`: you should use your new password instead of the old one, since the password you use with `sudo` is synced with your local user account. - -It's also worth mentioning at this point that storing said password in a secure _password manager_ would be a good idea, rather than writing it down in a text file. Password databases are encrypted with a master password, which is much more secure. Many password managers exist, from [KeePass](https://keepass.info/) to [Firefox Lockwise](https://www.mozilla.org/en-GB/firefox/lockwise/) to [BitWarden](https://bitwarden.com/), and many more. - - -### Securing SSH -At this point if you're still using the physical VMware console, it might be worth signing in to your VM via _SSH_. Standing for _Secure SHell_, it's used by servers and their administrators across the world to talk to one another. TO do this, you'll need the IP address of your server. Get this like so: - -```bash -hostname -I -``` - -Then, open PuTTY **TODO: Finish this** - -If someone manages to get in who isn't supposed to, they could do all kinds of damage! - -The first, and easiest thing we can do it improve security is to prevent the `root` user logging in. We already have a non-root account that we use `sudo` with, so why allow direct access to `root` at all? Open `/etc/ssh/sshd_config` for editing like this: - -```bash -sudo nano /etc/ssh/sshd_config -``` - -This will open the `nano` command-line text editor. Others exist, but they are either not installed by default or more difficult to use. You can navigate with the arrow keys. Find the line that says something like this: - -```config -PermitRootLogin yes -``` - -....and change it to - -```config -PermitRootLogin no -``` - -You may need to uncomment the line by removing the `#` symbol preceding it. - -Once done, restart the ssh server like so: - -```bash -sudo systemctl restart ssh -``` - -Your configuration might be slightly different (e.g. it might be `PermitRootLogin without-password`) - but the principle is the same. This adds an extra barrier to getting into your server, as now attackers must not only guess your password, but your username as well (some won't even bother, and keep trying to login to the `root` account!). - -#### Key-based authentication -So we've created a new user account with a secure password (tip: use a password manager if you have trouble remembering it :-)) and disabled root login. Is there anything else we can do? Turns out there is. - -Passwords are not the only we can authenticate against an SSH server. Public private keypairs can be used too - and are much more secure - and convenient - than passwords if used correctly. They are a pair of files on your computer, which are used when you try to login instead of a password. Without the private key, you can't login. - -The exact way you do this depends on the operating system of the local machine you are using to connect to your server. - -##### For Linux users -_If your **local machine** is a Linux computer, then this is the section for you. If your local machine is a **Windows** computer, then skip this section and move onto the one below entitled "For Windows users"._ - -If you are using Linux on your _local machine_ generate your own public-private keypair like so: - -```bash -mkdir $HOME/.ssh -ssh-keygen -t ed25519 -``` - -It will ask you a few questions, such as a password to encrypt the private key on disk, and where to save it. Once done, we need to tell `ssh` to use the new public-private keypair. This is fairly easy to do, actually (though it took me a while to figure out how!). Simply edit `~/.ssh/config` (or create it if it doesn't exist), and create (or edit) an entry for your ssh server, making it look something like this: - -```config -Host {bobsrockets.com} - Hostname {ip_address} - Port 22 - IdentityFile {path/to/private/keyfile} -``` - -Change `{bobsrockets.com}` to a short name that's easy to remember. You'll be able to SSH into your server later with `ssh short_name`. - -Change `{ip_address}` to match the IP address of your server (or, if you're lucky enough to have a domain name pointed at your server, use that instead). - -It's the `IdentityFile` line that's important - replace `{path/to/private/keyfile}` with the path to your key file (e.g. `~/.ssh/id_ed25519`). - -With `ssh` configured, we can use a handy little utility called `ssh-copy-id` to copy the SSH public key to the server. Do that like this: - -```bash -ssh-copy-id `{username}@{hostname}` -``` - -Where `{username}` is the username of the new user account you created earlier, and `{hostname}` is the short code from before when you editing your `~/.ssh/config` file. - - -##### For Windows users -_If your **local machine** is a Windows computer, then this is the section for you. If your local machine is a **Linux** computer, then skip this section and move onto the one below entitled "For Windows users"._ - -This section will assume that you are using [PuTTY](https://putty.org/) () to connect via SSH to your server. Content in this section is taken from [this DigitalOcean tutorial](https://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/create-with-putty/) [^putty_tutorial]. - - -Start the PuTTYgen program through your Start Menu, or by launching the `puttygen.exe` portable executable. The key generation program looks similar to this: - -![A screenshot of PuTTYgen.](images/puttygen.png) - -_(Above: A screenshot of PuTTYgen. Taken from [this DigitalOcean tutorial](https://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/create-with-putty/) [^putty_tutorial].)_ - -[^putty_tutorial]: - -Set the key type to _ED25519_, and click the generate button. - -You might be prompted to "generate some randomness by moving the mouse over the blank area". This randomness, known as _entropy_, is used to create keys in a secure fashion so that other people can't reproduce them. - -![A screenshot of PuTTYgen generating some randomness.](images/puttygen-randomness.png) - -When the key is generated, you’ll see the public key displayed in a text box. Save this somewhere safe for later. Be sure to scroll within the text area so you copy the entire key. - -Next, you’ll be prompted to enter a passphrase for your SSH key. This improves security by preventing someone who gains access to your private key from using it without also knowing the passphrase. You’ll need to provide your passphrase every time you use this key (unless you use SSH agent software that stores the decrypted key). - -![A screenshot of PuTTYgen asking for a password.](images/puttygen-password.png) - -When you’re done, click the "save private key" button and select a secure location to keep it. You can name your key whatever you’d like, and the extension `.ppk` is automatically added. - -If you have not entered a passphrase, you will be asked to confirm that you want to save the key without one. We strongly recommend using a passphrase, but you can press enter to bypass this prompt. - -Next, you need to tell your server about your new SSH key. This is done by editing the `~/.ssh/authorized_keys` file. The `~/.ssh/` directory might not exist, so we may need to create that too. Do that like this: - -```bash -mkdir ~/.ssh/; -nano ~/.ssh/authorized_keys -``` - -Of course, don't worry about any errors telling you that `~/.ssh/` already exists. Next, paste in your public key that saved earlier into the `nano` text editor. Save it and exit (Ctrl + X, then Y, then Enter), and then ensure it has the correct permissions like so: - -```bash -chown -R username:username ~/.ssh -chmod 0700 ~/.ssh -chmod 0600 ~/.ssh/* -``` - -...replacing `username` with the username of the account you created earlier. - -Now, try opening a new instance of PuTTY and logging into your server with the public key. Before hitting the login button, go to "Connection" -> "SSH" -> "Auth" and select your `.ppk` file. - -If all is well, you should now be logged in with your new public/private keypair. - - -### Setting up a firewall -Firewalls control how data is allowed to travel in and out of your computer. In Ubuntu, a firewall called `ufw`, the 'uncomplicated firewall' is already present. It acts as a nice front-end to `iptables`, which I find to be difficult to understand and use. We will be using that as our firewall. If for some reason it is not installed already, install it like so: - -```bash -sudo apt install ufw -``` - -### Activation - -Ufw, by default, allows all outgoing connections and denies all incoming connections. This means that if you are using ssh to connect to your server, you will need to open the appropriate ports first *before* enabling ufw. Do that like this: - -```bash -sudo ufw allow 22/tcp -``` - -Ufw will automatically configure `iptables` to allow incoming connections on port 22 that use `tcp`. I will talk more about allowing and denying different connections later. - -Just in case ufw blocks your ssh connection and you are unable to get back in, you can use another program called `at` to schedule the disabling of the ufw so that you can get back in again. If you don't have it installed, you can install it with `sudo apt install at`. - -```bash -sudo at -vM now +10 minutes -ufw disable -^D -``` - -Where `^D` stands for `CTRL + D`. Now that you have it set such that ufw will disable itself in 10 minutes time, we go ahead and turn ufw on: - -```bash -sudo ufw enable -``` - - -It will warn you that this may disrupt any existing ssh connections you have open. Reply `yes` to this. Once it have been enabled successfully, you should check that you can still ssh into your server (if that is the method that you are using to control it). If yes, great! If not, ufw will disable itself in 10 minutes and then you can try again. - -Now that we have ufw enabled, we can cancel the `at` job we created to disable ufw. Type `sudo atq` to list the jobs you have schedules, and `sudo atrm ` to remove it, where `` is the number of the jobs that you want to delete. - -You may also want to check the status of ufw to make sure that it is enabled, or to get a list of the rules that are currently in force. You can do that like this: - -```bash -sudo ufw status -``` - -``` -Status: active - -To Action From --- ------ ---- -22/tcp ALLOW Anywhere -22/tcp (v6) ALLOW Anywhere -``` - -#### Allowing connections -Since we're going to be setting up a web server, we'll need to allow it through our new firewall. Doing so is easy. Simply do this: - -```bash -sudo ufw allow 80/tcp -``` - -Ufw will automatically configure iptables, in this example, to allow all connections on port 80 that use TCP. It will also configure it appropriately for both ipv4 and ipv6. - -If you ever want to incoming connections on another port in the future, replace `80` with the port number you want to allow and `tcp` with `udp` if needed. - -Ufw also understands several protocol names, and can configure itself accordingly: - -```bash -sudo ufw allow http -sudo ufw allow imap -``` - - -## Installing a Web Server -With our server secured, we can now install our web server. In this tutorial, we'll be using _[Nginx](https://nginx.org)_. Nginx is very powerful and [much more efficient](https://www.nginx.com/blog/nginx-vs-apache-our-view/) [^nginx_vs_apache] than Apache. This is done with `apt`, Ubuntu's package manager: - -[^nginx_vs_apache]: - -```bash -sudo apt install nginx -``` - -The `apt` package manager manages the software and libraries installed on a Linux computer. Other package managers exist too, which are used in other distributions of Linux (such as _Arch Linux_, _Alpine Linux_, and _Fedora_). The concept is broadly similar to a package manager you might use to manage the dependencies of a program you're writing, such as [NuGet](https://www.nuget.org/) [^nuget] (for .NET) and [NPM](https://www.npmjs.com/) [^npm] (for Javascript). - -[^nuget]: -[^npm]: - -Anyway, with Nginx installed, we should be able to test it out - just as soon as we allow it through our firewall: - -```bash -sudo ufw allow http -``` - -### Testing it out -At this point you should bee able to type the IP address of your server into your web browser and see the default configuration page. You can obtain your server's IP address by using the `hostname` command like so: - -```bash -hostname -I -``` - - - -Another, but less reliable, way of finding your IP address is to use an online service. Such services report back to you your external IP address. If your server is located on a complex network, the IP address such a service reports may not be the local IP address of your server, however. You can utilise a service like this as follows: - -```bash -curl https://icanhazip.com/ -``` - -You might need to install `curl` with `sudo apt install curl`. - -Once you have determined your server's IP address, enter it into your web browser like so: `http://1.2.3.4/` - -You should see a page like this: - -![The default web page that Nginx should serve.](images/nginx-default.png) - -If you don't see something like the above, please ask for help. - -### Customisation -Now that we've got our web server installed, we can customise it to our liking. This is quite easy to do. On Linux, almost everything is driven by configuration files. These are stored in the `/etc` directory - and Nginx is no exception. Nginx stores its configuration files in `/etc/nginx`. There a few important files and directories here: - - -File | Purpose ---------------------------------|--------------------------------- -`/etc/nginx/nginx.conf` | The main configuration file. Global settings are defined here. -`/etc/nginx/sites-available/` | The virtual host configuration files. Put website configuration files here. -`/etc/nginx/sites-enabled/` | The enabled virtual hosts. This directory contains [symbolic links](https://linuxhandbook.com/symbolic-link-linux/) [^symlinks] to the `sites-enabled` directory. - -[^symlinks]: https://linuxhandbook.com/symbolic-link-linux/ - -Nginx, like most web servers, can service multiple web servers at the same time. This is done by using a variety of techniques to determine what domain name you have entered into your address bar (namely the `Host` HTTP header and, in the case, of HTTPS, [Server Name Indication](https://en.wikipedia.org/wiki/Server_Name_Indication) [^sni]). To this end, it supports multiple _virtual hosts_ - which are basically configuration files that tell it which website to serve under which circumstances. - -[^sni]: - -Try looking at some of the different configuration files in the `/etc/nginx` directory to get a feel for how it works - particularly `/etc/nginx/nginx.conf`. - -In our case, we already have a default virtual host created for us. It's located in `/etc/nginx/sites-available/default`. Open it for editing now: - -```bash -sudo nano /etc/nginx/sites-available/default -# or, if you're a `vim` user: -sudo vim /etc/nginx/sites-available/default -``` - -`nano` is usually best for beginners, as it's easier to use. You might see something like this: - -```bash -## -# You should look at the following URL's in order to grasp a solid understanding -# of Nginx configuration files in order to fully unleash the power of Nginx. -# https://www.nginx.com/resources/wiki/start/ -# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ -# https://wiki.debian.org/Nginx/DirectoryStructure -# -# In most cases, administrators will remove this file from sites-enabled/ and -# leave it as reference inside of sites-available where it will continue to be -# updated by the nginx packaging team. -# -# This file will automatically load configuration files provided by other -# applications, such as Drupal or Wordpress. These applications will be made -# available underneath a path with that package name, such as /drupal8. -# -# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. -## - -# Default server configuration -# -server { - listen 80 default_server; - listen [::]:80 default_server; - - # SSL configuration - # - # listen 443 ssl default_server; - # listen [::]:443 ssl default_server; - # - # Note: You should disable gzip for SSL traffic. - # See: https://bugs.debian.org/773332 - # - # Read up on ssl_ciphers to ensure a secure configuration. - # See: https://bugs.debian.org/765782 - # - # Self signed certs generated by the ssl-cert package - # Don't use them in a production server! - # - # include snippets/snakeoil.conf; - - root /var/www/html; - - # Add index.php to the list if you are using PHP - index index.html index.htm index.nginx-debian.html; - - server_name _; - - location / { - # First attempt to serve request as file, then - # as directory, then fall back to displaying a 404. - try_files $uri $uri/ =404; - } - - # pass PHP scripts to FastCGI server - # - #location ~ \.php$ { - # include snippets/fastcgi-php.conf; - # - # # With php-fpm (or other unix sockets): - # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; - # # With php-cgi (or other tcp sockets): - # fastcgi_pass 127.0.0.1:9000; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} -} - - -# Virtual Host configuration for example.com -# -# You can move that to a different file under sites-available/ and symlink that -# to sites-enabled/ to enable it. -# -#server { -# listen 80; -# listen [::]:80; -# -# server_name example.com; -# -# root /var/www/example.com; -# index index.html; -# -# location / { -# try_files $uri $uri/ =404; -# } -#} -``` - -There's a lot of 'stuff' here, so let's break it down. Nginx works on the concept of servers. Each virtual host has it's own `server { }` block in a configuration file inside `/etc/nginx/sites-available`. Lines that start with a hash `#` are comments - and are ignored by Nginx (just like Python and Bash comments). - -The `listen` directives tell Nginx to listen on Ipv4 and IPv6 for requests. - -The `root /var/www/html;` directive tells Nginx where to find the files that it should serve. For our example, let's change this from `/var/www/html` to `/srv/www`. - -The `location { }` blocks allow us to tell Nginx to do specific things for specific subdirectories. They are quite complex, and are out-of-scope of this workshop. However, the default configuration file contains some links that you can use to find out more - and you can always ask on the [Freeside Discord](http://discord.freeside.co.uk/) [^discord_invite] too. - -You may wish to enable [directory listing](https://nginxlibrary.com/enable-directory-listing/) [^dir_listing], so that if Nginx does not find an `index.html` file it will list the contents of the directory instead. You can do this by creating a new line directly below the `root` directory like so: - -[^dir_listing]: - -```nginx -autoindex on; -``` - -Once you've finished editing the file, save and close it with **Ctrl + X**, then **Y**, then **Enter** (if using `nano`), or **Esc** followed by typing `:wq` for `vim`. - -With the configuration file edited, we should restart Nginx. Before we do that though, let's test that configuration file: - -```bash -sudo nginx -t -``` - -If all goes well, Nginx should say something like this: - -``` -nginx: the configuration file /etc/nginx/nginx.conf syntax is ok -nginx: configuration file /etc/nginx/nginx.conf test is successful -``` - -If it doesn't, then go back and check the syntax of the configuration file you edited. You might want to ask for help. - -Before we reload Nginx though, we need to create that new web root directory we decided on earlier. Let's do that now: - -```bash -sudo mkdir /srv/www -sudo chown -R www-data:www-data /srv/www -sudo chmod 0775 /srv/www -``` - -With that in place, you can now reload Nginx like so: - -```bash -sudo systemctl reload nginx -``` - -This will cause Nginx to reload it's configuration files from disk without restarting. Not all services support this, but if they do it's handy to take advantage of it. - -The final step here is to upload some files to your new web server to serve. To do this, we will need to ensure that our user account has permission to write to the new folder. Do tha like this: - -```bash -sudo usermod -a -G www-data YOUR_USERNAME_HERE -``` - -This adds your user account to the `www-data` group. You will need to log out and log back in again at this stage for the change to take effect. - -Actually uploading files can be done using SFTP. Windows users can use [WinSCP Portable](https://winscp.net/eng/docs/portable) [^winscp], while Linux users can use their native file manager (try entering `sftp://username@1.2.3.4/` into your address bar). - -[^winscp]: - -Once you have uploaded some files to your web server, try refreshing your web browser! You should see your new website appear before your eyes. - -## Conclusion -We've looked at setting up a basic Linux web server with Ubuntu Server 18.04 and Nginx. We've done this by first taking some basic steps to secure our server, and then installing and configuring the necessary software. - -This workshop should provide you with a good starting point from which to explore more complex uses for Linux. For example, you could now use your new web server to serve a [personal static website and blog](https://www.staticgen.com/) [^staticgen], or you could take your skills further and learn about containerisation technologies such as [LXD](https://linuxcontainers.org/lxd/) [^lxd] and [Docker](https://www.docker.com/) [^docker]. You could even learn how to deploy your own application to a Linux server using a [system service](https://starbeamrainbowlabs.com/blog/article.php?article=posts/326-systemd-service-files.html) [^system_service] and [syslog](https://starbeamrainbowlabs.com/blog/article.php?article=posts/345-logrotate.html) [^logrotate] - the possibilities are endless! - -[^staticgen]: Static site generator comparison: -[^lxd]: -[^docker]: -[^system_service]: -[^logrotate]: - -Be sure to join the [Freeside Discord](http://discord.freeside.co.uk/) [^discord_invite], where you can learn more about Linux and hang out with other Linux users. - - -## References and Further Reading - - [Linux command reference](https://files.fosswire.com/2007/08/fwunixref.pdf) () - - [Learn your terminal (or command line)](https://starbeamrainbowlabs.com/blog/article.php?article=posts/242-Learn-Your-Terminal.html) () - - [Nginx](https://www.nginx.com/) () - - [How to Secure a Linux Server](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/) () - - [SSL Certificates](https://letsencrypt.org) () - - [How to secure Nginx with Let's Encrypt on Ubuntu Server 18.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04) () - - [Freeside Discord Invite](http://discord.freeside.co.uk/) () - - [Static Site Generators Comparison](https://www.staticgen.com/) () diff --git a/201/images/feedback.svg b/201/images/feedback.svg deleted file mode 100644 index c366d7b..0000000 --- a/201/images/feedback.svg +++ /dev/null @@ -1,532 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/201/images/nginx-default.png b/201/images/nginx-default.png deleted file mode 100644 index f1ef5f7f0be9e68dfafd85fe63bd4dfa195d1411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32610 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 l1pnU?=&Yv~)KE(j_@a3?(29Lw8He42^XE z!+k%`yT0%J*3VkASbNXxy{~F(4FJC zGMKqKQg9nm-!MW6+guln&8oJHyGJ|{n1(ShEp7TF>ioz59>4%9_vlm@1u85)o+q6C z$9IWMW}jfm^`z(|t}C?0of(T)ss}5YYxAafnWQ{abajB+8@Sm0-pbwH(b?_o%Kh!i z%@+SlhYt-aIk&q&(2KZe*a^B>eRNos~sHv@A-%R7qRzmpVUDQbpf*X zF$O8xkiEG$#M_RKkHPehdN;DP(Q#LDhJl;!K{5!_tEH9OrI^Xo702Iy=*P11A(P)M z&w-RMQZRQPd)~3#`*JdB>~__%qwENWNT;rnE8MIgh2L$j@58irkDR~MdblfJ*t4(- zv$)XTY%N-2?iIpp_8kiS@8JGz1IyI$v9iZNTTQ2%n<*XRLIa}=wPG*6n4)7Vo_5t1 ziV2GF`hw8Z-n&FjsM)o?fTE=)qZo@B!+IN407Gq}sk~yvN?FtUw)V;4=Mp$qbUR90uHLD;=Kwq453<(2@d^_DzLzK-m1lQ1P6xSfJ}Ozg5>RptY& z0`PI}Md>XF6yy6=9!V1$8=K+sChHrMA)y*Wip~=ImMD4*&LAYdQGrmRdwcZeIOqOm z+e*7VI|?R7elqpy{1OuoS$y5w+Y1>Jd{qb%z>I|m3Q9Jb*R6>zKx#e?HPzk{NUpv; zU)blJc}DkQXQ|nJrWVZcK7aq1$6j)#qMfQ_s8@8HT5oba60hCw7K(Fj*Js)_e0SRK z)*EeZoN&R$H06%IBC_*0SNcuT6l~L2n527ZrMEnw>G_+};>)hVI?~Vd zAXd=XRad(!>QfU%@zEGiamR;w> zyywd!PR#K1e0lw@-i0M#wQ)EP?@k9plpaJ|58=u69yC9$^8bqjUfR#4dWOq5$9wxPDB9U{B9@@!5o7Gf(2wW z)*N^tIl@>pO$V|Csf69DD#As+4AN|T5e;`>zP7i(L3zcV&zA*HpH~>PvoMrb<-J0A zj{@Q*_5S1@c6IKLa<#quaF`Iv+iZ#c>rI&db*85euJ~{e2tzUSgDd{ym#Kv=*L8Ek zKkpPb+fj6_hX&4smTiYRNMq)bjFCf76h18r@3V8r*&Zgm@YQhtwcjC9wTo?PL?1kA zjku}G5C(f=JMz(tbk4o^JMq9@y{W>aJJEARf!+>2mOmEYZvMB=w#pAFWxqVWkDyhcB2soTRY-f1ve$pa=KAZw!3`4*Cx2p$u5VS-DCuoD03S^2xtp zH&zEZ4i3(2#+EpUh8w!`pLHTYR4#5YLXfZ-|M6S&m$OZ=nBs6r1REM1$ubf9iOXG} z=yrsd%Ww6WdNc~pH$pui4EAqlHIAkcub9O-_s!RiK%ze;*jKu|4L^sxWID^I@e+b91a<{>pYCfC*i~BUL&b z8?0_P;H89q9*xATj?mBe^)prF1;%63}j=QrC02RLZ%Ji~mrr zhyVG`s*rWAE!wX1E}UblKg!-|{;fXfRYp)Ae0quAgw zlTLs9r`6p%+z(w!bNfO&ql`$kc0YSE#+m=;%z+ME4=P_YEJ$f@mG%YG##lN!%TFiA z=5p{eTNLri>{!Kk*zHr3^!*6cM2ZqV5x}P)lG?L4RuL6<4xUvF)feq$-7$yyPO;$< zm3*|d(5r3PqdJ{6!q7FEg?wqx7dnZ+9`VkG>Dgm0v4Vy6F<&JEdjKggv_$nm_gZG& zg-b3_{S6ENCXV4aRP;qB2x}h-eIw%L1prnBcRt?ks$_OwPDMr$qgAB9x(fHGNHX7K zPAz9guadIBqLR<;3PQ{pz6wMXL%+1RHJCx9fXKNx)p6+$4I-4ypJ6f!LoR%v5t&&X zigqcwmD}ykCxBv+6a%cSkyzi1z#_gYK}FlXYw&qvUer3j2&J_>W~74ySnMA3>j_5czv}x=7HtqW zOlM={v;`&ZR=0jch+;NgMQiBcr#LPF-c6i7dG!ecPR8)O+yhw`PdSOJJ6%Wf2jtw>;%Hj<>6BvKg!sl8K80h#Q%H7_wmw%(Z0U`|+;{ODE$-yS!taXc*LR*A{^gnV&?_ zYp&MlCyBWyCjb%3g}JpwU#q|>Wh`)JL8upBnXMi0fq3nF4LQL2{M-C=+CJ|f;9-h- zebif`7*s>HH`;@bPy*qHG-$;7hlwA!=s(mX$_u`>9_lAt?!bZb<8QJC3*D2h-QcfX zC`2xndAt~l7CFIDIwy#|HCbaq!n)6)T2d>U*yCg+@a$A}f>x9Kl zRoaZ0D>wc$54M*GOx5EpOK=oJvhEtd2depasffH1+N*PJTmLkZLHw0}#%CM|>v@rD z7q+VmuXAeTT$0=$sEL)no%3D3dI|mAO=vP-^3f6g1uYOiDJ9BtHT_t3RHbz`1aTvF zK9+%8q+UFHEpPRix{Xu7#QH!;vgF<$_|#hiir61WwLPl^uPY2gIcBA`H8S*OzhE59 zSJofSa!A0PIM!2r!m_eqAv5FS$@!gS2SZzeCZE^nO7;wvr`b(t8hzV}%=&BQn9;%K z-a1Z=*MDe7=}9edC7bx5$h_2UFbP$NmR=(^Jgn;EOPp%Aa=Dm-ezI|GBrfUR>qgr8 z9i^Wkz1hEe#`jx9kh@I%GXsg5@?m}NekWbq%yVLG{Y>36@YuxFxG79!vyzz?(dcDN z4Z(@1&g_bo4(LmAgRWxH7xiLV+!Ak%e#@QfZegtkhp_hES0bKI1e$7tk>w$3F4D9doGKIGxP8&y-g;z)n9jq#K$B5n00W(KEi30Ldph^5p`nH?2N3 z>|6vICw*(p4iK>vhTiO+9(5YM^E{U)e=cYYY&=bW#|&q}AQVH2BC}R&2Fl1}Zm$LO zB-N;-Va!Z{1?v6)W%1`*%~Jb|)RprpbH;x9M~Q6b>uj%n@(bfa+$yQ~^`g?I_wjQf z+lE9hO~<>=W#ETHCHZF8>`4vLDsz1wso5tGxZxCm)e0dXw;ZA;%x+zQ2iLWR1*1*& z6vTVidjJiT<5Jet_~;xc!p-GaenV_dWvNY1GJh8Qc5}#lT-7|z%A{vBvn|c*BxnV^;OQjxOT;3YA0{o;!o5jsNcUOZ@daDLnetZMG9?&n{lYUi)_^QZ zr8m{d1~23#=;Q~=kSu3H1hmD)#%B2!?n_W>j!|jl9&IX`eH#-1b=!{JPlnz~8RK}v z3SpMPm1OfKB$P_0d?6wQNCv_MyW_O)93^YWz^%U3A1p!nibBa|_3Vl-=>!veLYj^R zBy@!HDSkvnT2wv`fi11sF0|4B8lH)c_`WO)&GpA01GjWRw6QC}MB4pnklfoAM>JM0 zKhbxQ^1h|)8Ty;}%xQV6CQiGR(Kd>)hVYnOn^;muboBPLvA>5%5vWUpzFB>^t>>g; zXY48!N7$I)I`Kr&O-SsVJoknx4cT|Ci{BTEGWC${xxOfDOHrvrqm9I@_f%y$vKWRd zHtYOCEYrHK5evcqTV!y`=Ykq7|F;Lhu=x>dL)xECEd}buHVaacVx{?>`=HCX@=&e6 z$KdsV43AX_Q9M~Qp)a9j1UH(}IGKa4W0N0R`){9Tl8%ZtPnRzx(=@-w;&Q&l!!K2H zMU*M0GNp!EeBXW-do`?+Qs`0$zMU=4I!SfiEa)ZVl@u!|S(s;pR)*1*yc$Y-qH#K> zc>fj~P+j9!-pL+0qH{n&psJxUvryov_x}7vmI0b5tHzh<4T2-SzrM-~b_X6ZORZ(4 z2dtjj6FjyRX8^<2(Z9)3WMW0+PvynrMm_h;8Tkio4{Q*)4_OQt;;f$p-i?gMX_@U%SiYgYY?E+q|bJALE0b;XXi1BKb^Zm;&kC@)) z+Z`1)+X%{qdRd%t#A;r#?#nN}4=V2$FAV#b{YbAp=RCKTE0x{5_B%xP=ZmNt)!gHt2XLN10^dZas!%Oz*8 zl)p;1x%h_jps{!qc zD-*t`cnkJ#MT|9RUurA^J-n_f=xp@-r**ElmOljeBQ{wTt67%7`raP zDW&}w+f<_*SW-gced%2kOs*aTK;k=y1df=R(9*Hv7nx1I&1-K`!#w5fWWjoFfJFju`(Xa^+~ttVjDXwaa<;zDu_^CuF^+# zSOq?=V*aXDTkzGuk~2dcP&_;C1F~c1?yA%n;T>c}>WfG}3g1!-)$s#;oTuY?24X+9D{08~YiDNKN%rK!#}ds$ z&mZgjS@1Y2DNbh3g=(W)NwF;YmuA05%pYQnKg^$8PDxw5qxt+lDZ?zf{S zG4c^PkcF|K>nDDeByZ_Ca_{WoJ}$c;pS;8fyfMhS7}}1{&Ymg(K#8X@I}&k3wdS~W z1K(P%O@21h{8*z`QT=h+^P6nz?j+tGj5F)Be-7EyKkQCJkXx@(R}F4JM*mo$+3r@e z4&p}kduindGO5uF8;Zq z6!7RetuaB>8*=X5_7SsC?Ih+MpBGUc%=wGm(G4!Agm_Z^pCv z(0&#i4P4@#H^<>|3BTDZytx1$8&Uzg8!_xbJM`o7- zKRXLrNoUc@ZHPwSGbP3%ccr%@{?d{X;B+Yo?Biw7cbI> zVYc;4+S=8N28fW2UlV9`?7L5Kj{HJ%`cK%sc|mUcV3Mr98ZPYkq)7MtXP#q5QVv@M zJzLj0mLFaZ2CJ^$J?;KOC|18l)p+02;8q}SVUT}iNIXfoJX;DE$Eo2FE9=3-Q&&Hb zhVvoO7(^4F6U+KavWe!-x3($)H`UehxJt#i!q0zQy^CqjRLiU5*E3@$0}e+7zIG_N zd6y!?rQkwHJLUp7;a?VKEFM*JVx6N{^Q1Igv0P#9p=tv z=9fGnc!Y`rkL%I|7??l;2RQMW3RMkunnkyj?Mis^NhP(fh^{`dhHw9DNj=fD&W&h`8vOCt)Xf0)hY?IlsvPJ2=e4}t}f>Jt-9EBL9i~i#-QMVTe(2?9-&@kS}9_O*34-(6U~rm%)^%?EI1NPp`1;l@Hu=mxoqzPL7-M z0^FdmkcWm}rOd0DD2AbrD(rw>_r^Hw{W=XLH%vm$tAz{MCg$#^!gR)byWd4n4X{pI zuaLCJeU9*M(fl|^QfN>q?M@C7CH#C&+92oq#Rq&&l!~gRl4$v)K2(17^8YE!z`4gg zO^h1OoSrLVDF!h!&@YT>h6Dw!_l-Rg@f`S+{reohus}9>K$)PLNWs?E0+*;z7Fq>4 zJCqYiUlq66DCSXhJCaAjX(QOT=MDIyX~q$0VLP5_M{`W{{ETn4^**zzzJPK-K5+sftvp1t1Ee0I?Ui2t<$L<|X-SyeY{&R8P!Jnylsm=0T2B6e?RN zv}~NOX4w1ktWHp_qOO$ci%F>bV{xCjl!;il&nurUM~QD`R3Q?X7|H|qsC^rW=T_WP zvi2srmYZllMo@V>;Kiv;$G5#B=jrb*pWGX!n{7Yg7u6WxZv9M`({!j+W*1*7MYcFH z7k1*m_2!`8D;Md5%t&DrDmHY-dwuB$+C3l6wp|a|Ro7&o<9-3TdDV6K9Ua~&x2GcD z13iJRn-t57#3dLRE?>L;9hL&^D`k~@fNr=Ue#kV;G0-i15ut6xB78Obm>9o3h%E@Cnn}#~(oe)o zD&-^qxy{f1Zg=>KSZiRAen8m$G{6sPIj&hGS`hCQrSPlBy!PUPNP43F86N%_wF*+p zR&FmkA(F+r)OIehJCatuk^PnjiIH$pM)8dW--Of+nVb+%2ucx%X`$>$r+>GmKpK?V{SH%ZoF9V-T&m=fSiQ1+H(2UFB zl^-t_1(^I90wBHNZzsRNit0<1@4YXjlRN)53CM&INqrDfPDfL#Wc8Jj6wP{C>3rVX9RrjNa6si3BF2k)HnZHbZ_%xcU!FYj^DPx~-qZrYD{(WJJ zVK*SXihupl-sw-_yB});08020U-5XPoFHmMV_dZ9WK}yA$-vEd5KMR2wg^JX)BDXK z|FaZ9o_P#WG4JoTr`O}SzEkqLkNo4ZbZBzhz|*9AQhn$=X?bgy?Vc$jaS3$2dH5)_E*trc{v%^ zUQ!$1dE;XGqDBtMdOX7_sLYW5I{1JdQ_DPz)7z+#zVbb=OXAp}+cE!*xJwd(kCE;4 zl|qF7#|m*#oDfUrGg+OSgREfPi1mXFnP;18+qp?e1bQc=tYwp;$Kbsn9mt5x*e8uJ zt?d$JjIZX99gnyP46eaZ&o#uPhbkAHwxy<1j~fqG!@_Un&S9ydW%9?FNrdY5#9_B{ zk`#4Bg^6Te_l?gCc3^F2vPy0n1pf?^IPISM>WIz5-B}( z4i)GtipNR*Y#Frnsw{miYO4Ar$?qXge1`>CAplpA^TYQMK8{fE9o-Evh!KYVKh^Bb zhhi^}jr7C6H$Sl-+HLcS4?2kdY5k&#z{Ya81+PvN(9v^`_r}soj!7VY*%e^R;>f9 zHXaxGPlcG-S6NqorsDPuw-U>e>tf}l&RK@bTI;rJmuyda)Ig#x_BmX zg(MO;ct~HeYP^eM)2xJg7auQM9#gDhf+wKe-Bb)dr=K)BcYU-~+Bn}U9WB4a=WIpe zZt!wJA$^9jcl7e<-jD_EeE!Ve(r)|%;7=^et6JoMfr_JB?zOcAC}wEu%=%DQbE;^6 zbtXu^X>EyE_B>KVbNpWa`dwy8S^AyHrXL19}cYdQn$@)2Xb?7TxZ?ElJ4K0Ke+6=9x9S(Bh71vfe$5Jsi;YbMC2enBqHy&9{|x@0~pw<!7_F9` zrQ7BY4YCt&YkMbTwWJ0~PZY=*&w3kXAqB7h)x=V~IC zukU)60}K%I!&O1->ZX4p(pnBqF3C)tY^MMa7}bfETkI$S&$WQ?tXSv-rWKR~C z$HC%7JRCtZ6;W$rV=eYUo1jvRz8_bjqkmUE(!tmf({gUX_bI3 zMqx6*=EHy>Zx_e3u+*#~Gh~a;a>XDMmANhfcnbLForq^ZVhaHHrB4f1l6gS|CCk!r z*XZsFjXX)p#zXGJB@Zg7kM!V;3wmfr(NZfS7T@qr<{m%@`Oh?3LB%o)Bi@-|uO)0f zoDU{AI!o>02Hd}0u0Rv)B>37EzBo3HJS?xqC(Kc)s2wwWX{IE*(Md)n9w^yZV8@|k zpxV5M~guci*#=oXFHxHC2Df_|e&6@p<1+=)ihsq6lU`9D~h>2eH-O?&qby zgzD-RLhems_-3l0*99)6fC8HCwoN3&mMb{+)Xu=Lh4tHL`S;^P+hivAg;0@%FU@`V z%Tb(vI${rzC@2)ANI=zas}xWNW9PZY+o(G3YZnp}iRSM7Fa3ff94B1uMKBpjFpRa3 z`#6r!REGNB>!VNcle|+MHJGmRqJnvoI-#i*7!x+`#X7il5 zKfieGexiGMaID=XS35PBADb^U1)k2D4nm1zJWqU6%?X$A!9u~JF`4cpcqgYMP}SQq z@$6D!N3m9=KJ9w1c%J(oDe^nwn1Gxtn1);Sscmxn_bMx)US2Gf(7uzE4bkS2+i_5N zoryeoAx-f2V{4?3qUA9Zd9yXVZgyXNe{pwv)5nqZB!c)CaV6_mMTXskY|W`1iT^aN z-lup8rN^^`l`w1?Q5OBv(^k*po@?GDE_so~S=0lQVDWQ{qWzQpT(NEm&xaVq=7vhC zZ|jFO{S65s`BaCi9hj}(sh)|Zyhw(nV;chIUCC~;Vbu9XqMk1lYRh{5UYu&gT0SeA z(9;RWf(I1d%1DFU#7Mgw!{y;eAFt}u7h|{AdSpf~K_D9SS_k3m5bN#nitThQ3yQt> ztUpvc_l|9Ja-H{gCR292SDuEq&Nv8pb2tILMBRKc1+Oo*qN&U>(U-iAL7ZyTg5Xr$ zr0hNbn%lhFaskky?^qh3=pLd1-@srn-g>q`E)Lh2@caNCY}%`}8o_#ey*R^;5g}WsYEZj>3jG@Q>Yx2l&XK0t^&<9OF?i;?j9Q6g1}F zru+Zs&K}|s#7#su8NbBP+}8)_K%}0VwsHU8(0RC7%pakuSMSeR=yy>4`R~WPNGgV{ z(1$KP!p9d-^~>%btWu3}a%K9Sl>!vdC^y2l8!8Otbxc*tMBZgU>{LHh2Uc0*btN!0 zS+PxUkpG2Qvc~FV^Ib}SvRyFS$RS0`I})fndmH2&$s~Y_6ZnD-X{Nk$DDGVYNK` zy$MUf^C-3$tOSE8f7oZ+Sc6B5&-0JfH*E%Mz%}6KP-lRUXxKiwY>%>O6iaq=_8%CU zfuK>tc-Ol&z6>C}EZhh6)2jC@-&P)GXZ#X|AFs?+za>uQ(44La@IPqz%-y7PLj=E! z%MLFI{lVL++cf>xHVXSSY7~XbB)cW4ockWvCzkLLl+C^$VitqoeTGx~!{^4De#(^hYG3<2PZVIri(S zYwx$bF&)b?@Kz8b@lm$@mdSr$q4ca-vq^Z?EWz*@h_UJwY8<#Annav>q4e-6@%kX} z&?y{Jfqxe-Smk~wzAqvFB2%xU(|+6^v%Ov~Z??{J**LLExKGa`3XdJ3q~d^@F+oJu za5DvmT6-Doj{&BgDe}gAPhng&Hy_s`$Td{wn3OdK52=tOkOAX}tsUr16*Bxr2x_Zd zxf}=4guc$?`y>RAvD}&WU5bS%CbOao*K^mSCYu!u$@Sz@k%P}d#+oUzFdDzKoKc1u zQw~Go^Ih8hR*M%O*{!qD#A{xG>>jvY zDM*a{$K27atR6SJ4O+@uK`3Lw6~~(to<8&}N7Dr;f6skD+4n)7_a94v+IYa1>#<`0 z|5(obIgZLHMzLHe9x@DQ!T&=0e^jOq?(v|%MhR@5qog><#Ys^yJ_*d+xBmM<&+yWICZ{emT!UPYLB=zR1@gw-gAytqT!Al_sHMY0dpB zN;KP4lGpb!`>3TINMCeZO?NDeI(JzeVG2^Iucji|)s96ATIvO9a?(|w8(~NjqCj(C zh>|(}ZyoLbC;=a|kN*fEA6W7s)5_JU+*Z90Y45uG2XZLR8!az5zL&Xvh&xc)CKTQM zk8N^7VWQc`%0TPkjYXE(Mo*i0+n>a_lm*AV1dgG}9l-?EVe zo9!oZwFraSol0UZ=>bY(^}maTk8j7GAr^Bl*Y?85`)OBNE0+BPx;TC{hlMG+_)CM@ zMk{=z0Wa-6^Nb64QR9P5T&hp{Y=ZdY*IZPm%vj1qyX*BQ(=4{%Pn4gh*o9{4h!>TA zF7FFH)t8nk4+8J>19wW}*w%?1q{*8kx<0Lhlz(JY1d)^Eqo-0AIW~FNVc|4yhe>Fq zr8UH;NGw`AJI1-b1Q-)$fJts&Wl{U~H~5WVK!z6l#uf;c^~d$M4vI{>+VU!lUV?>i zHSyV>`0YEmf7~fGO$onksPU$oEBpP+PMSrJb?S$e$wwK+^5i+Yg;6JM_xCig7LN2m zzEGn}ldFwrJw_LQwsrg`0<6(>^WU>^o`O|X-~^7qEH}m95l3bOvvX+ULXtyV2ckZj zZfk>#`mHhxb1Mt#uesfw(_=(w&R?6^wP;b2?^0SsJG@PO*YBMJ?iJK9$+ToR=Ulqx z#BgvZP%9_NE}`oDq+DIz@c14JTCle($U602Cy9-9f^Knrd5?K%d!6+}sJC7}CDt;% zW57-i4BCRY)lSVJ*@R&XplnfU_q27EIbWN#fWafHLJ43#-YB`@_`z;JB|g5NCekh$ zxqCSGEyfNGD%ar$=2N#&*3ka?Y+R`no8qZ#*d2SbrcD(eb2 zrXwJmgB_~DJ8ozN%FY_Am|6|&!u@1iDuSeCP-pU+CorM>&JBG8-t>WoH7pCQ zrCdF4|Ay+K`)wSonf$s9>&SnvJ3OY{!rDk`Xd$tjJaq(ccK>BiM*%pldoeF#I>Hc_2yDcjEBog5!83U*EKIr~`Q-?p4&%2`BU&fHpntbjZ^% z_jr!1n9;2DjjEyo%~ZYUup4BeHkTfC@v)aZynJGN5foD&0(+1gHkf-cpnOxn0Yvy3)(!-9b@s)zs?jH#?xMF=j;$425i8vdZPK2HGA5 z+M;KEV+LDmYq^0i3NRD90)Qbznp~W_b*pVRsyJJ7tnDc_f6Rz->`>3U7phlJ=G<=E zJR_*}l&vyj9A%`dJ5(vEAb$_**1$FSrp}dx`+5_#k={Sn{fO6_O z^M=A2Mm>>&fa>|IOENDB*NNsIhjyXbZ6|iZG1Ww3=vt0+{PwmTiiN{rAodr;&{kkM20Hz3{8J?@h^!Fyw{xOkm ziflAqz$G}#*z?f?sOALQb^>1iyzLmf^5*$n#5e%@LWuilhFEjgIN` z3JX=wr^PS}LNHR@{vMim@J0F3fxNS$V_=Re%1$)5WG3W@AHvQAzsmSKCLm;H3z}<^ zw?)f#rh^=8Evx9(Q2|_Ve;V0m7Lh#x9p#uu0_crfR_w^0Ep5&Z(YKe2q+a)N%W5bsnhL0`Rqdv{6Xb93LYho*C9kLfsy}fp?+ALA2ds- zg+IUf#YB?|FItp?i43&_QxP|ZRMy5GmRCZ9+CK{w>P9HI{JS0@l>AXq*=KCjk^1YA zi3u!X*F~$VW~DscIzB)%t~>$3fvCYok1}xrX%Vvska5Bc>2v8IJkiuB1c)4RW0Jr5 zVY#hO=azdsJaO5jA7AL8#OTEf;7BlS1+{(VPjQ!!@4qfS?nk15$1D&&D$A{}7cNn5W0lEZ-=}jp>U-v8_r# z*)^0&=?ViZPlIl@L}WWD@&{zU?mmOB-@@PrJq|krw0rYh*?GG$u!%z3EXWu(x;tma zo(i%ktz!e7C`h6n*rj1-U9PlddBD}7_Ed~gkr$(#qE%$Cw4AzI%3{^05Vat5?=3Ht zL!R@Yeg3m`xD@^MSx7>r*eN4CmCY*$L*i7~<=dzp7oEA7K#m=(XRi7E9pNvY*?hM2 zxiL>D2+X}L1I3MVc+Ki^^X4(o$qI#EeGBXZ9Y(G+aqak+(FswhB#o^ zDi_LGn25FI8w`B7(fDoF1r{kHYfiz7uVv;nn}NE?2lyd#pm9bCc_-w^`~obJG?h=5 zwfO5Y5JXBa3PbET{=VEN@X2f~DCYLGnx^fy2w6v~+q`8yv3vSdO`q$+_?&7N5DH60 z$b`Vu?E7iZVitq|s;QM$nw(U^kv;IIWv?BY_Wm5TT6+AY?O9U~np|W_b2BUrQDnjO z=^RrV!qdoHlfm1G<^^`Se|38i-%erp8Fj5Zc5g5Z4U2Whv+p;bW4T16@OAk`r($h} z{or9?8}a_A?LuQz6%2Hf9Pe2?&KxEYR8uLtM_r>w>)-!`6{>X*yT3iawp?0ifVb{> zL=Rp@WJhbYFIDF_u9+N=_wIP-<#S1R5cCCrzK#p9^5YxCxymvB)x%o%-&8M`8>$AN|BIdQKpUfe|4-QZpA9_l zFAwoQAXnvK1(ryC@n1gqUq!S3bJNcfH+Z2qdgMe-#TwNECIB0dc+G5(249^F*dknPfvonhCBpX_&ZBaWHw~O7}zDJ#6 zlm}krWN%=j5)oSf{0WRnMNAHc*{n-WIjcO~Oj`Vo9|JFZ} z>XN`*0!Bd%q|3T;8|=a1Y#laL5u#6nq7zN_aCFOiT)}ipxfB!RbamQ>kudOMA^m}x zIom3A1QoQ};<4@2iR(!mr~gw_2w?`8fxOk%c@K`(ItmNuP_0;-tJcOladeNOLnYdf zKyfjvhB>KhJeTCZxmclhZo{i%WJ?3eTr6pm1ewnzsxnZ42rAP5uYC01ocjM~A|Iyt zUt6fE!iy?R!2sb!GVQJzg(%b%gV^iABdPT)rI%!Ys^Hz5Unq+@X2ah0{S(sAegKlw z`hP|i*ae#9dYNrC6NP}+rM?@ZgO*D?F%$V3TPZHFGQm@!%8cnIEv?`~PNkAG zh8N~)V?vDYRr~8_-wP4?rIdHt)$2xI3?^^l_ye8o= zcJaN*IHk_6x+Av?sY(NsF)xKFCsL36O^n1v>_3-_{Ox^}c(~hjeobvdf^IK|%-Xj~ zwGT=ks;-Ml|2VddvL#4V5ZvnsRwmzMe?Nh~e^%%MtdG!}#I~SR`2h4b|I(zym-|`; z7j^4RgfJ|S_>qDzrHR8YG-1le^OM-pl=x?M9#tX9L)C9ynljFq7O_5LZYQ8Ka$O9B z-5(!+=lNe>qg@58Qqm#sp>F#55-aFq?D09HFbM<|K4re&)Cs%1hk%w0umJ&ny3fJ>w>!rE_tz`;`|j=6`Lwr)m+cqb z{3|{a|NIm*=zm&n+#0%H^q&i;!S^>K_ct7Oe>mOe`(g4w6ZDZkGnhTmXI!~;1u z{W(!0ckce@?*2Eu{)-|lpnJER-jJpF)whhhz4gr>imH~JM_8{au_|++l`~3=b690x zz@vOiV-X9x+Cpnj4e1=C_lvCHisrkC3&^@eP@reat#BTkPhcKoqXzwbB=ht;xvlWR zP(kapxLERhrv-qim$EX`?>@#{&1H4Ul@3+j@?P=w^h5%#Xz$i&X(Xb*?oaz&Zl<1v z2pE%3SFKDY4rlal06NAcm>R1Z7O{$v5m9s?A+TG73Nsf$u?3O^qAFF#g>?^yq>TWP zVSixn{R+8;1iwmSoGqd@f?)U`Vzl3#RyD`$?{1=AJHg?S!~b&7(f@kkS^e=L{S>*9 zeaFb+0O}FyZN$HML0w>{yvjb2!exbG@OR=by_9KT5CZe&C2S5E=$ne)l;3WT?**@{ z4*W({3+oTb0E0MiD^lvSMQ1vI`wJSOt4NNvZ-~Wr$Q1wMVg4nIiEhSQ>!tODT}(y) z%xNXY8LX5f6-;~?pY}Nwffm-+v9@o)GYi&Ch~S$e?E6@6FT_DU4QDc%T(wkC|Aspa z&Gg8awD)4%Mo=k#R9N4>c_d5p-i3 zqk>eIP*X9gU9RO`NbbbtN79N6nAj~+wf%bO;BKM)R)1!OI_4e`dxtppJ2;2>%ksDn zHvgPkLn2pYRaGsM{D#dFz;QOY#Gz{*$PcY!DgxpCA&sMxUrm1%zh3`I6 zfcofGtFY`XVWl+hqzJ7cDi33${MuZ83aofWgWUpEIAe5R=Go2Vr`)L`T6qlhE0S4SMK3Puqz0@ckg8`fZLi*OvA zZ)m9~T7DXDsH$_U%mTR4S*AqHgZw;wxZBijw{DqgHk9vI%;J`|H^)*hPy7~lhu5!F zM=v=6I@u#S`7T6JEES#xwT->WK|iWJN69O~VARe`ZGK+&McdYkxA)Qde|sPe#>TDj z7R|9aZ)$RnjX=x7B2$@y7rV&_yPAuwRUGh`p*J5R*?EiK5yJ0?m6n#oA(CsY{c`FX+B2_UtgpgrbeCY%vwPp{8lA#IkA zElIilxX8TCvQj;_nNO`^;Ib7L}tcP|~a`3ex+P~Pdpfjl~v7y1@M>E9Kzk9wc6h+^> z?a(gUqne^>7=E@!syqJ{kMgS}S@w~iZ`YRA)mkubD%F?yhJNi@eQ1y(a&drO%^h%t z_E83y>oT$x-+&EfdWw-9bEjCPZ+eW46ppjB408~|SqC^;U^svB))0dKtZwPoPXFrA z8vjX5x_>r0v>Uw^Vugnx(Z80IjCIB!gp7kUsE>92@{cv!*Yf^>TmCk$U6dDCZ)P*)^4auu zs{*&>OF!ELD@)3R9MHad;o%$Joac*Q$W%;S{&88=#B;OHs+9qjoi;Nie&64ZVb(X_OP^lx{ehpkxP7Fx z%!L=g^=}5!H;>Nzd2Z6Rx@lj0E$3B+7rf2NpOoXfm+|-uox1dUz=_+q@RR+T&-dS* z(R|?NQh{AOb2~RTz6EU$g}1#RJ9(-v&O8$e63YY4aDm%sklyl6;1+YzM!z$jmOSgX i|M%l@es2AL`Ob5;jc?`T-GK+EFnGH9xvX8it9X!Uqrvo0)pO2U+5RP1qcp`G#_p2c4wWMn()&& z)XQK#dBX`wlFx*ETlmk$6RUM9^$Gw4?X&Wn?@q%303Db9r}rVD)uExVpL^c-K2<+` z@*B|JaW%ujrMcmVsIgA%vjk&{f?*iI)y_QQcY$yyw8p( zyESFu^9QHX`Wox-MNf8MPRU5$Rk7f;6a}((l(v=5ku9b%+u9iJRC`R?TfnE7n};Xr zN8DK8m#VPnWYhJL^4y&i0@{W3`=)K~#D?yD$8@>y+P0i-uR<|xyb&JGw(hg4O%S(* z(}T#Mke{pUcrHM|CBYY)FV<$qp#g(hhlOsfO&_Z}dqg!zhBbxHf18HGi$L$rgV1Bd z+-e||m0{MY)5n9oy^oU=l+4HOqJxg0JM6%Fct26LHSF-m*R9d5#onI`Nkf-_<@i-= zSnXIc1L=G-QFjJllTXd&Jm-vjk^s<8d!F$7kP86Q`OrT~llcGuAUibB{egybu56W# zer0G}Ic6h=F(@bHR7Cwc67oSIP;B2G*|wZdo<~myRWAkkftMB^hCW|5MYZ45beX^H zSoL>Eer0R;i?bLd9CI|LefbA2j^|Q44tYpA4s)UQuZRrAZocv)ivHaZSN^zo$kHif z?X#4pX<*w4RDqj>GIQ}K4opsYa@K?{9ebqk*;*qT$!=yZt_G@>V|+xDHgYIKwOK;E z!+9efDU%PK(br(fPl{er_eRy40?;#0DLRh>$aa_SyhDy|lRx>Bum2HR_^IaP4*k~L z`z}eaqm_I{<|KADl&H6Ws&biC8p?Cp;unx)Y08vzzJ5W)&0OBHM@voF7K zp9H01jc}dR4eAB^*-4TI4SyE~4TB9DCVF7Hh-S?{mM)6{JVLSAD0)&<9t*d9|9)9LH1Mc@a{Ai#_Ws<-10w1p`c1u%w;W4yfLL2q z#!j*S)`@FunG*iTef*s3$nr^N9dfDu`DC~#PZgm-D8L$#9QCPCc?sawPFbiSdHz|} z^1S!s8VEjYMTI1K?CxpREGAw2CQT}?&urN1$@OPi4D5^IYD!Aw%~-+7W~;T~`Rd^W zlhNHKm)*v>XI{18dM=ggSJw*x$lKRi+4}o?EV{4o*<~vngQ`OLeT>v$#zC_MHeHW& zo%)E74=T3cMT^`xHfvfbnB2#M$Nq*P4{OWa<*V#NZFzcHM;A_m!XlQszGW%FSvU`G za&KixNc+@$@)7$M7O$>W*aHjM{XnvaI}O=WshKFTJJpJK$X^i0f1`sCp-UZnr(t3r zK@M$y<&sj39XZNSK2aU)95#L0=4nSvb~azPE^;$K)iu&SEL$54p31cte-mZ!E|6!9 zugQOL{42iH>>{4fGi4jHvlipJKHT=mtq5fXQX~Ri|;^(!S?u+4$^r1A-N56bEXaq26a)DVGE0;sQJYP zS!_#VqaR_66Rz!&uBHZ+tneH~R{vC0WURk6BF*710q&pu*0tJO6B=rr>5?@huVhIU zTUXzRkW+bK@U9UVlH%b(Ro?bmb{Of-$uECN$=`AuO= z6&iF}1)f_va%a^K!=6t}mJ(+u0YAeqi6Ds!f9>}u&W3G+XvQ`x&+P0b#q(W-6F-Pt zeN`=qwS?x z!~W2UZ+W<9U`(ndeys|W@o)~Ls!6Q;eR%+9Gq7`Zvr zG*N~|J#R#E;@a3AiyIrU+qFRJx;pYeBdAWc3i zU=C4jr7)VPO^J5nC0sP?8x`$Th}HLI1>u1K7lzh?OwOhCnES=s8+n7pEp0BD^k-z) zQ>wRECwT&0m+RF3#?Z}>B3{o;uVO~r0%d|mUTj9d^2^yn6%|y*N(1Y%n~1X9GyvWj zvK?yJ_yKl`0#)aIj|szu1-_$Hb`a~rn%|GDaLr1XddmdmYBn^V*6+5kcVtZNG0%F# zAx+}tv*YF`TXbeZc%_@8o~@5sOWjL7JrSVw3h#KSJcj?4$}z`OKUkk*Mh5B^P<}(I zET9=XdYY$t)Sz%$YE%5IGaxNfZ1r`d(e8R=isf;>4_<7zM(72nM9w<)_lWvrrD#_@ zC02NlmQ7LeOxJ_E34(wCmZ1bOK%+Ef!zPIJB8)hsGO6hLEwI(|Uzv;Pi3>@mf8YqK zV7&_G*dcgqia@g$OS5tXtBo(~goJ6jd~i&?1TitPEE#q;9@F27c62{V|29#a;QU9F z>u*3L2`8KMokh-^hA<*QfIoPDa<@1{#=Xqw)+DzmL#nGHG?<4%#DdkYo0J^ZW?fqA3m(r zsRZS1p<*##ZU9VEb{uoE^5%;2ib;>)@$JBmqQLvzYjmlf8>j1dYS+wtWr2W9S? z^pD)Lz9r+pHi48J!h(gqeU;M4A>7kijAJ3iX+C2=Bs>%>3i5_6cy*-~@Lv?bZrkE4 zzOBr_JibPPqS)P0=3g|+b&Db^-`4o(qjt1&<3q(5duTyl^nl#qB_%L5jey}+ zGyHO}3+;`(uDojCmm|vstM+&lRF$}Sp>Lu%#IvPp+)z9=@dv0!XPu%VPMHKcyY9DN z`Uuy0aEWiLK7zQ-#@7@iO}&}lL|@5vgSu)2CO@gM9@m= z^wS&_p^F}Bz2ybIi7-(0YtE~K=N57W&0L+nok%TqrZCBR`Ao?f}!OSlz5`%BMbG-;9h-H_Y`ZnW2R(8zKNHy zwjpE2mpkNOndqa%bpHEH)sZD{X${6%=Om}GemB2}NtH{s+GJef)uanQ*wnl1`5 zAGL;5(KJ9>+je1oSon;sR+~E8cO2D!)~|mhp^a}KyN(?)IW5kIFg`olCnFv=uFZA9 z zRtHyiQLBV2EoY4(V0zt-6+D0{p9{CkJ)&$fER38Ms*xA2=(@vcvQrom6zGT&I;GyB{Zu#4d)pM;>oTts|V2Ij=t67sN-0DuRL}z~MyC zTz=KtAm8>p#P32atz(0TIumNF)y;dOr^r@<;z8n(X)D}owJOF%W=v|L1Z+&=dYD(A4pp2iRYKB!Hd{NE@y7XXJkX&3ubp diff --git a/201/images/puttygen.png b/201/images/puttygen.png deleted file mode 100644 index 05502549f55c4768677abd1e46ba4753af04a939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12796 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 Zz33MJJn|uV`1Bp1AfqB(CTSAzzW{KH#(Dq% diff --git a/201/index.html b/201/index.html deleted file mode 100644 index f158ac1..0000000 --- a/201/index.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - Linux 101 • Freeside - - -
-
-
-

Linux 201

-
-
-

Structure

-
    -
  • Short introduction
  • -
  • Nginx web server setup!
  • -
-
-
-

Why?

-
-
-
    -
  • 74.44% Windows
  • -
  • 12.22% macOS
  • -
  • 9.51% Other
  • -
  • 1.58% Linux
  • -
-
-

According to statcounter GlobalStats

-
-
-

Why?

-
-
-
    -
  • 69.4% of webservers use a Unix-based OS
  • -
  • 30.6% of webservers use Windows
  • -
-
-

- According to - W3Techs -

-
-
-

Where?

-
    -
  • US Department of Defence
  • - -
  • French Parliament
  • -
  • Amazon - AWS
  • -
  • Android
  • -
-

Sources: 1

-
-
- -
-
-

Setting up a web server

-
-
-

Virtual machines

-
    -
  • We'll be using VMs on the DCS cluster
  • -
  • If you have turned up without filling in the registration form, please say something now
  • -
-
- -
- -
-
-

Summary

-
-
-

Summary

-
    -
  • We've secured a Linux server
  • -
  • We've installed Nginx
  • -
  • We're serving a static website
  • -
-
-
-

Where next?

-
    -
  • Application server setup
  • -
  • Git hosting
  • -
  • Decentralised Instant Messaging
  • -
  • Containerisation
  • -
  • Embedded systems: Raspberry Pi etc.
  • -
  • Self-hosting (kickball/awesome-selfhosted on GitHub)
  • -
-
-
-

Future Workshops

-
    -
  • 301: Deploying your application to a Linux server
  • -
  • Talks
  • -
  • Server administration
  • -
-
- -
-
- - - - - - - diff --git a/Freeside_introduction.odp b/Freeside_introduction.odp new file mode 100644 index 0000000000000000000000000000000000000000..fdb2b22605e9490cf18d7987373341369009ec55 GIT binary patch literal 57452 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 literal 0 HcmV?d00001 diff --git a/Notes.md b/Notes.md deleted file mode 100644 index bd0e41a..0000000 --- a/Notes.md +++ /dev/null @@ -1,17 +0,0 @@ -# Linux 101 - - - Ubuntu installation - - Whilst selecting options - - Which are the right options and why? - - Remember they are first-time Linux users - - Whilst installing: - - File system layout - compare with Windows - - Permissions, sudo, not using root - - After installation: - - Terminal basics - tldr-pages? - - Package management basics - - Mono, compiling a C# program - - MonoDevelop / VS Code? - - At the end - - Where can they go to learn more? - - Freeside plug diff --git a/README.md b/README.md index 5802a33..91cdba9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -# Linux-101 +# Linux and Git 101 by Freeside -> The Linux 101 tutorial resources I've put together. - -## Useful Links - - [Pie Chart Generator](http://ceagon.com/tools/charts) +Original slides by SBRL diff --git a/build b/build deleted file mode 100755 index 07991c3..0000000 --- a/build +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env bash -# Make sure the current directory is the location of this script to simplify matters -cd "$(dirname $(readlink -f $0))"; -################ -### Settings ### -################ - -# The name of this project -project_name="micro-lanterns"; - -# The path to the lantern build engine git submodule -lantern_path="./lantern-build-engine"; - -### -# Custom Settings -### - -# Put any custom settings here. -build_output_folder="./dist"; - -deploy_ssh_user="ci"; -deploy_ssh_host="starbeamrainbowlabs.com"; -deploy_ssh_port="2403"; - -############################################################################### - -# Check out the lantern git submodule if needed -if [ ! -f "${lantern_path}/lantern.sh" ]; then git submodule update --init "${lantern_path}"; fi - -source "${lantern_path}/lantern.sh"; - -if [[ "$#" -lt 1 ]]; then - echo -e "${FBLE}${project_name}${RS} build script"; - echo -e " by Starbeamrainbowlabs"; - echo -e "${LC}Powered by the lantern build engine, v${version}${RS}"; - echo -e ""; - echo -e "${CSECTION}Usage${RS}"; - echo -e " ./build ${CTOKEN}{action}${RS} ${CTOKEN}{action}${RS} ${CTOKEN}{action}${RS} ..."; - echo -e ""; - echo -e "${CSECTION}Available actions${RS}"; - echo -e " ${CACTION}setup${RS} - Perform initial setup"; - echo -e " ${CACTION}main${RS} - Build the slide deck"; - echo -e " ${CACTION}main-watch${RS} - Build the slide deck automatically when something changes"; - echo -e " ${CACTION}slides${RS} - Build the slides HTML"; - echo -e " ${CACTION}js-css${RS} - Build the javascript / css"; - echo -e " ${CACTION}dev-server${RS} - Start a development server"; - echo -e " ${CACTION}dev-server-stop${RS} - Stop the currently running development server"; - echo -e ""; - - exit 1; -fi - -############################################################################### - -task_setup() { - stage_begin "Setting up"; - - check_command git true; - check_command node true; - check_command npm true; - check_command pandoc true; - check_command weasyprint true; - - task_begin "Creating build output directory"; - mkdir -p "${build_output_folder}"; - subtask_end $? "Error: Failed to create build output directory at ${HC}${build_output_folder}${RS}"; - - task_begin "Initialising submodules"; - git submodule update --init; - task_end $? "Error: Failed to initialise submodules"; - - task_begin "Installing dependencies"; - npm install; - task_end $? "Error: Failed to install dependencies"; - - stage_end 0; -} - - -# ██████ ███████ ██ ██ ███████ ███████ ██████ ██ ██ ███████ ██████ -# ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ -# ██ ██ █████ ██ ██ █████ ███████ █████ ██████ ██ ██ █████ ██████ -# ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ -# ██████ ███████ ████ ███████ ███████ ██ ██ ████ ███████ ██ ██ -task_dev-server() { - task_begin "Starting development server"; - php -S [::1]:50678 -t "${build_output_folder}" & - exit_code=$?; - echo $! >/tmp/micro-lantern-dev-server.pid; - task_end $?; # Should be 0 unless php died for some reason - sleep 1; -} - -task_dev-server-stop() { - task_begin "Stopping development server"; - - kill "$(cat /tmp/micro-lantern-dev-server.pid)"; - rm /tmp/micro-lantern-dev-server.pid; - - task_end $?; -} - -task_main-watch() { - set_title "Build Watcher"; - - echo -e "Watching for changes."; - while :; do # : = infinite loop - # Wait for an update - # inotifywait's non-0 exit code forces an exit for some reason :-/ - inotifywait -qr --event modify --format '%:e %f' index.html images css js; - - # Rebuild the client code - spawn a sub-process to avoid the hard exit - # This still doesn't work though, which is *really* annoying - stage_begin "Rebuilding"; - ./build main; - stage_end 0; - done -} - -task_main() { - tasks_run js-css; - - if [ ! -d "${build_output_folder}/201" ]; then - task_begin "Creating 201 output subdirectory"; - mkdir "${build_output_folder}/201"; - task_end "$?"; - fi - - task_begin "Copying html"; - cp index.html "${build_output_folder}"; - cp 201/index.html "${build_output_folder}/201"; - task_end "$?"; - - task_begin "Copying images"; - cp -r images/ "${build_output_folder}"; - mkdir "${build_output_folder}/201/images"; - cp 201/images/feedback.svg "${build_output_folder}/201/images/"; - task_end "$?"; - - task_begin "Rendering lab sheets: markdown -> html [phase 1/3]"; - pandoc 201/Lab-Sheet.md --standalone --output 201/Lab-Sheet.html; - task_end "$?"; - - task_begin "Rendering lab sheets: html -> pdf [phase 2/3]"; - weasyprint 201/Lab-Sheet.html 201/Lab-Sheet.pdf --stylesheet css/lab-sheet.css --format pdf --verbose; - exit_code="$?"; - rm 201/Lab-Sheet.html; - task_end "${exit_code}"; - - task_begin "Rendering lab sheets: archiving [phase 3/3]"; - mv 201/Lab-Sheet.pdf "${build_output_folder}/201"; - task_end "$?"; -} - -task_js-css() { - task_begin "Packaging Javascript & CSS"; - node_modules/rollup/bin/rollup --sourcemap --config rollup.config.js; - task_end $? "Error: rollup packing failed!"; -} - - -# ██████ ██ -# ██ ██ -# ██ ██ -# ██ ██ -# ██████ ██ -task_ci() { - task_begin "Environment Information"; - execute git --version; - execute node --version; - execute npm --version; - task_end $?; - - # Run setup in 'development' mode to get the right dependencies installed - tasks_run setup; - export NODE_ENV=production; - # Run the rest in 'production' mode to create a production build - tasks_run main archive deploy; -} - - -task_archive() { - task_begin "Archiving"; - mv "${build_output_folder}" "Linux101/"; - tar cafv "${ARCHIVE}/slides.tar.bz2" "Linux101/"; - exit_code=$?; - mv "Linux101/" "${build_output_folder}"; - task_end "${exit_code}"; -} - -task_deploy() { - task_begin "Deploying to ${deploy_ssh_host}...."; - if [ "${SSH_KEY_PATH}" == "" ]; then - task_end 1 "Error: Can't find the SSH key as the environment variable SSH_KEY_PATH isn't set."; - fi - - # TODO: If we experience issues, we need to somehow figure out how to recursively delete the contents of the directory before uploading. We may have to install lftp and use that instead - sftp -i "${SSH_KEY_PATH}" -P "${deploy_ssh_port}" -o PasswordAuthentication=no "${deploy_ssh_user}@${deploy_ssh_host}" << SFTPCOMMANDS -put -r ${build_output_folder}/* Linux101 -bye -SFTPCOMMANDS - - task_end $?; -} - - -############################################################################### - -tasks_run $@; diff --git a/css/lab-sheet.css b/css/lab-sheet.css deleted file mode 100644 index 186feac..0000000 --- a/css/lab-sheet.css +++ /dev/null @@ -1,119 +0,0 @@ -/* Base CSS */ - -/* - * This CSS file contains (for me) logical style defaults that are easy to read. - * - * This file is quite often used as a starting point for other projects. - * - * Todo: - *